Docker实践(三)容器

Docker中,容器是独立运行的一个或一组应用,以及应用运行的环境;对应传统的虚拟化,虚拟机可以理解为模拟操作系统和运行在上面的应用。

启动容器

启动容器一般有两种方式,一种是新建容器并启动,一种是将终止状态的容器重新启动,Docker容器非常的轻量级,能够很好的支持用户随时删除和创建容器。

新建并启动容器

docker使用docker run命令来新建并启动容器,如:

例如如下命令表示输出一个HelloWorld,之后终止容器。

[root@legaoyun10514 ~]# docker run centos:7.2.1511 bin/echo 'helloworld'

helloworld

下面是新建并启动一个容器,包含bash终端,允许用户进行交互

[root@legaoyun10514 ~]# docker run -i -t centos:7.2.1511 bin/bash

[root@b3dbe17e8ce4 /]# uname -a

Linux b3dbe17e8ce4 3.10.0-862.el7.x86_64 #1 SMP Fri Apr 20 16:44:24 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

[root@b3dbe17e8ce4 /]# cat /proc/version

Linux version 3.10.0-862.el7.x86_64 ([email protected]) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-28) (GCC) ) #1 SMP Fri Apr 20 16:44:24 UTC 2018

[root@b3dbe17e8ce4 /]#

其中-i表示让容器的标准输入保持打开,-t表示让docker分配一个伪终端给容器,并绑定到容器的标准输入上

docker run命令的执行步骤是:

  • 检查本地是否存在镜像,如果没有从共有仓库下载
  • 利用镜像创建并启动一个容器
  • 分配一个文件系统,并在只读镜像外面挂在一层可读写层
  • 从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去
  • 从地址池配置一个IP地址给容器
  • 执行用户指定的应用程序
  • 执行完毕后容器被终止

启动已终止容器

可以利用docker start命令,将一个已终止容器启动运行。

容器的核心是所执行的应用程序,所需要的资源都是应用程序所必须的,除此之外没有其他资源占用,可以在伪终端中利用top或者ps命令查看容器中的进程信息。

[root@b3dbe17e8ce4 /]# ps

  PID TTY          TIME CMD

    1 pts/0    00:00:00 bash

   20 pts/0    00:00:00 ps

可以看到容器中只运行了bash应用,所以docker的虚拟化是非常轻量级的,对资源的利用率非常高。

使用docker ps命令可以查看docker容器列表,其中

默认,不加参数表示,所有启动状态的容器

[root@legaoyun10514 ~]# docker ps -a

CONTAINER ID        IMAGE               COMMAND                 CREATED             STATUS                      PORTS               NAMES

b3dbe17e8ce4        centos:7.2.1511     "bin/bash"              21 minutes ago      Up 9 minutes                                    blissful_proskuriakova

c8485a2e06bd        centos:7.2.1511     "bin/bash"              24 minutes ago     

使用 docker start启动已终止容器

[root@legaoyun10514 ~]# docker start c8485a2e06bd

c8485a2e06bd

 

后台(background)运行

一般情况下,需要docker容器在后台运行,而不是将容器的命令执行结果输出到宿主主机,后台运行docker容器可以通过-d参数来实现。

执行下面的命令,使用-d,和不适用-d的效果。

[root@legaoyun10514 ~]# docker run centos:7.2.1511 /bin/sh -c 'for i in `seq 100`; do echo $i; sleep 1; done'

1

2

3

4

5

… …

[root@legaoyun10514 ~]# docker run -d centos:7.2.1511 /bin/sh -c 'for i in `seq 100`; do echo $i; sleep 1;

48df4126c4a42fb92154812528697ce7438f28f00e669a95e8f4095958736b5d

后台运行的容器,可以通过docker logs [容器id]命令来查看容器命令的执行结果,如:

[root@legaoyun10514 ~]# docker logs 48df4126c4a4

1

2

3

4

… …

 

终止容器

使用docker stop来终止一个运行中的容器,如:

