Docker技术入门与实战(第3版)
上QQ阅读APP看书,第一时间看更新

4.1 创建容器

从现在开始,忘掉“臃肿”的虚拟机吧,对容器的操作就像直接操作应用一样简单和快速。

本节主要介绍Docker容器的create、start、run、wait和logs子命令。

1.新建容器

可以使用docker [container] create命令新建一个容器,例如:

        $ docker create -it ubuntu:latest
        af8f4f922dafee22c8fe6cd2ae11d16e25087d61f1b1fa55b36e94db7ef45178
        $ docker ps -a
        CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
        af8f4f922daf ubuntu:latest "/bin/bash" 17 seconds ago Created silly_euler

使用docker [container] create命令新建的容器处于停止状态,可以使用docker [container] start命令来启动它。

由于容器是整个Docker技术栈的核心,create命令和后续的run命令支持的选项都十分复杂,需要读者在实践中不断体会。

选项主要包括如下几大类:与容器运行模式相关、与容器环境配置相关、与容器资源限制和安全保护相关,参见表4-1~表4-3。

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

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

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

其他选项还包括:

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

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

2.启动容器

使用docker [container] start命令来启动一个已经创建的容器。例如,启动刚创建的ubuntu容器:

        $ docker start af
        af

此时,通过docker ps命令,可以查看到一个运行中的容器:

        $ docker ps
        CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
        af8f4f922daf ubuntu:latest "/bin/bash" 2 minutes ago Up 7 seconds silly_euler

3.新建并启动容器

除了创建容器后通过start命令来启动,也可以直接新建并启动容器。

所需要的命令主要为docker [container] run,等价于先执行docker [container] create命令,再执行docker [container] start命令。

例如,下面的命令输出一个“Hello World”,之后容器自动终止:

        $ docker run ubuntu   /bin/echo 'Hello world'
        Hello world

这跟在本地直接执行/bin/echo 'hello world’相比几乎感觉不出任何区别。

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

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

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

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

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

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

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

❑ 执行完毕后容器被自动终止。

下面的命令启动一个bash终端,允许用户进行交互:

        $ docker run -it ubuntu:18.04 /bin/bash
        root@af8bae53bdd3:/#

其中,-t选项让Docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上,-i则让容器的标准输入保持打开。更多的命令选项可以通过man docker-run命令来查看。

在交互模式下,用户可以通过所创建的终端来输入命令,例如:

        root@af8bae53bdd3:/# pwd
        /
        root@af8bae53bdd3:/# ls
        bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
        root@af8bae53bdd3:/# ps
            PID TTY             TIME CMD
              1 ?          00:00:00 bash
              11 ?          00:00:00 ps

在容器内用ps命令查看进程,可以看到,只运行了bash应用,并没有运行其他无关的进程。

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

        root@af8bae53bdd3:/# exit
        exit

对于所创建的bash容器,当用户使用exit命令退出bash进程之后,容器也会自动退出。这是因为对于容器来说,当其中的应用退出后,容器的使命完成,也就没有继续运行的必要了。

可以使用docker container wait CONTAINER [CONTAINER...]子命令来等待容器退出,并打印退出返回结果。

某些时候,执行docker [container] run时候因为命令无法正常执行容器会出错直接退出,此时可以查看退出的错误代码。

默认情况下,常见错误代码包括:

❑ 125:Docker daemon执行出错,例如指定了不支持的Docker命令参数;

❑ 126:所指定命令无法执行,例如权限出错;

❑ 127:容器内命令无法找到。

命令执行后出错,会默认返回命令的退出错误码。

4.守护态运行

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

例如,下面的命令会在后台运行容器:

        $ docker run -d ubuntu  /bin/sh -c "while true; do echo hello world; sleep 1; done"
        ce554267d7a4c34eefc92c5517051dc37b918b588736d0823e4c846596b04d83

容器启动后会返回一个唯一的id,也可以通过docker ps或docker container ls命令来查看容器信息:

        $ docker ps
        CONTAINER ID        IMAGE        COMMAND        CREATED        STATUS     PORTS        NAMES
        ce554267d7a4        ubuntu:latest        "/bin/sh -c 'while t        About a minute ago
            Up About a minute determined_pik

5.查看容器输出

要获取容器的输出信息,可以通过docker [container] logs命令。

该命令支持的选项包括:

❑ -details:打印详细信息;

❑ -f, -follow:持续保持输出;

❑ -since string:输出从某个时间开始的日志;

❑ -tail string:输出最近的若干日志;

❑ -t, -timestamps:显示时间戳信息;

❑ -until string:输出某个时间之前的日志。

例如,查看某容器的输出可以使用如下命令:

        $ docker logs ce554267d7a4
        hello world
        . . .