我是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)
下面是它的工作原理。
运行一个 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
哪个自动以分离模式运行。
希望这是有帮助的。
更新:关于第二次运行,正如您正确指出的那样,有两种选择:
docker run --name=mycontainer image
您可以不使用命令运行它,而只需启动您刚刚尝试的现有容器,上面的答案会有所帮助。docker run --name=mycontainer image
. docker rm -f mycontainer
归档时间: |
|
查看次数: |
16999 次 |
最近记录: |