[root@legaoyun10514 ~]# docker stop b3dbe17e8ce4

b3dbe17e8ce4

当docker容器中的应用程序终结时,docker容器也会终结,如只启动/bin/bash终端的容器,当exit或者ctrl+d终结时,容器终止。

docker restart可以重新启动一个容器

 

进入容器

使用docker run -d容器启动的docker容器,可以使用docker attach命令或者nsenter命令进入容器,进行操作。

attach命令

[root@legaoyun10514 lot]# docker run -itd centos:7.2.1511

f37a4155b59a5814e80f05c6f69876b8c4931bc4d5478084698b14c314ad32ad

[root@legaoyun10514 lot]# docker ps

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

f37a4155b59a        centos:7.2.1511     "/bin/bash"         4 seconds ago       Up 3 seconds                            relaxed_goldwasser

[root@legaoyun10514 lot]# docker attach relaxed_goldwasser

[root@f37a4155b59a /]# uname -a

Linux f37a4155b59a 3.10.0-862.el7.x86_64 #1 SMP Fri Apr 20 16:44:24 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

attache命令使用时是有弊端的,当多个终端同事attach到一个容器中的时候,所有的窗口都会同步显示,当某个窗口的应用阻塞是,所有的终端也都会阻塞。

nsenter命令

通过-d参数启动容器后,根据容器id查询容器信息,容器信息中包含容器的进程ID

[root@legaoyun10514 lot]# docker inspect ebc3700aa8b1 | grep Pid

            "Pid": 28210,

            "PidMode": "",

            "PidsLimit": 0

通过这个进程id就可以连接到容器中去

[root@legaoyun10514 lot]# nsenter --target 28210 --mount --uts --ipc --net --pid

[root@ebc3700aa8b1 /]#

 

导入导出容器

导出容器

使用docker export命令导出容器到本地文件系统,导出的文件称为容器的快照

[root@legaoyun10514 lot]# docker export 6e8941b320c4 > centos.tar

[root@legaoyun10514 lot]# ls

centos.tar

[root@legaoyun10514 lot]#

导入容器快照

使用docker import命令导入本地快照为镜像,并制定镜像标签

[root@legaoyun10514 lot]# docker import - testimport/centos < centos.tar

sha256:55ce6d23ccf360444a1c5e7d610ac03b401281544c4a6b9c21d9866d528b628d

[root@legaoyun10514 lot]# docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

testimport/centos   latest              55ce6d23ccf3        7 seconds ago       195MB

使用docker load,docker import,docker save,docker load命令的区别:

  • docker import可以重新指定镜像的名字,docker load不可以
  • docker export是保存容器的当前状态,会丢失历史数据和元数据
  • docker save用于持久化镜像,不会丢失历史数据和元数据
  • docker load用于导入镜像,不能指定镜像的名称

删除容器

可以使用docker rm来删除一个处于终止状态的容器,但是不能删除运行状态的容器,如

[root@legaoyun10514 lot]# docker ps -a

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES

6e8941b320c4        centos:7.2.1511     "/bin/bash"         11 minutes ago      Up 11 minutes                                   zen_mirzakhani

ebc3700aa8b1        centos:7.2.1511     "/bin/bash"         21 minutes ago      Exited (0) 11 seconds ago                       eager_roentgen

[root@legaoyun10514 lot]# docker rm zen_mirzakhani

Error response from daemon: You cannot remove a running container 6e8941b320c4d8a833944888bf421b07deba49d6dc8cdac0293cc7f1d7e91895. Stop the container before attempting removal or force remove

[root@legaoyun10514 lot]# docker rm eager_roentgen

eager_roentgen

[root@legaoyun10514 lot]#

如果要删除运行状态的容器,需要使用docker rm -f 命令来删除

清理所有处于终止状态的容器

删除所有终止状态的容器

docker rm $(docker ps -a -q)

删除所有容器

docker rm -f $(docker ps -a -q)

(完)

猜你喜欢

转载自blog.csdn.net/weihao_/article/details/82792263