Docker SSH或分离/附加

我有一个docker形象 ,所有必要的工具和环境正确设置。 但是,我很难在后台运行它。

似乎有两种方法:

(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

如果在启动等待input的服务之后为其提供另一个命令,那么容器将继续运行,直到您连接并退出命令。 服务启动后,我通常会留下一个shell,以便debugging。 这里有一个简单的例子:

首先让我们创build一个在后台运行的服务

 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:/# 

我不build议在容器中运行sshd,因为它为攻击者留下了一个对我不是很有用的选项。

那里有很多问题。 我首先build议你通过Docker教程来掌握一些基本的概念。 那说…

该Dockerfile将永远不会在后台运行,这不是如何docker工程。 没有cmd,没有入口点,没有什么可运行的。

默认情况下,Docker运行一个任务,当它返回容器停止。 所以,如果你想要的只是一个sshd,那么你可以在非守护模式下运行它作为你的CMD。 (sshd -D)

有办法运行守护程序的应用程序:

使用supervisord,如docker网站上所logging。

另一种select是phusion / baseimage 。

Phusion / baseimage提供了ssh访问,但老实说,我在容器中做我所需要的,我发现nsenter更容易使用。 特别是在与phusion docker-bash工具配对时。

注意 :这个答案提供了一个我写的工具。

首先,概念上在一个容器中运行多个进程并不是正确的方法( https://docs.docker.com/articles/dockerfile_best-practices/ )。 更有利的解决scheme是涉及多个容器,每个容器运行自己的过程/服务。 将它们连接在一起会产生一个连贯的应用程序。

我创build了一个容器化的SSH服务器,可以“粘”到任何正在运行的容器。 这样你就可以创build每个容器的组合,没有那个容器甚至不知道ssh。 唯一的要求是容器有bash。

以下示例将启动附加到名称为“sshd-web-server1”的容器的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