有没有办法以分离模式启动Docker容器?

Lai*_*son 16 docker

我是Docker的新手,所以我对下面的概念和术语的使用可能存在缺陷.

我想我理解创建容器(via docker create)和启动容器(via docker start)的概念.我也不太清楚,但仍然有点docker run用于同时创建和运行容器.如果我错了,请纠正我.

除非我错过了什么,如果我想要启动一个容器以便分离它,我唯一的选择就是docker run -d.

我不明白的是:假设我已经创建了我的容器,它已经停止了,现在我想把它分开.我怎么做?或者这是错误的思考方式吗?

通过使用以下命令尝试运行容器两次,我遇到了这个概念上的误解(我确定它是什么):
docker -d --name=fred my/image

我第二次得到:

docker:来自守护程序的错误响应:冲突.名称"/ image"已被容器[...]使用

精细; 我现在明白,这会尝试创建两个具有相同名称的容器,这显然不可能发生.但这引出了我这个概念性的问题:如果我有一个容器,比如停止了,我怎么能以分离模式启动它?

我告诉过你我是个菜鸟.感谢您提供任何信息.

Jam*_*ser 12

除非您在启动容器时特别附加(-a或-i选项),否则根据定义您将被释放.

创建容器只是构建文件系统层.启动它会运行ENTRYPOINT(或CMD)过程.你推测,Run既可以创建也可以开始.所以你不能"附加"到创建的容器......没有要附加的进程.

在这里,我创建了一个容器(同样,所有这一切都是创建文件系统层):

[sysadmin@vmr-132-9 ~]$ docker create --name=test centos:latest /bin/sh -c "while true; do echo hello world; sleep 1; done"
Run Code Online (Sandbox Code Playgroud)

看见?

sysadmin@vmr-132-9 ~]$ docker ps -a
CONTAINER ID        IMAGE                    COMMAND                  CREATED             STATUS                     PORTS               NAMES
9d5bf75a8077        centos:latest            "/bin/sh -c 'while tr"   15 seconds ago      Created                                        test
Run Code Online (Sandbox Code Playgroud)

它还没有做任何事情.现在启动它没有附加,没有任何东西打印到终端STDOUT,因为我没有附加.但STDOUT将转向日志驱动程序(json文件)

[sysadmin@vmr-132-9 ~]$ docker start test test
[sysadmin@vmr-132-9 ~]$ docker logs test
hello world
hello world
hello world
hello world
Run Code Online (Sandbox Code Playgroud)

  • 哇,对不起,我的格式很糟糕. (2认同)
  • 詹姆斯,现在格式化你的答案.您可以在回答可以开始使用的问题时获取帮助链接.:) (2认同)

Rao*_*Rao 5

下面是它的工作原理。

运行一个 docker 容器busybox,一个分离模式和容器名称的小型 linux 映像testso

bash $ docker run -itd --name testso busybox
b60d0847bb81065d5f5d4b3a3acff3102d03e7a8a084c0770da4487427787479
Run Code Online (Sandbox Code Playgroud)

你可以看到容器正在运行

bash $ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
b60d0847bb81        busybox             "sh"                7 seconds ago       Up 2 seconds                            testso
Run Code Online (Sandbox Code Playgroud)

现在停止上述容器testso并检查没有容器正在运行。

bash $ docker stop testso
testso
bash $ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
Run Code Online (Sandbox Code Playgroud)

现在,通过启动较早停止的容器并查看在后台运行的容器来解决您的问题testso

bash $ docker start testso
testso
bash $ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
b60d0847bb81        busybox             "sh"                46 seconds ago      Up 2 seconds                            testso
Run Code Online (Sandbox Code Playgroud)

因此,当容器首先docker run带有-d选项时,容器可以只使用docker start containerid哪个自动以分离模式运行。

希望这是有帮助的。

更新:关于第二次运行,正如您正确指出的那样,有两种选择:

  1. docker run --name=mycontainer image您可以不使用命令运行它,而只需启动您刚刚尝试的现有容器,上面的答案会有所帮助。
  2. 清除现有容器并重新运行docker run --name=mycontainer image.
    要擦除现有容器,请使用命令 -docker rm -f mycontainer