Docker SSH或Detach / Attach

时间:2014-09-19 19:12:16

标签: docker

我有一个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

3 个答案:

答案 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