CKA备考实验 | 创建容器

书籍来源:《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所示。

自行删除此容器。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值