如何运行Docker容器

时间:2020-03-05 15:25:24  来源:igfitidea点击:

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

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

然后,如果要输入容器(以交互式地运行容器内的命令),则可以使用docker exec命令:

docker exec -it container_ID_or_name /bin/bash

这是我创建一个带有Ubuntu作为基础镜像的新容器的示例,然后我输入了运行的Ubuntu容器并运行ls命令:

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

丢失的?
别担心。
我将详细介绍上述两个命令,并且docker运行和exec命令中的选项是什么。

如何运行Docker容器

如果要使用某个图像和指定命令运行Docker容器,可以以这种方式执行以下操作:

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

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

  • -i选项意味着它将是交互模式(我们可以输入命令)
  • -t选项为我们提供终端(以便我们可以使用它,就像使用SSH进入容器)。
  • -d选项(守护程序模式)保留在后台运行的容器。
  • bash是它运行的命令。

在此处运行Bash的原因是此处的命令是容器不会立即停止。

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

在上面的示例中,我没有命名容器,因此它是随机命名的_blackburn。

如我们所见,容器在后台运行Bash命令。

Docker Run vs启动vs创建:差异解释

对于Docker来说,像Docker开始,Docker Run和Docker创建等术语可能会令人困惑。
本文解释了与示例的差异。

igi theitroadlinux手册

如果我们在后台运行它作为守护程序(-d选项)会发生什么?

如果不使用-d选项,Docker运行将创建一个新的容器,我们将在交互式模式下运行Bash shell中的终端。

正如我们在下面的示例中看到的,则会创建容器,并自动在容器内(Bash shell)。

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

Hyman@theitroad:~$docker run -it ubuntu bash
Hyman@theitroad:/# echo this is a new container
this is a new container
Hyman@theitroad:/# exit
exit
Hyman@theitroad:~$docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
82766613e7bc        ubuntu              "bash"              2 minutes ago       Up 2 minutes                            determined_blackburn
Hyman@theitroad:~$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命令),则退出容器和容器停止。

Hyman@theitroad:~$docker run -i ubuntu bash
echo "this is interactive"
this is interactive
Hyman@theitroad:~$docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
Hyman@theitroad:~$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。
换句话说,我们无法输入任何内容,无法在像我们之前执行的容器内运行命令:

Hyman@theitroad:~$docker run -t ubuntu bash
Hyman@theitroad:/# echo hello
^C^C
Hyman@theitroad:/# echo "hi"  
^C^C
Hyman@theitroad:/# exit
^C^C
Hyman@theitroad:/#

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

如何退出Docker容器

这个快速的小Docker提示展示了如何退出Docker容器。

igi theitroadlinux手册

如何运行现有容器

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

如果要运行现有容器,则必须首先启动容器,然后我们可以使用这样的exec选项:

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

这个例子将更好地了解理解:

Hyman@theitroad:~$docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
b6b79a9f7789        ubuntu              "bash"              7 minutes ago       Exited (0) 7 minutes ago                       loving_galileo
Hyman@theitroad:~$docker start b6b79a9f7789
b6b79a9f7789
Hyman@theitroad:~$docker exec -it b6b79a9f7789 bash
Hyman@theitroad:/# echo "inside existing container"
inside existing container
Hyman@theitroad:/# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
Hyman@theitroad:/# exit
exit
Hyman@theitroad:~$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系统内一样。

我们可以要求容器运行任何命令,但请记住该容器在命令完成后立即存在。

正如我们在下面的示例中看到的,此时没有交互式终端会话。
由于Echo命令几乎立即完成,因此我们不再"内部"容器。

Hyman@theitroad:~$docker exec -it b6b79a9f7789 echo hello
hello
Hyman@theitroad:~$

事实上,我们也可以运行其他命令并之后输入容器。

在下面的示例中,我创建了一个在端口80上运行nginx服务器的新容器。

由于我将其作为守护程序运行,因此nginx容器会在运行时继续。

然后我使用docker exec命令获取交互式bash shell,从而在nginx容器内输入(基本上是用nginx预配置的Linux)。

Hyman@theitroad:~$docker container run -it -d -p 8000:80 nginx
262ca5b17bf8aac5afbfdf66af6383be164cd8488f8cd64c06ee466b4d7462e9
Hyman@theitroad:~$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
Hyman@theitroad:~$docker exec -it 262ca5b17bf8 bash
Hyman@theitroad:/# ls
bin  boot  dev	etc  home  lib	lib64  media  mnt  opt	proc  root  run  sbin  srv  sys  tmp  usr  var
Hyman@theitroad:/#