如何运行Docker容器

时间:2020-03-21 11:48:02  来源:igfitidea点击:

在本教程中,我们将看到可用于开始使用初始容器的不同方法。
我们将专注于在Docker工作站上运行容器的不同Docker命令行用法。

因此,准备工作的第一步是验证Docker守护进程是否正常运行,这可以通过运行以下命令来完成。

root@docker-workstation:~$docker info
Containers: 17
payday loan calgary
Images: 201
Storage Driver: devicemapper
 Pool Name: docker-202:1-524942-pool
 Pool Blocksize: 65.54 kB
 Data file: /var/lib/docker/devicemapper/devicemapper/data
 Metadata file: /var/lib/docker/devicemapper/devicemapper/metadata
 Data Space Used: 41.02 GB
 Data Space Total: 107.4 GB
 Metadata Space Used: 30.24 MB
 Metadata Space Total: 2.147 GB
 Library Version: 1.02.82-git (2013-10-04)
Execution Driver: native-0.2
Kernel Version: 3.13.0-36-generic
Operating System: Ubuntu 14.04.1 LTS

在上面的示例中,我们使用了info命令来检查状态。
命令输出将列出所有容器,镜像,存储驱动程序,内核详细信息等。

“请记住,Docker在客户端服务器模型中工作的事实。
服务器和客户端命令使用相同的Docker二进制文件。
因此,当我们执行Docker客户端命令时,实际发生的是将命令传递给系统中运行的Docker守护程序.”

因此,让我们开始使用第一个容器。
我们将使用run命令来运行我们的容器。
Docker run命令具有多种可以传递的选项,其中几乎包括了Docker的所有功能。

#docker help或者man docker-run将向我们显示命令行参数的完整列表

root@docker-workstation:~$docker run -i -t ubuntu /bin/bash

上面的命令将提取Ubuntu镜像(以及Ubuntu仓库中的最新标记...稍后我们将看到什么是Tag),并将该镜像作为容器运行,然后在该容器中启动bash shell。

让我们看看我们与上述docker run命令一起使用的命令行选项。
-i和-t的组合在新启动的容器内为我们创建了bash shell终端。
-i要求保持输入打开,-t要求容器为其分配一个终端(这就是为什么在run命令完成后我们打开bash shell的原因)。

现在,我们可以使用docker ps命令检查系统中当前处于运行状态的容器,如下所示。

spillai@docker-workstation:~$sudo docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

容器可以使用其ID进行唯一标识。
系统上的每个容器都有一个唯一的ID号。
我们可以通过运行#docker ps或者#docker ps -a(给出-a开关,将向我们显示所有容器,甚至向我们显示已停止的容器)来查看容器ID。

实际上,可以使用三种不同的方法来唯一地标识容器。
第一个是简短的uuid(我们可以通过运行#docker ps获得。
)还有一个较长的uuid,然后还可以使用其名称来标识docker(如果我们在运行容器时未为容器分配名称,它将自动获得一个随机名称)

如何命名Docker容器?

我们可以在首次运行时为Docker容器命名。
如果用户在首次创建容器时未提供名称,则Docker将为该容器分配一个随机名称。
Docker随机分配了诸如drunk_fermat,sad_yonath,nostalgic_kirch,cocky_stallman,distracted_torvalds之类的名称。

如果我们要为容器分配一个自己感兴趣的特定名称,而不是随机生成的名称,可以在运行容器时使用--name标志,如下所示。

root@docker-workstation:~$docker run --name my_first_ubuntu -i -t ubuntu /bin/bash

上面的命令将创建一个名为my_first_ubuntu的容器。
关于容器名称的好处是,我们可以在docker命令中使用名称而不是id来对容器执行不同的操作。
在两个容器之间创建连接时,容器名称很有用(我们将在后面讨论链接容器)。

如何启动/停止Docker容器?

我们可以使用其ID启动/停止容器。

root@docker-workstation:~$docker start b87d675c0a4b

上面的命令将启动ID为b87d675c0a4b的容器。
我们可以使用以下命令停止相同的容器。

root@docker-workstation:~$docker stop b87d675c0a4b

如前所述,如果容器是命名的,则可以在启动/停止容器时使用相同的名称而不是ID(只需在上述命令中将ID替换为容器名称)

我们可以使用以下命令将终端连接到正在运行的容器。

root@docker-workstation:~$docker attach cebf8a62c307

我们也可以在上述命令中使用容器名称代替id。
请记住,以上命令在执行后需要返回键,以在容器内调出bash shell。

如何创建守护容器?

到目前为止,我们所看到的都是交互式容器。
对于实际的用例,我们需要运行时间更长的可以被守护的容器。
请注意,他们将不会像我们到目前为止使用的那样进行交互式会话。

root@docker-workstation:~$sudo docker run --name my_daemonized -d ubuntu /bin/sh -c "while true; do echo my daemonized container; sleep 1; done "
7b487f35905f70db6e4b78d0bc60aa21daafc813e2be214f2d2bbc8a2079815c
root@docker-workstation:~$sudo docker ps
CONTAINER ID        IMAGE                                                  COMMAND                CREATED             STATUS              PORTS               NAMES
7b487f35905f        ubuntu:14.04   "/bin/sh -c 'while t   5 seconds ago       Up 4 seconds                            my_daemonized

我们在上面创建容器时使用的-d标志将使其在后台运行。
另外,我们使用了一个简单的while循环作为容器命令。
这里要注意的主要区别是,在执行run命令后,docker只是给了我们容器ID(7b487f35905f70db6e4b78d0bc60aa21daafc813e2be214f2d2bbc8a2079815c)并将提示返回给我们。
与之前不同,如果我们现在运行#docker ps命令,它将向我们显示我们新创建的守护进程容器处于运行状态。

