如何运行 Docker 容器

因此,如果您是 Docker 新手,您可能想知道如何运行 docker 容器。 让我快速向您展示这一点。

您可以使用以下命令创建和运行容器:

docker run -it -d --name container_name image_name bash

然后,如果要进入容器(以交互方式在容器内运行命令),可以使用 docker exec 命令:

docker exec -it container_ID_or_name /bin/bash

这是一个 example 我在其中创建一个以 Ubuntu 作为基础映像的新容器,然后进入正在运行的 Ubuntu 容器并运行 ls 命令:

[email protected]:~$ docker run -it -d --name my_container ubuntu bash
7e77640bca686108ad415318278a1fa148e1c84d3b180276e19ec2b970ba9b67
[email protected]:~$ docker exec -it my_container bash
[email protected]:/# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[email protected]:/# 

丢失? 不用担心。 我将详细解释上述两个命令的作用以及什么是 -it docker run 和 exec 命令中的选项。

如何运行 docker 容器

如果你想运行一个带有特定图像和指定命令的 docker 容器,你可以用这种方式来做:

docker run -it -d --name container_name image_name bash

上面的命令将从指定的 docker 镜像中创建一个具有指定名称的新容器。 容器名称是可选的。

  • -i 选项 表示它将是交互模式(您可以对其输入命令)
  • -t 选项 给你一个终端(这样你就可以像使用 ssh 进入容器一样使用它)。
  • -d 选项 (守护程序模式)使容器在后台运行。
  • bash 是它运行的命令。

跑步的原因 bash 因为这里的命令是容器不会立即停止。

[email protected]:~$ docker run -it -d ubuntu bash
82766613e7bc0ae98887bb1c776fa0de7f3c4771db9ac7ffc5db5c2c68ab497b
[email protected]:~$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
82766613e7bc        ubuntu              "bash"              4 seconds ago       Up 3 seconds                            determined_blackburn

在上述 example,我没有给容器命名,所以它被随机命名为determined_blackburn。

如您所见,容器正在运行 bash 后台命令。

如果您不在后台将其作为守护进程(-d 选项)运行会怎样?

如果不使用 -d 选项, docker run 将创建一个新容器,并且您将在交互模式下运行一个终端 bash 贝壳。

正如你在 example 下面,容器被创建,我自动在容器内(bash 贝壳)。

这里的问题是,如果你退出容器,容器就会停止。

[email protected]:~$ docker run -it ubuntu bash
[email protected]:/# echo this is a new container
this is a new container
[email protected]:/# exit
exit
[email protected]:~$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
82766613e7bc        ubuntu              "bash"              2 minutes ago       Up 2 minutes                            determined_blackburn
[email protected]:~$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
6098c44f2407        ubuntu              "bash"              27 seconds ago      Exited (0) 8 seconds ago                       bold_benz
82766613e7bc        ubuntu              "bash"              2 minutes ago       Up 2 minutes                                   determined_blackburn

如果只使用 -i(交互式)选项会发生什么?

假设您只使用 -i 选项。 在这种情况下,您将看到一个交互式提示,但如果您退出交互式提示(使用 Ctrl+D 或 exit 命令),您将退出容器并且容器将停止。

[email protected]:~$ docker run -i ubuntu bash
echo "this is interactive"
this is interactive
[email protected]:~$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[email protected]:~$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
b6b79a9f7789        ubuntu              "bash"              27 seconds ago      Exited (0) 9 seconds ago                       loving_galileo

如果只使用 -t(终端/tty)选项会发生什么?

这是一个棘手的情况,因为在这种情况下,您将拥有一个伪终端(如果您使用 -t 选项),但您不会拥有 STDIN。 换句话说,你不能输入任何东西,不能像之前那样在容器内运行命令:

[email protected]:~$ docker run -t ubuntu bash
[email protected]:/# echo hello

^C^C
[email protected]:/# echo "hi"  
^C^C
[email protected]:/# exit
^C^C
[email protected]:/#

在上述情况下,我不得不从另一个终端停止容器。

如何运行现有容器

docker run 命令从指定的镜像创建一个新容器。 但是当你已经有一个容器时会发生什么?

如果要运行现有容器,必须先启动容器,然后可以使用 exec 选项,如下所示:

docker start existing_container_ID_or_name
docker exec -it existing_container_ID_or_name /bin/bash

这 example 对您的理解会更好:

[email protected]:~$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
b6b79a9f7789        ubuntu              "bash"              7 minutes ago       Exited (0) 7 minutes ago                       loving_galileo
[email protected]:~$ docker start b6b79a9f7789
b6b79a9f7789
[email protected]:~$ docker exec -it b6b79a9f7789 bash
[email protected]:/# echo "inside existing container"
inside existing container
[email protected]:/# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[email protected]:/# exit
exit
[email protected]:~$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
b6b79a9f7789        ubuntu              "bash"              8 minutes ago       Up 43 seconds                           loving_galileo

为什么使用 bash 每时每刻?

在上述所有示例中,我都使用了 bash 或 /bin/bash 作为与容器一起运行的命令。 我使用它是因为它提供了一个 shell,当你运行容器时,由于 shell,你可以在容器内运行常规命令,就像你在常规 Linux 系统中一样。

您可以要求容器运行任何命令,但请记住,一旦命令完成,容器就会存在。

正如你在 example 下面,这次没有交互式终端会话。 您不再“在”容器内,因为 echo 命令几乎立即完成。

[email protected]:~$ docker exec -it b6b79a9f7789 echo hello
hello
[email protected]:~$

实际上,您也可以运行其他命令,然后再进入容器。

在里面 example 下面,我创建了一个运行的新容器 nginx服务器 在端口 80 上。由于我使用选项 -d 作为守护程序运行它,因此 nginx 容器继续运行。

然后我使用 docker exec 命令来获得交互式 bash shell 并因此进入 nginx 容器(基本上是一个预先配置了 nginx 的 Linux)。

[email protected]:~$ docker container run -it -d -p 8000:80 nginx
262ca5b17bf8aac5afbfdf66af6383be164cd8488f8cd64c06ee466b4d7462e9
[email protected]:~$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
262ca5b17bf8        nginx               "nginx -g 'daemon of…"   9 seconds ago       Up 8 seconds        0.0.0.0:8000->80/tcp   zen_kilby
b6b79a9f7789        ubuntu              "bash"                   20 minutes ago      Up 12 minutes                              loving_galileo
[email protected]:~$ docker exec -it 262ca5b17bf8 bash
[email protected]:/# ls
bin  boot  dev	etc  home  lib	lib64  media  mnt  opt	proc  root  run  sbin  srv  sys  tmp  usr  var
[email protected]:/# 

我希望您对如何运行 docker 容器以及它为什么使用某些选项有更好的理解。

如果您有任何问题或建议,请在评论部分告诉我。