如何使docker图像SSH启用

docker工人在一台机器上运行

运行在其他机器上的工作站

我想从Docker容器上的工作站做bootstrap,然后我们的图像应该被启用

如何使docker图像SSH启用。

在你添加ssh之前,你应该看看docker exec是否足够满足你的需求。 ( doc链接 )

如果你确实需要SSH,下面的Dockerfile应该可以帮助你( 从Docker文档复制 ):

 # sshd # # VERSION 0.0.2 FROM ubuntu:14.04 MAINTAINER Sven Dowideit <SvenDowideit@docker.com> RUN apt-get update && apt-get install -y openssh-server RUN mkdir /var/run/sshd RUN echo 'root:screencast' | chpasswd RUN sed -i 's/PermitRootLogin without-password/PermitRootLogin yes/' /etc/ssh/sshd_config # SSH login fix. Otherwise user is kicked off after login RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd ENV NOTVISIBLE "in users profile" RUN echo "export VISIBLE=now" >> /etc/profile EXPOSE 22 CMD ["/usr/sbin/sshd", "-D"] 

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

这里的一些答案build议在你的容器中放置一个SSH服务器。 在一个容器中概念上运行多个进程不是正确的方法( 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

你可以find安装了SSH的预置图像,例如CentOS tutum/centos和Debian tutum/debian

Dockerfiles用于构build它们

https://registry.hub.docker.com/u/tutum/centos/dockerfile/ https://registry.hub.docker.com/u/tutum/debian/dockerfile/

在Dockerfile中使用CMD命令确实可以启用ssh

 CMD ["/usr/sbin/sshd", "-D"] 

但是有一个巨大的缺点。 如果你已经有一个CMD命令(例如启动MySQL),那么你正面临一个在Docker中不容易解决的问题。 Dockerfile中只能使用一个CMD。 但是,有一个解决方法,使用主pipe。 你要做的是告诉Dockerfile安装Supervisor:

 RUN apt-get install -y openssh-server supervisor 

使用主pipe,您可以在容器启动时启动尽可能多的进程。 这些进程在与您的Dockerfile位于目录中的supervisor.conf文件(命名是任意的)中定义。 在你的Dockerfile中,你告诉Docker在构build过程中复制这个文件:

 ADD supervisor-base.conf /etc/supervisor.conf 

然后告诉Docker在容器启动时启动监督器(当监督器启动时,监督器也将启动上面提到的supervisor.conf文件中列出的所有进程)。

 CMD ["supervisord", "-c", "/etc/supervisor.conf"] 

您的supervisor.conf文件可能如下所示:

 [supervisord] nodaemon=true [program:sshd] directory=/usr/local/ command=/usr/sbin/sshd -D autostart=true autorestart=true redirect_stderr=true 

有一个问题要小心。 主pipe需要以root身份启动,否则会抛出错误。 所以如果你的Dockerfile定义了一个用户来启动容器(比如USER jboss ),那么你应该把USER root放在你的Dockerfile的末尾,这样supervisor就以root启动。 在您的supervisor.conf文件中,您只需为每个进程定义一个用户:

 [program:wildfly] user=jboss command=/opt/jboss/wildfly/bin/standalone.sh -b 0.0.0.0 -bmanagement 0.0.0.0 [program:chef] user=chef command=/bin/bash -c chef-2.1/bin/start.sh 

当然,这些用户需要在你的dockerfile中预定义。 例如

 RUN groupadd -r -f jboss -g 2000 && useradd -u 2000 -r -g jboss -m -d /opt/jboss -s /sbin/nologin -c "JBoss user" jboss 

您可以在本文中了解更多关于Supervisor + Docker + SSH的更多信息。