我有一个docker image正确设置所有必要的工具和环境。但是,我很难在后台运行它。
似乎有两种方法:
(1) 可以将盒子作为守护进程运行,并且每当我想使用该盒子时我都可以附加到它。但是,在我将容器作为守护进程运行后,容器立即退出,代码为零。
$:~/docker/docker_scrapy$ sudo docker run -ti -v ~/docker/docker_scrapy/myvolume:/var/myvolume 3fb9894af1d9 /bin/bash
root@3fc39116a586:/# python -c 'from bs4 import BeautifulSoup'
root@3fc39116a586:/# cd /var/myvolume/
root@3fc39116a586:/var/myvolume#
$:~/docker/docker_scrapy$ sudo docker run -d -v ~/docker/docker_scrapy/myvolume:/var/myvolume 3fb9894af1d9
c5fab6e6ac02a579e3371aa641b18ca67feb93a9f4f4934b6d083157182fe4e1
$:~/docker/docker_scrapy$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
显然,我可以在交互模式下启动该盒子,但是当我尝试将其作为守护进程运行时,它会在启动后立即以代码 0 退出。我无法附加它,因为我需要启动它。这是否意味着如果镜像处于空闲状态,则无法在守护进程模式下运行该镜像?
(2 )或者将其设置为 SSH 服务器,我可以随时通过 ssh 登录并完成工作。就像 Vagrant up/ssh..
总结:
(1) 我在分离/附加时做错了什么?
(2) 在后台运行 docker 的正确方法是什么?守护进程/ssh
最佳答案
如果您在启动等待输入的服务后给它另一个命令来运行,那么容器将继续运行,直到您附加并退出该命令。我通常在服务启动后让 shell 保持运行状态,这样我就可以进行调试。这是一个简单的例子:
首先让我们创建一个在后台运行的服务
arthur@a:~$ docker run -ti ubuntu bash
root@5dc7f330b947:/# cat <<'EOF' >start-service.sh
> while true
> do
> echo service is running >> service.log
> sleep 10
> done
> EOF
root@5dc7f330b947:/# chmod +x start-service.sh
root@5dc7f330b947:/# exit
arthur@a:~$ docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5dc7f330b947 ubuntu:12.04 bash 50 seconds ago Exited (0) 3 seconds ago jolly_nobel
arthur@a:~$ docker commit 5dc7f330b947 service/example
4c37b69b129287d79a6fe3916e4293f935194966b1de49d125f1cf8d6ab14f6f
然后我们就可以启动它(我在这里用 & 作为背景。在您的示例中,不需要 &)。请注意,可以同时使用交互和分离选项。
arthur@a:~$ docker run -ti -d service/example bash -c "./start-service.sh & bash"
b35a5397ea2d29b4085d93ef32270379b09e49118380b0376309bca74fd719d0
arthur@a:~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b35a5397ea2d service/example:latest bash -c './start-ser 7 seconds ago Up 7 seconds cranky_wright
稍后我们可以通过查看日志文件来附加并检查服务:
arthur@a:~$ docker attach b35a5397ea2d
root@b35a5397ea2d:/# cat service.log
service is running
service is running
service is running
root@b35a5397ea2d:/#
我不建议在容器内运行 sshd,因为它为攻击者留下了一个对我来说并不完全有用的选项。
关于Docker SSH 或分离/附加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25940862/