我是Docker的新手,所以我对下面的概念和术语的使用可能存在缺陷。
我想我理解创建容器(通过docker create
)的概念,以及启动如此创建的容器(通过docker start
)。我也不太清楚,但仍然有点docker run
用于同时创建和运行容器。如果我错了,请纠正我。
除非我错过了某些内容,否则如果我想启动一个容器以使其分离,我唯一的选择就是docker run -d
。
我不明白的是:假设我已经创建了我的容器,它已经停止了,现在我想开始分离它。我怎么做?或者这是错误的思考方式吗?
通过尝试使用以下命令运行容器两次,我遇到了这个概念上的误解(我确定它是什么):
docker -d --name=fred my/image
我第二次得到:
docker:来自守护程序的错误响应:冲突。容器[...]
已在使用名称“/ image”
精细;我现在明白,这会尝试创建两个具有相同名称的容器,这显然不可能发生。但这让我想到了这个概念性的问题:如果我有一个容器,比如停止了,我怎么能以分离模式启动呢?
我告诉过你我是个菜鸟。感谢您提供任何信息。
答案 0 :(得分:8)
除非您在启动容器时特别附加(-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"
看到了吗?
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
它还没有做任何事情。现在启动它没有附加,没有任何东西打印到终端STDOUT,因为我没有附加。但STDOUT将转向日志驱动程序(json-file)
[sysadmin@vmr-132-9 ~]$ docker start test test
[sysadmin@vmr-132-9 ~]$ docker logs test
hello world
hello world
hello world
hello world
答案 1 :(得分:1)
以下是它的工作原理。
以分离模式运行docker容器busybox
,一个小型linux映像,容器名称为testso
bash $ docker run -itd --name testso busybox
b60d0847bb81065d5f5d4b3a3acff3102d03e7a8a084c0770da4487427787479
您可以看到容器正在运行
bash $ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b60d0847bb81 busybox "sh" 7 seconds ago Up 2 seconds testso
现在停止上面的容器testso
并检查没有容器正在运行。
bash $ docker stop testso
testso
bash $ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
现在,通过启动先前已停止的容器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
因此,当容器首先docker run
-d
选项时,容器只能使用docker start containerid
自动以分离模式运行。
希望这有用。
更新: 关于第二次跑步,正如你正确指出的那样,有两种选择并且不在其中:
docker run --name=mycontainer image
运行它,而不是使用命令docker run --name=mycontainer image
启动它,而只需启动您刚试过的现有容器,上面的答案会有所帮助。docker rm -f mycontainer
要擦除现有容器,请使用命令 - function handle(e)
{
if (e.keyCode != 38 && e.keyCode != 39 && e.keyCode != 40 && e.keyCode != 37)
return false;
}