演示分离容器和非分离容器之间的区别
Demonstrating the difference between detached and not detached containers
我有一个非常简单的docker文件:
FROM alpine:3.14 AS build
LABEL version = "1.0"
LABEL description = "Our first Docker file!"
和一个非常简单的 docker-compose.yml 文件:
version: "3.9"
# Define services
services:
container1:
container_name: first_container
build:
context: .
dockerfile: dockerfile
我正在 运行 使用 docker-compose up
编写 docker-compose 文件,或者 docker-compose up -d
以证明容器仍然 运行ning在分离配置中。
在第一种情况下,我希望容器 运行 然后关闭。确实如此。 运行 docker-compose down
然后停止并移除所有容器 (first_container),如 docker-compose ps
.
确认
$ docker-compose up
Creating network "comdockerdevenvironmentscode_default" with the default driver
Creating first_container ... done
Attaching to first_container
first_container exited with code 0
$ docker-compose ps
Name Command State Ports
------------------------------------------
first_container /bin/sh Exit 0
$ docker-compose down
Removing first_container ... done
Removing network comdockerdevenvironmentscode_default
$ docker-compose ps
Name Command State Ports
------------------------------
现在,我重新运行 docker-重新组合,添加分离的命令。现在,输出表明它创建了容器,但没有关闭它。伟大的!当 运行ning docker-compose ps
时我应该看到状态变化,但它似乎仍然已经退出。
$ docker-compose up -d
Creating network "comdockerdevenvironmentscode_default" with the default driver
Creating first_container ... done
$ docker-compose ps
Name Command State Ports
------------------------------------------
first_container /bin/sh Exit 0
这是为什么?我怎样才能证明我可以附加到 运行ning 分离容器,但不能附加到另一种情况下的封闭容器?
alpine
容器,没有相反的显式配置,默认启动 shell (/bin/sh
)。如果 stdin
未打开,shell 会立即退出。无论您是否 运行 docker-compose up
和 -d
,在所有情况下 stdin
都会关闭,因此您的容器会退出。
如果你想让容器运行一个shell不退出,那么你需要安排到stdin保持连接。要获得提示,您还需要 Docker 分配一个 tty。这意味着:
version: "3.9"
services:
container1:
image: docker.io/alpine:latest
stdin_open: true
tty: true
运行 上面示例中的容器意味着您可以 docker attach
访问它并访问 shell 提示符。
或者,如果您希望容器 运行 不退出,只需 运行 一个不会退出的命令:
version: "3.9"
services:
container1:
image: docker.io/alpine:latest
command: [sleep, inf]
此 运行 是 sleep inf
命令,运行 直到被取消。一个更典型的例子是 运行 某种持久性服务,如网络服务器、数据库等。
我有一个非常简单的docker文件:
FROM alpine:3.14 AS build
LABEL version = "1.0"
LABEL description = "Our first Docker file!"
和一个非常简单的 docker-compose.yml 文件:
version: "3.9"
# Define services
services:
container1:
container_name: first_container
build:
context: .
dockerfile: dockerfile
我正在 运行 使用 docker-compose up
编写 docker-compose 文件,或者 docker-compose up -d
以证明容器仍然 运行ning在分离配置中。
在第一种情况下,我希望容器 运行 然后关闭。确实如此。 运行 docker-compose down
然后停止并移除所有容器 (first_container),如 docker-compose ps
.
$ docker-compose up
Creating network "comdockerdevenvironmentscode_default" with the default driver
Creating first_container ... done
Attaching to first_container
first_container exited with code 0
$ docker-compose ps
Name Command State Ports
------------------------------------------
first_container /bin/sh Exit 0
$ docker-compose down
Removing first_container ... done
Removing network comdockerdevenvironmentscode_default
$ docker-compose ps
Name Command State Ports
------------------------------
现在,我重新运行 docker-重新组合,添加分离的命令。现在,输出表明它创建了容器,但没有关闭它。伟大的!当 运行ning docker-compose ps
时我应该看到状态变化,但它似乎仍然已经退出。
$ docker-compose up -d
Creating network "comdockerdevenvironmentscode_default" with the default driver
Creating first_container ... done
$ docker-compose ps
Name Command State Ports
------------------------------------------
first_container /bin/sh Exit 0
这是为什么?我怎样才能证明我可以附加到 运行ning 分离容器,但不能附加到另一种情况下的封闭容器?
alpine
容器,没有相反的显式配置,默认启动 shell (/bin/sh
)。如果 stdin
未打开,shell 会立即退出。无论您是否 运行 docker-compose up
和 -d
,在所有情况下 stdin
都会关闭,因此您的容器会退出。
如果你想让容器运行一个shell不退出,那么你需要安排到stdin保持连接。要获得提示,您还需要 Docker 分配一个 tty。这意味着:
version: "3.9"
services:
container1:
image: docker.io/alpine:latest
stdin_open: true
tty: true
运行 上面示例中的容器意味着您可以 docker attach
访问它并访问 shell 提示符。
或者,如果您希望容器 运行 不退出,只需 运行 一个不会退出的命令:
version: "3.9"
services:
container1:
image: docker.io/alpine:latest
command: [sleep, inf]
此 运行 是 sleep inf
命令,运行 直到被取消。一个更典型的例子是 运行 某种持久性服务,如网络服务器、数据库等。