因此,如果您是 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 容器以及它为什么使用某些选项有更好的理解。
如果您有任何问题或建议,请在评论部分告诉我。