我有一个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服务器,我可以随时随地进行工作。像Vagrant up / ssh ..
总结:
(1)我对分离/附着做了什么错误?
(2)在后台运行docker的正确方法是什么?守护进程/ ssh
答案 0 :(得分:3)
如果在启动等待输入的服务后再给它另一个命令运行,那么容器将继续运行,直到你连接并退出那个命令。我通常在服务启动后让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
然后我们可以启动它(我用&amp; here来背景它。在你的例子中,&amp;不需要)。请注意,使用交互式和分离选项都很好。
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,因为它为攻击者提供了一个对我来说并不严格有用的选项。
答案 1 :(得分:0)
那里有很多问题。我首先建议你通过docker教程来掌握一些基本概念。那说......
Dockerfile永远不会在后台运行,这不是docker的工作方式。没有cmd,没有入口点,没有什么可以运行。
Docker默认运行一个任务,当返回容器停止时。因此,如果您想要的只是一个sshd,那么您将在非守护进程模式下将其作为CMD运行。 (sshd -D)
有很多方法可以运行守护进程的应用程序:
使用supervisord,如docker site所述。
另一种选择是phusion/baseimage。
Phusion / baseimage提供ssh访问,但老实说,我在容器中做我需要的东西,我发现nsenter更容易使用。特别是当与phusion docker-bash工具配对时。
答案 2 :(得分:0)
注意:这个答案推广了我写过的工具。
首先,概念性地在一个容器中运行多个进程并不是正确的方法(https://docs.docker.com/articles/dockerfile_best-practices/)。更有利的解决方案是涉及多个容器,每个容器运行它们自己的过程/服务。将它们链接在一起将导致一致的应用。
我已经创建了一个容器化的SSH服务器,您可以“坚持”#39;任何正在运行的容器。这样,您可以使用每个容器创建合成,而不知道ssh。唯一的要求是容器有bash。
以下示例将启动一个连接到名称为&#39; sshd-web-server1&#39;的容器的SSH服务器。
docker run -ti --name sshd-web-server1 -e CONTAINER=web-server1 -p 2222:22 \
-v /var/run/docker.sock:/var/run/docker.sock -v $(which docker):/usr/bin/docker \
jeroenpeeters/docker-ssh
使用您选择的ssh客户端连接到SSH服务器,就像通常那样。
建议:Docker-SSH目前仍处于开发阶段,但确实有效!请让我知道你的想法
有关更多指示和文档,请参阅:https://github.com/jeroenpeeters/docker-ssh