如何启用docker image ssh

时间:2015-02-19 14:07:22

标签: docker chef

我们在一台机器上运行docker

在其他计算机上运行的工作站

我想在docker容器上从工作站进行引导,然后我们的图像应该启用ssh

如何启用docker image ssh。

4 个答案:

答案 0 :(得分:3)

在添加ssh之前,您应该看看docker exec是否足以满足您的需求。 (doc link

如果您确实需要SSH,以下Dockerfile应该有所帮助(copied from Docker docs):

# 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"]

答案 1 :(得分:2)

注意:这个答案推广了我写过的工具。

这里的一些答案建议将SSH服务器放在容器中。从概念上在一个容器中运行多个进程并不是正确的方法(https://docs.docker.com/articles/dockerfile_best-practices/)。更有利的解决方案是涉及多个容器,每个容器运行它们自己的过程/服务。将它们链接在一起将导致一致的应用。

我已经创建了一个容器化的SSH服务器,您可以“粘贴”任何正在运行的容器。这样,您可以使用每个容器创建合成,而不知道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

答案 2 :(得分:1)

您可以找到安装了SSH的预建图像,例如CentOS tutum/centos和Debian tutum/debian

Dockerfiles用于构建它们

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

答案 3 :(得分:1)

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

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

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

RUN apt-get install -y openssh-server supervisor

使用supervisor,您可以在容器启动时启动任意数量的进程。这些进程在supervisor.conf文件(命名是任意的)中定义,该文件位于Dockerfile的目录中。在Dockerfile中,告诉Docker在构建期间复制此文件:

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

有一个问题需要注意。主管需要以root身份启动,否则会抛出错误。因此,如果您的Dockerfile定义了一个用户启动容器(例如 USER jboss ),那么您应该将 USER root 放在Dockerfile的末尾,以便主管以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中预先定义。 E.g。

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的更多信息in this article