第四章 操作Docker容器

        容器是镜像的一个运行实例。所不同的是,镜像是静态的只读文件,而容器带有运行时需要的可写文件层。如果认为虚拟机是模拟运行的一整套操作系统(包括内核、应用运行态环境和其他系统环境)和跑在上面的应用,那么Docker容器就是独立运行的一个(或一组)应用,以及它们必须的运行环境。

 4.1 创建容器

4.1.1 新建容器

        可以使用docker create 命令新建一个容器:

[root@docker ~]# docker run -it ubuntu:latest

root@6dcf2511b466:/#

       Create命令支持的选项主要分为三大类:与容器运行模式相关、与容器和环境配置相关、与容器资源限制和安全保护相关。

4-1 create命令与容器运行环境模式相关的选项

 

4-2 create命令与容器环境和配置相关的选项

 

 

 

4-3 create命令与容器资源限制和安全保护相关的选项

 

 

其他比较重要的选项还包括:

·-l,--label=[]:以键值对方式指定容器的标签信息;

·--label-file=[]:从文件中读取标签信息。

4.1.2 启动容器

        使用docker start 命令来启动一个已经创建的容器

[root@docker ~]# docker run -it ubuntu:latest

root@ccbcb73a3f8e:/# exit

exit

[root@docker ~]# docker ps -a

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                    PORTS               NAMES

ccbcb73a3f8e        ubuntu:latest       "/bin/bash"         3 seconds ago       Exited (0) 1 second ago                       modest_allen

[root@docker ~]# docker start cc

cc

[root@docker ~]# docker ps

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

ccbcb73a3f8e        ubuntu:latest       "/bin/bash"         26 minutes ago      Up 4 seconds                            modest_allen

4.1.3 新建并启动容器

        docker run 等同于 docker create + docker start

[root@docker ~]# docker run ubuntu /bin/echo "Hello World"

Hello World

        当利用docker run 来创建并启动容器时,Docker 会在后台运行的标准操作包括:

检查本地是否存在指定的镜像,不存在就从公有仓库下载;

利用镜像创建一个容器,并启动该容器;

分配一个文件系统给容器,并在只读的镜像层外面挂载一层可读写层;

从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中;

从网桥的地址池配置一个IP地址给容器;

执行用户指定的应用程序;

       启动一个bash终端,允许用户进行交互:

[root@docker ~]# docker run -it ubuntu:latest /bin/bash

root@840842ee3d89:/#

-i:让容器的标准输入保持打开

-t::docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上

        用户可以按Ctrl+d或输入exit命令来退出容器:

root@840842ee3d89:/# exit

[root@docker ~]#

        对于所创建的bash容器,当使用exit命令退出之后,容器就自动处于退出(Exited)状态了。这时因为对于Docker容器来说,当运行的应用退出后,容器也就没有继续运行的必要了。

4.1.4 守护态运行

        更多的时候,需要让Docker容器在后天以守护态(daemonized)形式运行。此时,可以通过使用-d参数来实现。

[root@docker ~]# docker run -d ubuntu:latest /bin/sh -c "while true;do echo hello world;sleep 3;done"

c6c8392f965ec5516de23c344576ad43851322d69c45dc50d436fa1da9cf8001

[root@docker ~]# docker ps

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES

c6c8392f965e        ubuntu:latest       "/bin/sh -c 'while..."   3 seconds ago       Up 2 seconds                            mystifying_hypatia

        要获取容器的输出信息,可以使用docker logs命令:

[root@docker ~]# docker logs c6c8

hello world

hello world

hello world

4.2 终止容器

         可以使用docker stop 来终止一个运行的容器。该命令的格式为docker stop [-t] --time[=10] [CONTAINER…]

       首先向容器发送SIGTERM信号,等待一段超时时间(默认为10秒)后,再发送SIGKILL信号来终止容器:

[root@docker ~]# docker stop c6c8

c6c8

        docker kill 命令会直接发送SIGKILL信号来强行终止容器。

        docker start 来启动容器

        docker restart 将一个运行的容器先终止,然后再重新启动它。

4.3 进入容器

        在使用-d参数时,容器启动后进入后台,用户无法看到容器中的信息,也无法进行操作。

        这个时候需要进入容器进行操作。attach、exec、以及第三方工具nsenter等。

