书籍来源:《CKA/CKAD应试指南:从Docker到Kubernetes完全攻略》
一边学习一边整理读书笔记,并与大家分享,侵权即删,谢谢支持!
附上汇总贴:Kubernetes认证考试自学系列 | 汇总_COCOgsta的博客-CSDN博客
查看当前有多少正在运行的容器。
[root@vms100 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@vms100 ~]#
复制代码
这个命令显示的仅仅是正在运行的容器,如果要查看所有的(正在运行的和没有运行的)容器,需要写命令docker ps -a,这里需要加上-a选项表示所有的。
1.4.1 创建容器
运行一个最简单的容器。
[root@vms100 ~]# docker run hub.c.163.com/library/centos
[root@vms100 ~]#
[root@vms100 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@vms100 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bfa8fa89f288 hub.c.163.com/library/centos "/bin/bash" 7 seconds ago Exited(0)6 seconds ago confident_curie
[root@vms100 ~]#
复制代码
从这里可以看到创建出来了一个容器,容器的ID为bfa8fa89f288容,容器名是随机产生的名字,为confident_curie,所使用的镜像是hub.c.163.com/library/centos,容器里运行的进程为/bin/bash(也就是镜像里CMD指定的)。
docker ps看不到,docker ps -a能看到,且状态为Exited,说明容器是关闭状态。容器运行一瞬间就关闭了,为什么?那下面来了解一下容器的生命期问题。
1.4.2 容器的生命期
我们把容器理解为人的肉体,里面运行的进程理解为人的灵魂。如果人的灵魂宕机了,则肉体也就宕掉了,只有灵魂正常运行,肉体才能正常运行,如图1-11所示。
同理,只有容器里的进程正常运行,容器才能正常运行,容器里的进程挂了,则容器也就挂掉了。因为没有终端的存在,/bin/bash就像执行ls命令一样一下就执行完了,所以容器生命期也就到期了。
删除容器的语法:
docker rm 容器ID/容器名
复制代码
如果删除正在运行的容器,可以使用-f选项:
docker rm -f 容器ID/容器名
复制代码
删除刚才的容器。
[root@vms100 ~]# docker rm bfa8fa89f288
bfa8fa89f288
[root@vms100 ~]#
复制代码
重新创建容器,加上 -i -t选项,可以写作-it或者-i -t,
-t:模拟一个终端。
-i:可以让用户进行交互,否则用户看到一个提示符之后就卡住不动了。
步骤1:创建一个容器。
[root@vms100 ~]# docker run -it hub.c.163.com/library/centos
[root@c81c978cdf1f /]#
[root@c81c978cdf1f /]# exit
[root@vms100 ~]#
复制代码
创建出容器之后自动进入容器里,以通过exit退出容器。
[root@vms100 ~]# docker ps -q #-q选项可以只显示容器id,不会显示太多信息
[root@vms100 ~]# docker ps-a-q
c81c978cdf1f
[root@vms100 ~]#
复制代码
但是,一旦退出容器,容器就不再运行了。
步骤2:删除此容器。
[root@vms100 ~]# docker rm c81c978cdf1f
c81c978cdf1f
[root@vms100 ~]# docker ps -a -q
[root@vms100 ~]#
复制代码
如果希望创建好容器之后不自动进人容器,可以加上-d选项。
步骤3:再次创建一个容器。
[root@vms100 ~]# docker run -dit hub.c.163.com/library/centos
4aa86357a3df164f985a82e358a1961fe50f7be401bb984d006c09e2957f3175
[root@vms100 ~]#
[root@vms100 ~]# docker ps-q
4aa86357a3df
[root@vms100 ~]#
复制代码
因为加了-d选项,所以创建好容器之后并没有自动进入容器里。
[root@vms100 ~]# docker attach 4aa86357a3df
[root@4aa86357a3df /]#
[root@4aa86357a3df /]# exit #再执行exit退出
[root@vms100 ~]# docker ps -q
[root@vms100 ~]# docker ps -a -q
4aa86357a3df
[root@vms100 ~]#
复制代码
可以看到只要退出来容器就会自动关闭。
步骤4:删除此容器。
[root@vms100 ~]# docker rm 4aa86357a3df
4aa86357a3df
[root@vms100 ~]#
复制代码
在运行容器的时候加上--restart=always选项,以解决退出容器自动关闭的问题。
步骤5:创建容器,增加--restart=always选项。
[root@vms100 ~]# docker run -dit --restart=always hub.c.163.com/library/cento
75506e8581955448dfa61f16678d1b364e997fa265947a2ede532c323e501f0e
[root@vms100 ~]# docker ps -q
75506e858195
[root@vms100 ~]#
复制代码
进入到容器并退出。
[root@vms100 ~]# docker attach 75506e858195
[root@75506e858195 /]# exit
exit
[root@vms100 ~]# docker ps-q
75506e858195
[root@vms100 ~]#
复制代码
可以看到容器依然是存活的。
步骤6:删除此容器。
[root@vms100 ~]# docker rm 75506e858195
Error response from daemon: You cannot remove a running container 75506e8581955448dfa61f16678d1b364e997fa265947a2ede532c323e501f0e. Stop the container before attempting removal or use -f
复制代码
因为容器是活跃的,所以无法直接删除,需要加上-f选项。
[root@vms100 ~]#
[root@vms100 ~]# docker rm -f 75506e85819575506e858195
[root@vms100 ~]#
复制代码
每次删除容器的时候都使用容器ID的方式比较麻烦,在创建容器的时候可以使用--name指定容器名。
步骤7:创建容器,使用--name指定容器的名字。
[root@vms100 ~]# docker run -dit --restart=always --name=c1 hub.c.163.com/library/centos
798a43c4f26cda49653c292a4566097a9344c8c20fd00938ce9f5a8do1abdd61
[root@vms100 ~]#
[root@vms100 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
798a43c4f26c hub.c.163.com/library/centos "/bin/bash" 2 seconds ago Up 1second c1
[root@vms100 ~]#
复制代码
这样容器的名字为c1,以后管理起来比较方便,比如切换到容器,然后退出。
[root@vms100 ~]# docker attach c1
[root@798a43c4f26c /]# exit
exit
[root@vms100 ~]#
复制代码
步骤8:删除此容器。
[root@vms100 ~]# docker rm -f c1
c1
[root@vms100 ~]#
[root@vms100 ~]# docker ps -q -a
[root@vms100 ~]#
复制代码
1.4.3 创建临时容器
如果要临时创建一个测试容器,又怕用完忘记删除它,可以加上--rm选项。
创建临时容器。
[root@vms100 ~]# docker run -it --name=c1 --rm hub.c.163.com/library/centos
[root@4067418eebf0 /]#
[root@4067418eebfo /]# exit
exit
[root@vms100 ~]#
复制代码
创建容器时加了--rm,退出容器之后容器会被自动删除。
[root@vms100 ~]# docker ps -a -q
[root@vms100 ~]#
复制代码
可以看到此容器被自动删除了,注意--rm和--restart=always不可以同时使用。
1.4.4 指定容器里运行的命令
前面在创建容器的时候,容器里运行的是什么进程,是由镜像里的CMD指令定义好的,关于如何构建镜像,后面有专门章节详细讲解。如果想自定义容器里运行的进程,可以在创建容器的命令最后面指定,比如:
[root@vms100 ~]# docker run -it --name=c1 --rm hub.c.163.com/library/centos sh
sh-4.2#
sh-4.2#
sh-4.2# exit
exit
[root@vms100 ~]#
复制代码
这里就是以sh方式运行,而不是以bash运行的。
在容器里运行sleep 10。
[root@vms100 ~]# docker run -it --name=c1 --rm hub.c.163.com/library/centos sleep
[root@vms100 ~]#
复制代码
容器里运行的命令是sleep 10,10s之后命令结束,则容器也会关闭,此时容器的生命期也就是10s。
1.4.5 创建容器的时候使用变量
在利用一些镜像创建容器的时候需要传递变量,比如使用mysql的像,wordpress的镜像创建容器时,都需要通过变量来指定一些必备的信息。需要变量的话用-e来指定,可以多次使用-e来指定多个变量。
创建一个容器c1,里面传递两个变量。
[root@vms100 ~]# docker run -it --name=c1 --rm -e aa=123 -e bb=456 hub.c.163.com/library/centos
[root@13a417ebc9c3 /]#
[root@13a417ebc9c3 /]# echo $aa
123
[root@13a417ebc9c3 /]# echo $bb
456
[root@13a417ebc9c3 /]# exit
exit
[root@vms100 ~]#
复制代码
在创建容器的时候,通过-e指定了2个变量aa和bb,进入容器可以看到具有这两个变量。
1.4.6 把容器端口映射到物理机
外部主机(即本机之外的其他主机)是不能和容器进行通信的,如果希望外部主机能访问到容器的内容,就需要使用-p把容器的端口映射到物理机上,以后访问物理机对应的端口就可以访问到容器了,如图1-12所示。
语法:
-p N:物理机随机生成一个端口映射到容器的端口N上。
-p M:N:把容器的端口N映射到物理机指定的端口M上。
步骤1:创建一个容器,把容器端口80映射到物理机的一个随机端口。
[root@vms100 ~]# docker run -d --name=web --restart=always -p 80 docker.io/nginx
d267651019fdf1475d444cd43b01826958b4a5fb691024567bb7991d4a606339
[root@vms100 ~]#
复制代码
这里把容器web的80端口映射到物理机的随机端口,这个端口号可以通过如下命令查询。
[root@vms100 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d207651019fd docker.io/nginx "nginx -g 'daemon ..." 42 seconds ago Up 42 seconds 0.0.0.0:32770->80/tcp web
[root@vms100 ~]#
复制代码
可以看到映射到物理机的端口32770上了,访问物理机的端口32770,即可访问到web容器,如图1-13所示。
自行删除此容器:docker rm -f web。
如果想映射到物理机指定的端口,请使用如下命令。
[root@vms100 ~]# docker run -d --name=web --restart=always -p 88:80 docker.io/nginx
305500d7b5008f7a41de5c6415991b2788a932e744c74d3ba5cb0f71b1a5fb31
[root@vms100 ~]#
复制代码
此处把容器的端口80映射到物理机的88端口(可以自行指定端口,比如80),那么访问物理机的端口88即可访问到web容器的端口80,如图1-14所示。