root@docker-workstation:~$docker logs my_daemonized
my daemonized container
my daemonized container
my daemonized container
...

我们可以通过运行#docker logs命令来查看容器控制台中正在发生的事情(请注意,我们在上面的命令中使用了容器名称而不是id)。
上面的命令实际上将向我们显示最后几个条目并返回提示。
但是我们可以使用-f选项(与tail -f非常相似,可以从外部查看容器中继续发生的控制台条目,如下所示。

root@docker-workstation:~$docker logs -f  my_daemonized

我们可以从外部查看docker容器内部正在运行的进程,如下所示。

root@docker-workstation:~$docker top  my_daemonized
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                16797               29861               0                   09:36               ?                   00:00:00            /bin/sh -c while true; do echo my daemonized container; sleep 1; done
root                17785               16797               0                   09:50               ?                   00:00:00            sleep 1

如何从外部在Docker容器中运行进程?

从外部执行正在运行的容器内部的过程将是常见的要求。
我们可以使用docker命令行中提供的exec标志非常轻松地做到这一点。

我们基本上可以在运行中的容器中运行两种类型的过程。
一个是背景,另一个是交互式的。

root@docker-workstation:~$docker exec -d  my_daemonized mkdir /tmp/test

上面的命令将在名为my_daemonized的容器内创建目录/tmp/test。
-d标志使我们的命令在后台运行。
我们还可以使用exec标志在容器内运行交互式任务。
常见的交互式任务之一是在一个已经运行的容器中打开一个shell。

root@docker-workstation:~$docker exec -i -t  my_daemonized /bin/bash   
root@7b487f35905f:/# exit

上面的命令将是实际用例中最常用的命令。
使用上面的命令,我们可以进入已经运行的守护程序容器中并执行所需的操作,然后使用#exit命令退出该容器。

发生故障时自动重启容器

默认情况下,如果由于故障而停止,docker不会重新启动容器。
但是,我们可以将容器配置为在发生故障时重新启动自身。

这是使用docker命令行中的--restart标志完成的。
该标志验证容器的退出代码。

root@docker-workstation:~$docker run --restart=always --name my_daemonized -d ubuntu /bin/sh -c "while true; do echo my daemonized container; sleep 1; done"

在上面的docker run命令中,我们将restart标志设置为always,这意味着无论容器的退出代码是什么,它都会始终重启容器。

如果要使用非零的退出代码重新启动容器,则可以通过将重新启动标志设置为失败模式来完成,如下所示。

spillai@docker-workstation:~$sudo docker run --restart=on-failure:3 --name my_daemonized -d ubuntu /bin/sh -c "while true; do echo my daemonized container; sleep 1; done"

上面的命令将使docker守护程序在非零退出代码下重启容器。
尝试次数为3次。
请注意,此重启标志在较旧版本的Docker中不可用。

获取有关Docker容器的更多详细信息

我们可以通过在docker上使用名为“检查”的命令来获取容器的所有详细信息。
inspect命令将查询我们所需的容器,并将向我们返回有关容器配置的详细信息。

我们可以运行检查命令,如下所示。

root@docker-workstation:~$docker inspect my_daemonized

Inspect命令将为我们提供大量详细信息,包括用于创建容器的参数,使用的存储驱动程序,主机名,网络详细信息,容器和镜像详细信息,cpu和内存详细信息等。

如何删除Docker容器?

删除容器就像启动或者停止容器一样简单。
它是一个命令操作,如下所示。

root@docker-workstation:~$docker stop 7b487f35905f
7b487f35905f
root@docker-workstation:~$docker rm 7b487f35905f
7b487f35905f

在上面的示例中,我们首先停止了容器,然后请求将其从系统中删除。
如果容器处于运行状态,则无法删除它。

如何将Docker内的端口暴露在外面?

通过将基本docker主机上所需的端口号添加到容器中的另一个端口,可以将容器内部的端口暴露给外界。
例如,如果我要在容器内公开端口8080,则必须将该端口映射到主机系统中的另一个端口。
可以在docker运行时使用以下命令来完成此操作。

root@docker-workstation:~$docker run -p 8080:8080 -d glassfish

上面的命令将打开基本系统上的端口8080,该端口与连接容器内端口8080的连接相同。
因此,基本上,当有人连接到Docker基本系统上的端口8080时,他们实际上将建立与容器端口8080的连接。

我们可以使用多个-p标志公开多个端口。

否则,我们实际上可以将容器直接连接到主机网络。
使用此技术,可以避免为容器的网络创建其他名称空间。
简而言之,网络部分将与主机本身相同。

root@docker-workstation:~$docker run --net host -d -t 5ff9d35b02d4

上面的命令将创建一个容器,而不会在网络部分中命名空间。
因此,端口和网络操作都将在主机网络本身上发生。
以这种方式处理网络要容易得多。

如何在Docker容器内挂载卷?

我们可以使用-v标志在docker容器中安装卷。
但是,在创建容器之后,我们将无法安装卷。
如下所示,需要在容器创建期间安装本地卷。

root@docker-workstation:~$docker run --net host -d -t -v /opt/mountpoint:/mountpoint:rw 4ff5d45b02d4

上面的命令会将目录/opt/mountpoint挂载到容器内的/mountpoint目录中。
简单来说,任何写入容器内/mountpoint目录的内容实际上都是写入Docker主机内的/opt/mountpoint目录。