书籍来源:《CKA/CKAD应试指南:从Docker到Kubernetes完全攻略》
一边学习一边整理老师的课程内容及实验笔记,并与大家分享,侵权即删,谢谢支持!
附上汇总贴:CKA备考实验 | 汇总_热爱编程的通信人的博客-CSDN博客
容器就是镜像在物理机运行的一个实例,大家把容器理解为一个气球,气球里运行了一个进程。这个进程透过气球吸收物理机的内存和CPU资源。
查看当前有多少正在运行的容器。
##########实操验证##########
[root@vms100 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@vms100 ~]#
这个命令显示的仅仅是正在运行的容器,如果要查看所有的(正在运行的和没有运行的)容器,需要写命令docker ps -a,这里需要加上-a选项表示所有的。
创建容器
运行一个最简单的容器。
##########实操验证##########
[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
a8eb4d9d5805 hub.c.163.com/library/centos "/bin/bash" 11 seconds ago Exited (0) 10 seconds ago blissful_almeida
[root@vms100 ~]#
从这里可以看到创建出来了一个容器,容器的ID为a8eb4d9d5805,容器名是随机产生的名字,为confident_curie,所使用的镜像是
http://hub.c.163.com/library/centos,容器里运行的进程为/bin/bash(也就是镜像里CMD指定的)。
docker ps看不到,docker ps -a能看到,且状态为Exited,说明容器是关闭状态。容器运行一瞬间就关闭了,为什么?那下面来了解一下容器的生命期问题。
容器的生命期
我们把容器理解为人的肉体,里面运行的进程理解为人的灵魂。如果人的灵魂宕机了,则肉体也就宕掉了,只有灵魂正常运行,肉体才能正常运行,如图1-11所示。
同理,只有容器里的进程正常运行,容器才能正常运行,容器里的进程挂了,则容器也就挂掉了。因为没有终端的存在,/bin/bash就像执行ls命令一样一下就执行完了,所以容器生命期也就到期了。
如果把这个bash附着到一个终端上,这个终端一直存在的话,bash就一直存在,那么是不是容器就能一直存活了呢?
删除容器的语法:
docker rm 容器ID/容器名
如果删除正在运行的容器,可以使用-f选项:
docker rm -f 容器ID/容器名
删除刚才的容器。
##########实操验证##########
[root@vms100 ~]# docker rm a8eb4d9d5805
a8eb4d9d5805
[root@vms100 ~]#
重新创建容器,加上 -i -t选项,可以写作-it或者-i -t,
-t:模拟一个终端。
-i:可以让用户进行交互,否则用户看到一个提示符之后就卡住不动了。
步骤1:创建一个容器。
##########实操验证##########
[root@vms100 ~]# docker run -it hub.c.163.com/library/centos
[root@f83af978dcd9 /]#
[root@f83af978dcd9 /]# exit
exit
[root@vms100 ~]#
创建出容器之后自动进入容器里,以通过exit退出容器。
##########实操验证##########
[root@vms100 ~]# docker ps -a -q
f83af978dcd9
[root@vms100 ~]#
但是,一旦退出容器,容器就不再运行了。
步骤2:删除此容器。
##########实操验证##########
[root@vms100 ~]# docker rm f83af978dcd9
f83af978dcd9
[root@vms100 ~]# docker ps -a -q
[root@vms100 ~]#
如果希望创建好容器之后不自动进入容器,可以加上-d选项。
步骤3:再次创建一个容器。
##########实操验证##########
[root@vms100 ~]# docker run -dit hub.c.163.com/library/centos
4ca1114102fe334813d06c065b8a40ab0ee06fabb735b29c884b4e59b38b7fb5
[root@vms100 ~]# docker ps -q
4ca1114102fe
[root@vms100 ~]#
因为加了-d选项,所以创建好容器之后并没有自动进入容器里。
##########实操验证##########
[root@vms100 ~]# docker attach 4ca1114102fe
[root@4ca1114102fe /]# exit
exit
[root@vms100 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4ca1114102fe hub.c.163.com/library/centos "/bin/bash" 21 seconds ago Exited (0) 5 seconds ago recursing_dhawan
[root@vms100 ~]#
可以看到只要退出来容器就会自动关闭。
步骤4:删除此容器。
##########实操验证##########
[root@vms100 ~]# docker rm 4ca1114102fe
4ca1114102fe
[root@vms100 ~]#
在运行容器的时候加上--restart=always选项,以解决退出容器自动关闭的问题。
步骤5:创建容器,增加--restart=always选项。
##########实操验证##########
[root@vms100 ~]# docker run -dit --restart=always hub.c.163.com/library/centos
73fe69336c42341d44ef32dc8aaab6869140b2a7ffe1243919571e246158f73e
[root@vms100 ~]# docker ps -q
73fe69336c42
[root@vms100 ~]#
进入到容器并退出。
##########实操验证##########
[root@vms100 ~]# docker attach 73fe69336c42
[root@73fe69336c42 /]# exit
exit
[root@vms100 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
73fe69336c42 hub.c.163.com/library/centos "/bin/bash" 54 seconds ago Up 24 seconds frosty_jang
[root@vms100 ~]#
可以看到容器依然是存活的。
步骤6:删除此容器。
##########实操验证##########
[root@vms100 ~]# docker rm 73fe69336c42
Error response from daemon: You cannot remove a running container 73fe69336c42341d44ef32dc8aaab6869140b2a7ffe1243919571e246158f73e. Stop the container before attempting removal or force remove
[root@vms100 ~]#
因为容器是活跃的,所以无法直接删除,需要加上-f选项。
##########实操验证##########
[root@vms100 ~]# docker rm -f 73fe69336c42
73fe69336c42
[root@vms100 ~]#
每次删除容器的时候都使用容器ID的方式比较麻烦,在创建容器的时候可以使用--name指定容器名。
步骤7:创建容器,使用--name指定容器的名字。
##########实操验证##########
[root@vms100 ~]# docker run -dit --restart=always --name=c1 hub.c.163.com/library/centos
fbecb6e5da92be3e9ae12aad55480a618223d68f84171a74ea38a8beb2669b5e
[root@vms100 ~]#
[root@vms100 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fbecb6e5da92 hub.c.163.com/library/centos "/bin/bash" 5 seconds ago Up 4 seconds c1
[root@vms100 ~]#
这样容器的名字为c1,以后管理起来比较方便,比如切换到容器,然后退出。
##########实操验证##########
[root@vms100 ~]# docker attach c1
[root@fbecb6e5da92 /]# exit
exit
[root@vms100 ~]#
步骤8:删除此容器。
##########实操验证##########
[root@vms100 ~]# docker rm -f c1
c1
[root@vms100 ~]# docker ps -q -a
[root@vms100 ~]#
创建临时容器
如果要临时创建一个测试容器,又怕用完忘记删除它,可以加上--rm选项。
创建临时容器。
##########实操验证##########
[root@vms100 ~]# docker run -it --name=c1 --rm hub.c.163.com/library/centos
[root@02bb28d481cd /]# exit
exit
[root@vms100 ~]#
创建容器时加了--rm,退出容器之后容器会被自动删除。
##########实操验证##########
[root@vms100 ~]# docker ps -a -q
[root@vms100 ~]#
可以看到此容器被自动删除了,注意--rm和--restart=always不可以同时使用。
指定容器里运行的命令
前面在创建容器的时候,容器里运行的是什么进程,是由镜像里的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 10
[root@vms100 ~]#
容器里运行的命令是sleep 10,10s之后命令结束,则容器也会关闭,此时容器的生命期也就是10s。
创建容器的时候使用变量
在利用一些镜像创建容器的时候需要传递变量,比如使用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@fd7e9c4718d3 /]#
[root@fd7e9c4718d3 /]# echo $aa
123
[root@fd7e9c4718d3 /]# echo $bb
456
[root@fd7e9c4718d3 /]# exit
exit
[root@vms100 ~]#
在创建容器的时候,通过-e指定了2个变量aa和bb,进入容器可以看到具有这两个变量。
把容器端口映射到物理机
外部主机(即本机之外的其他主机)是不能和容器进行通信的,如果希望外部主机能访问到容器的内容,就需要使用-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
77fa2e07f93c3b78b4ef1cffe7820e7a85f93e023b7df9047f04f7b2385420d3
[root@vms100 ~]#
这里把容器web的80端口映射到物理机的随机端口,这个端口号可以通过如下命令查询。
##########实操验证##########
[root@vms100 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
77fa2e07f93c nginx "/docker-entrypoint.…" 19 seconds ago Up 18 seconds 0.0.0.0:32768->80/tcp, :::32768->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
a493938aa6a1d7d1d9be0d4eaf41c533187bea1037f9196bb06d745a2dce6eb5
[root@vms100 ~]#
此处把容器的端口80映射到物理机的88端口(可以自行指定端口,比如80),那么访问物理机的端口88即可访问到web容器的端口80,如图1-14所示。
自行删除此容器。