目录
1.1 docker镜像
1. 什么是docker镜像?
docker镜像不包含Linux内核而有精简的Linux操作系统
-
-
-
我么安装操作系统ISO就可以理解为用C语言写的安装包(例如,微信安装包)
-
我们安装操作系统就好像我们安装微信一样
-
docker镜像也像ISO安装包,但是因为操作系统已将安装Linux内核,所以安装包可以直接使用
( 这个安装包只有Linux文件系统,而内核直接使用Linux系统本身就行)
-
docker 镜像是docker容器的静态视角,docker容器是docker镜像的运行状态
-
-
-
docker镜像--->程序(存储在硬盘里的代码)
-
进程-----> 把我们硬盘里的代码加载到内存运行
-
容器是docker镜像的引用,如何docker镜像删除,次镜像创建的容器也会失效
2.容器读写层(本质)
1. 容器其实是在镜像的最上面加了一层读写层,在运行容器里文件改动时,会先从镜像里要写的文件复制到容器自己的文件系统中(读写层)。
2. 如果容器删除了,最上面的读写层也就删除了,改动也就丢失了。
3. 所以无论多少个容器共享一个镜像,所做的写操作都是从镜像的文件系统中复制过来操作的,并不会修改镜像的源文件
4. 若想持久化这些改动,可以通过docker commit 将容器保存成一个新镜像
3.查看docker容器的工作目录
1 [root@linux-node4 diff]# docker run -itd --name=web1 -p 192.168.56.14:81:80 nginx:latest 2 [root@linux-node4 diff]# docker inspect web1 3 [ 4 { 5 # 存储驱动 6 "GraphDriver": { 7 "Data": { 8 "LowerDir": "/var/lib/docker/overlay2/51692869029f819494bb402dc70aa2869b8d1848c3b65c549a010a260e44cc13-init/diff:/var/lib/docker/overlay2/09fa1314e484781dfc1fb25a6cf5df2502fe35dea9025a373a3cb0202732ccce/diff:/var/lib/docker/overlay2/162ec5c9be56e5d718011c09ed087eda04b755e1a68bd1953c60f175e6635e68/diff:/var/lib/docker/overlay2/7c1b27ff59a397ae7d6bd106db579e90476f57bb1ecef9fcb1a6f1ad5ce43b7c/diff", 9 "MergedDir": "/var/lib/docker/overlay2/51692869029f819494bb402dc70aa2869b8d1848c3b65c549a010a260e44cc13/merged", 10 "UpperDir": "/var/lib/docker/overlay2/51692869029f819494bb402dc70aa2869b8d1848c3b65c549a010a260e44cc13/diff", 11 "WorkDir": "/var/lib/docker/overlay2/51692869029f819494bb402dc70aa2869b8d1848c3b65c549a010a260e44cc13/work" 12 }, 13 "Name": "overlay2" 14 }, 15 "NetworkSettings": { 16 "Ports": { 17 "80/tcp": [ 18 { 19 "HostIp": "192.168.56.14", 20 "HostPort": "81" 21 } 22 ] 23 }, 24 "MacAddress": "02:42:ac:11:00:02", 25 "Networks": { 26 "bridge": { 27 "Gateway": "172.17.0.1", 28 "IPAddress": "172.17.0.2", 29 "IPPrefixLen": 16, 30 } 31 } 32 } 33 } 34 ] 35 [root@linux-node4 diff]# cd /var/lib/docker/overlay2/51692869029f819494bb402dc70aa2869b8d1848c3b65c549a010a260e44cc13 36 [root@linux-node4 51692869029f819494bb402dc70aa2869b8d1848c3b65c549a010a260e44cc13]# ll # 查看docker工作目录都哪些内容 37 diff link lower merged work 38 diff # 读写层的差异(在读写层做的操作由这个容器单独管理) 39 merged # 引用docker进行中的文件系统 40 work # 项目工作目录
1.2 常用命令
1. docker 普通命令
1 docker ps # 仅列出当前运行的容器 2 docker ps -l # 列出最新创建得容器 3 docker ps -a # 列出素有容器(包括 未运行的) 4 docker inspect web4 # 列出指定容器的详细信息 5 6 #### 持久化容器 7 8 docker exec -it web4 bash # 进入容器web4中 9 touch 1.txt 2.txt # 对容器进行修改 10 docker commit web4 nginx:web4 # 将修改后的web4容器提交为一个新镜像 nginx:web4 11 docker images # 可以看到 多了一个 TAG标记为 web4 的镜像 12 docker run -d --name web4-1 nginx:web4 # 使用刚刚提交的镜像web4创建一个容器web4-1 13 docker exec -it web4-1 bash # 进入web4-1的bash环境 14 15 #### 从宿主机复制文件到docker容器 16 docker cp nginx.tar web4-1:/home # 将宿主机nginx.tar文件拷贝到容器web4-1的/home目录中 17 docker exec -it web4-1 ls /home # 在容器web4-1中执行 "ls /home" 命令 18 19 #### 容器常用查询命令 20 docker logs web4-1 # 查看web4-1中控制台日志 21 docker port 55f870061ed9 # 查看指定容器端口映射 22 docker top 00f7ddc96622 # 查看容器中有哪些进程 23 docker stats 00f7ddc96622 # 查看容器资源使用情况 24 25 ##### 启动、停止、删除 容器 26 docker ps -a # 列出素有容器(包括 未运行的) 27 docker start web # 启动容器web 28 docker stop web # 停止容器web 29 docker rm web # 删除容器web
2. 镜像常用命令
1 [root@linux-node4 diff]# docker help # 查看docker帮助 2 [root@linux-node4 diff]# docker image --help # 查看 docker中 镜像相关帮助 3 [root@linux-node4 diff]# docker image ls # 查看当前所有镜像 4 [root@linux-node4 diff]# docker image inspect nginx # 查看指定镜像(nginx镜像)详细信息 5 [root@linux-node4 diff]# docker pull nginx:1.14 # 下载指定版本镜像 nginx 6 [root@linux-node4 diff]# docker image rm nginx:1.14 # 删除nginx 1.14版本 7 [root@linux-node4 diff]# docker image save nginx > nginx.tar # 导出niginx镜像
1 -d # 后台运行容器,并返回容器ID; 2 -i # 以交互模式运行容器,通常与 -t 同时使用; 3 -t # 为容器重新分配一个伪输入终端,通常与 -i 同时使用; 4 -P # 随机端口映射,容器内部端口随机映射到主机的高端口 5 -p # 指定端口映射,格式为:主机(宿主)端口:容器端口 6 --name="nginx-lb" # 为容器指定一个名称; 7 --dns 8.8.8.8 # 指定容器使用的DNS服务器,默认和宿主一致; 8 9 docker run 常用参数
1 --dns-search example.com: 指定容器DNS搜索域名,默认和宿主一致; 2 3 -h "mars": 指定容器的hostname; 4 5 -e username="ritchie": 设置环境变量; 6 7 --env-file=[]: 从指定文件读入环境变量; 8 9 --cpuset="0-2" or --cpuset="0,1,2": 绑定容器到指定CPU运行; 10 11 -m :设置容器使用内存最大值; 12 13 --net="bridge": 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型; 14 15 --link=[]: 添加链接到另一个容器; 16 17 --expose=[]: 开放一个端口或一组端口; 18 19 --volume , -v: 绑定一个卷 20 21 -a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项; 22 23 docker run其他参数
3. 运行容器常用命令
[root@linux-node4 ]# docker run --help # 查看创建容器帮助 [root@linux-node4 ]# docker run -it centos # 创建centos镜像并进入终端 [root@linux-node4 ]# docker run -d nginx # 后台启动nginx容器 [root@linux-node4 ]# docker stop 6bb09dce461f # 关闭一个容器 [root@linux-node4 ]# docker ps -l # 查看最近运行的容器 [root@linux-node4 ]# docker run -itd centos # 启用一个伪终端守护centos容器 [root@linux-node4 ]# docker container run -d --name web3 -e test=123456 -p 8800:80 -h webhostname --restart always nginx -d # 后台启动nginx容器 --name web3 # 自定义容器名字(默认会是一段随机字符串) -e test=123456 # 启动容器添加变量 test=123456 (echo $test) -p 8800:80 # 宿主机的8800端口映射到docker容器的80端口中 -h webhostname # docker容器主机名 (a300f394af88) --restart always # 宿主机重启自动拉起这个docker容器 nginx # 使用这个nginx镜像启动容器 注:http://192.168.56.12:8800/ 访问这个docker nginx [root@linux-node4 ]# docker logs web # 查看上面启动的web容器的日志 [root@linux-node4 ]# docker exec -it web bash # 进入容器web
1 [root@linux-node1 /]# docker run -itd nginx # 在后台启动一个docker容器 2 [root@linux-node1 /]# docker inspect 5a3ad030a621 # 查看docker运行容器的详细信息 3 [root@linux-node1 /]# curl http://172.17.0.2 # 4 [root@linux-node1 /]# docker run -itd --name=web2 -p 192.168.56.11:8800:80 nginx 5 使用--itd参数(指定后台启动这个容器),--name=web2(指定这个web容器的名字叫web2) 6 7 8 -d: 后台运行容器,并返回容器ID; 9 -i: 以交互模式运行容器,通常与 -t 同时使用; 10 -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用; 11 -P: 随机端口映射,容器内部端口随机映射到主机的高端口 12 -p: 指定端口映射,格式为:主机(宿主)端口:容器端口 13 --name="nginx-lb": 为容器指定一个名称 14 --dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致; 15 [root@linux-node1 /]# docker exec -it c9b7a480ee68 bash # 进入docker环境