docker优点
- 更快速交付部署
- 更便捷的升级和扩容缩容
- 更简单的系统运维
更高效的计算资源利用
docker组成
- client客户端
- 镜像生成容器 镜像好比一个模板
- 容器container docker利用容器技术,独立运行一组应用,通过镜像创建
- 仓库repository 仓库是存放镜像的,分共有仓库和私有仓库
linux docker
- uname -r 系统内核信息
- docker version 查看docker版本信息
- docker info 查看docker系统信息
- docker 命令 --hele 帮助信息。 eg:docker run --help
- docker images 查看本机所有镜像列表
- -a 列出所以
- -f 格式化
- -q 只显示镜像id
- docker search 搜索镜像
- --filter 过滤条件,使用方式看下面code
code
➜ ~ docker search mysql --filter=STARS=5000 NAME DESCRIPTION STARS OFFICIAL AUTOMATED mysql MySQL is a widely used, open-source relation… 10917 [OK]
docker pull 下载镜像。
- eg: docker pulll mysql[:TAG] TAG表示版本号,可选默认latest
# 由于本地已经安装,返回如下信息 ➜ ~ docker pull mysql:5.7 5.7: Pulling from library/mysql Digest: sha256:a682e3c78fc5bd941e9db080b4796c75f69a28a8cad65677c23f7a9f18ba21fa Status: Image is up to date for mysql:5.7 docker.io/library/mysql:5.7
docker rmi 删除镜像。eg docker rmi 镜像ID或者名称
- -f 强制删除
# 普通删除,有运行中的MySQL5.7容器会报错不让删除 ➜ ~ docker rmi mysql:5.7 # 强制删除<少用> ➜ ~ docker rmi -f mysql:5.7 #删除所有镜像<少用> ➜ ~ docker rmi -f $(docker images -qa)
docker run 使用镜像生成容器
- --name 指定容器名字
- -d 后台运行
- -it 使用交互方式运行
- -p 执行端口
- -P 随机指定端口
- docker run -p 特别说明
- -p 容器端口(不对外访问)
- -p 宿主机端口:容器端口(常用,对外访问)
- -p ip:宿主机端口:容器端口
- code 请手敲实例
# 启动并进入容器
➜ ~ docker run -it centos /bin/bash
# 退出容器
[root@c540d3ba3402 /]# exit
exit
# 此时无运行中的容器,原因在于没加-d
➜ ~ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
➜ ~
docker run 过程
docker ps 查看当前正在运行的容器
- -a 查看全部容器包括曾经运行的
- -n=? 显示最近几个创建的容器
-q 只显示容器的ID
docker rm 容器ID,不可以删除运行中的容器加-f可强制删除
- -f 强制删除
# 强制删除所有容器
docker rm -f $(docker ps -qa)
exit 退出容器。command+q+p在win行在Mac不行,mac中command+q是退出的意思
容器启动和停止
- docker start 容器id
- docker stop 容器id
- docker restart 容器id
- docker kill 容器id 强制删除
docker logs 容器id 查看日志
- docker logs
- -ft 格式和时间戳
- --tail 指定显示行数
- code
# 此处是容器内日志记录
➜ ~ docker logs -f -t --tail=100 ec541aeb7188
2021-05-27T03:33:47.291293040Z /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
2021-05-27T03:33:47.291339292Z /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
2021-05-27T03:33:47.292302613Z /docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
2021-05-27T03:33:47.295570523Z 10-listen-on-ipv6-by-default.sh: info: /etc/nginx/conf.d/default.conf is not a file or does not exist
2021-05-27T03:33:47.297453674Z /docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
2021-05-27T03:33:47.305607832Z /docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
2021-05-27T03:33:47.308121066Z /docker-entrypoint.sh: Configuration complete; ready for start up
2021-05-27T03:33:47.313641771Z 2021/05/27 03:33:47 [emerg] 1#1: open() "/etc/nginx/nginx.conf" failed (2: No such file or directory)
2021-05-27T03:33:47.313673756Z nginx: [emerg] open() "/etc/nginx/nginx.conf" failed (2: No such file or directory)
查看容器内进程信息
docker top 容器id
➜ ~ docker top 38497d83ef06 UID PID PPID C STIME TTY TIME CMD root 2020 1994 0 03:56 ? 00:00:00 nginx: master process nginx -g daemon off; uuidd 2073 2020 0 03:56 ? 00:00:00 nginx: worker process
查看容器整体的信息
docker inspect 容器id
➜ ~ docker inspect 38497d83ef06 [ { "Id": "38497d83ef06bac45fcdee58c7031173d96b5de0bb3b55a7c35b02e12b3b58f2", "Created": "2021-05-26T09:23:46.580435747Z", "Path": "/docker-entrypoint.sh", "Args": [ "nginx", "-g", "daemon off;" ], "State": { "Status": "running", "Running": true, "Paused": false, "Restarting": false, "OOMKilled": false, "Dead": false, "Pid": 2020, "ExitCode": 0, "Error": "", "StartedAt": "2021-05-27T03:56:59.828700511Z", "FinishedAt": "2021-05-26T09:57:15.10854176Z" }, ........
进入当前正在运行的容器
- docker exec -it 容器id /bin/bash
docekr attach 容器id
# exec进入 ➜ ~ docker exec -it 38497d83ef06 /bin/bash root@38497d83ef06:/# # attach进入 。Mac下执行该命令有问题 ➜ ~ docker attach 38497d83ef06
区别:exec调用新终端,attach进入正在执行的终端
从容器内copy文件到宿主机上
- docker cp 容器id:容器内路径 宿主机目的路径
在docker容器停止也不影响复制
# 复制文件 ➜ ~ docker cp 38497d83ef06:/etc/nginx /Users/dada/Downloads/docker-centos/nginx/conf ➜ ~
练习1 安装NGINX
# 搜索NGINX ➜ ~ docker search nginx NAME DESCRIPTION STARS OFFICIAL AUTOMATED nginx Official build of Nginx. 14925 [OK] jwilder/nginx-proxy Automated Nginx reverse proxy for docker con… 2031 [OK] ....... # 下载NGINX镜像 ➜ ~ docker pull nginx Using default tag: latest latest: Pulling from library/nginx 69692152171a: Already exists 30afc0b18f67: Pull complete 596b1d696923: Pull complete febe5bd23e98: Pull complete 8283eee92e2f: Waiting ......... # 查看镜像 ➜ ~ docker images | grep nginx nginx latest f0b8a9a54136 2 weeks ago 133MB # 启动容器 ➜ ~ docker run -it -d --name nginx08 -p 8080:80 nginx:latest 77953516c7f1930f4b6660cc487009a2fdba11767937797c2db2c1b4686b7e35 # 查看一下 ➜ ~ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 77953516c7f1 nginx:latest "/docker-entrypoint.…" 4 seconds ago Up 2 seconds 0.0.0.0:8080->80/tcp, :::8080->80/tcp nginx08 # 检查启动是否成功,也可以使用浏览器查看 ➜ ~ curl http://127.0.0.1:8080 <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> ....... # 进入容器 ➜ ~ docker exec -it 77953516c7f1 /bin/bash root@77953516c7f1:/# exit
配置文件和项目目录需要怎么处理?(-v volume)
练习2 Tomcat配置
➜ ~ docker search tomcat
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
tomcat Apache Tomcat is an open source implementati… 3036 [OK]
.......
# 下载Tomcat镜像
➜ ~ docker pull tomcat
Using default tag: latest
latest: Pulling from library/tomcat
Digest: sha256:10842dab06b5e52233ad977d4689522d4fbaa9c21e6df387d7a530e02316fb45
Status: Image is up to date for tomcat:latest
docker.io/library/tomcat:latest
# 查看本地的tomcat镜像
➜ ~ docker images |grep tomcat
tomcat 9.0 c43a65faae57 13 days ago 667MB
tomcat latest c43a65faae57 13 days ago 667MB
# 启动容器
➜ ~ docker run -d -p 8081:8080 --name tomcat05 tomcat:latest
ed03ac03c1617ed79b9a2ea491535529659416551a24e3a665f0119a7f137af0
# 访问测试 报错404,由于webapps中文件夹空,需要复制一下
➜ ~ curl http://127.0.0.1:8081
<!doctype html><html lang="en"><head><title>HTTP Status 404 – Not Found</title><style type="text/css">body
......
#查看容器列表
➜ ~ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ed03ac03c161 tomcat:latest "catalina.sh run" 50 seconds ago Up 48 seconds 0.0.0.0:8081->8080/tcp, :::8081->8080/tcp tomcat05
# 进入容器并进行赋值文件
➜ ~ docker exec -it ed03ac03c161 /bin/bash
root@ed03ac03c161:/usr/local/tomcat# ls
BUILDING.txt CONTRIBUTING.md LICENSE NOTICE README.md RELEASE-NOTES RUNNING.txt bin conf lib logs native-jni-lib temp webapps webapps.dist work
root@ed03ac03c161:/usr/local/tomcat# cp -r webapps.dist/* webapps
root@ed03ac03c161:/usr/local/tomcat# exit
exit
# 再次访问地址,返回正常200。也可以
➜ ~ curl http://127.0.0.1:8081
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>Apache Tomcat/9.0.46</title>
<link href="favicon.ico" rel="icon" type="image/x-icon" />
<link href="tomcat.css" rel="stylesheet" type="text/css" />
</head>
........
同样文件目录和配置文件需要进入容器修改比较麻烦,后面学习volume就可以解决
练习3 docker可视化
- 练习一下,不推荐使用
- portainer
此处的例子我直接run,docker会自动下载镜像并启动
# 启动portainer ➜ ~ docker run -d -p 8082:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer Unable to find image 'portainer/portainer:latest' locally latest: Pulling from portainer/portainer 94cfa856b2b1: Downloading 49d59ee0881a: Waiting a2300fd28637: Waiting latest: Pulling from portainer/portainer 94cfa856b2b1: Pull complete 49d59ee0881a: Pull complete a2300fd28637: Pull complete Digest: sha256:fb45b43738646048a0a0cc74fcee2865b69efde857e710126084ee5de9be0f3f Status: Downloaded newer image for portainer/portainer:latest a5b72d5c2714e44b81143d71a6ba3c4becc1e0d4dc422ecac4c6088a87e813f4 浏览器中访问 http://127.0.0.1:8082 进行登录注册即可,选择local docker进行管理
如何得到镜像
- 从远端hub下载,docker pull
- 从朋友处copy
自己制作一个镜像image。 commit或者dockerfile方式
UnionFS(联合文件系统)
docker文件是分layer的,一层一层的。
bootfs (boot file system)引导加载的,加载完成会删除
rootfs(root file system)指的是各种操作系统,乌班图,centos等docker镜像只读
docker镜像只读,当容器启动时,一个新的可以容器层被加载到镜像层顶部。如图
容器层 | |
---|---|
镜像层 |
commit镜像
- docker commit 提交容器成为一个副本(镜像)
docker commit -m="提交描述" -a="作者信息" 容器id 镜像名称:[TAG]
TAG为版本号可选 - 站在岸上学不会游泳,请手敲例子
- code
# 启动Tomcat
➜ ~ docker run -it -d -p 8080:8080 --name tomcat04 tomcat:9.0
#获取运行中容器列表
➜ ~ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d5e936f9fe5d tomcat:9.0 "catalina.sh run" 2 minutes ago Up 10 seconds 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp tomcat04
#此时访问
➜ ~ curl http:127.0.0.1:8080
返回404
#进入容器
➜ ~ docker exec -it d5e936f9fe5d /bin/bash
#进行文件复制webapps.dist to webapps
➜ ~ cp -r webapps.dist/* webapps
#再次访问
➜ ~ curl http:127.0.0.1:8080
返回OK
#commit生成镜像
➜ ~ docker commit -a="smallForest" -m="add webapps files" d5e936f9fe5d tomcat04:1.0
#查看所有镜像列表
➜ ~ docker images |grep tomcat
tomcat04 1.0 6961daa4ae47 12 seconds ago 672MB
tomcat 9.0 c43a65faae57 12 days ago 667MB
tomcat latest c43a65faae57 12 days ago 667MB
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。