4.3.1 attach命令

[root@docker ~]# docker ps

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

ccbcb73a3f8e        ubuntu:latest       "/bin/bash"         About an hour ago   Up About an hour                        modest_allen

[root@docker ~]# docker attach ccbc

        退出时Ctrl+p  Ctrl+q

        当多个窗口同时用attach命令连到同一个容器的时候,所有窗口都会同步显示。当某个窗口因命令堵塞时,其他窗口也无法执行操作了。因此一般不推荐使用。

4.3.2 exec命令

[root@docker ~]# docker exec -it ccbc /bin/bash

root@ccbcb73a3f8e:/#

-iinteractive=true|false:打开标准输入接受用户输入命令,默认是false;

-t--tty=ture|false:分配伪终端,默认是false。

        通过指定-it参数来保持标准输入打开,并且分配一个伪终端。通过exec命令对容器执行操作时最为推荐的方式。

4.3.3 nsenter工具

        

4.4 删除容器

       可以使用docker rm 命令来删除处于终止和退出状态的容器。

-f--force=false:是否强制终止并删除一个运行中的容器;

-l--link=false:删除容器的连接,但保留容器;

-v,--volumes=false:删除容器挂载的数据卷。

[root@docker ~]# docker rm 26d32

26d32

       默认情况下,docker rm 命令只能删除处于终止或退出状态的容器,并不能删除还处在运行状态的容器。

       如果要直接删除一个运行中的容器,可以添加-f参数。Docker 会发送SIGKILL信号给容器,终止其中的应用,之后强行删除。

[root@docker ~]# docker ps

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

ccbcb73a3f8e        ubuntu:latest       "/bin/bash"         About an hour ago   Up About an hour                        modest_allen

[root@docker ~]# docker rm -f ccbcb

ccbcb

4.5 导入和导出容器

        某些时候,需要将容器从一个系统迁移到另外一个系统,此时可以使用docker 的导入和导出功能。

4.5.1 导出容器

        导出容器是指导出一个已经创建的容器到一个文件,不管此时这个容器是否处于运行状态,可以使用docker export命令。其中,可以通过-o选项来指定导出的tar文件名,也可以直接通过重定向来实现。

[root@docker ~]# docker export -o test_for_run.tar c6c8392f965e

或者

[root@docker ~]# docker export 840842ee3d89 > test_for_stop.tar

        之后,可将导出来的tar文件传输到其他机器上,然后再通过导入命令导入到系统中,从而实现容器的迁移。

4.5.2 导入容器 

        导出的文件可以使用docker import 命令导入变成镜像,

[root@docker ~]# scp test_for_stop.tar 192.168.161.140:/root/

[email protected]'s password:

test_for_stop.tar

[root@docker ~]# scp test_for_run.tar 192.168.161.140:/root/

[email protected]'s password:

test_for_run.tar

 

[root@docker02 ~]# ls

anaconda-ks.cfg  initial-setup-ks.cfg  test_for_run.tar  test_for_stop.tar

[root@docker02 ~]# docker import test_for_run.tar test/ubuntu:v1.0

sha256:69063d822150aad4780ee8065d432a774e81a298a4e4bdcd2b8370260c259b2d

[root@docker02 ~]# docker import test_for_stop.tar test/ubuntu:v1.1

sha256:dab1dea762ca46a14d40af7a65795d0e942093a8e17d1281a7c6a55bf94f259e

[root@docker02 ~]# docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

test/ubuntu         v1.1                dab1dea762ca        3 seconds ago       69.8 MB

test/ubuntu         v1.0                69063d822150        48 seconds ago      69.8 MB

        实际上,即可以使用docker load 命令来导入镜像存储文件到本地镜像,也可以使用docker import 命令来导入一个容器快照到本地镜像库。

        这两者的区别在于容器快照文件将丢弃所有的历史记录和元数据信息(即仅保存容器当前的快照状态),而镜像存储文件将保存完整的记录,体积也更大。此外,从容器快照文件导入时可以重新指定标签等元数据信息。

猜你喜欢

转载自www.cnblogs.com/lingxiaolong/p/9203062.html