我们在一台机器上运行docker
在其他计算机上运行的工作站
我想在docker容器上从工作站进行引导,然后我们的映像应启用ssh
如何启用docker image ssh。
添加ssh之前,您应该查看docker exec
是否足以满足您的需求。 (doc link)
如果您确实需要SSH,以下Dockerfile
应该会帮助(copied from Docker docs):
# sshd
#
# VERSION 0.0.2
FROM ubuntu:14.04
MAINTAINER Sven Dowideit <[email protected]>
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"]
在您的Dockerfile中使用CMD命令确实会启用ssh
CMD ["/usr/sbin/sshd", "-D"]
但是有很大的缺点。如果您已经有CMD命令(例如,启动MySQL),那么您将面临一个在Docker中不容易解决的问题。您只能在Dockerfile中使用一个CMD。但是,使用主管可以解决此问题。您要做的是告诉Dockerfile安装Supervisor:
RUN apt-get install -y openssh-server supervisor
使用主管,您可以在容器启动时启动任意数量的进程。这些过程是在Dockerfile目录中的supervisor.conf文件中定义的(命名是任意的)。在您的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)启动容器,那么您应该在Dockerfile的末尾放置USER root,以便超级用户以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 in this article。
Notice:此答案将推广我编写的工具。
这里有些答案建议将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
您可以找到已安装SSH的预构建映像,例如CentOS tutum/centos
和Debian tutum/debian
以及用于构建它们的Dockerfiles
https://github.com/tutumcloud/tutum-centos/blob/master/Dockerfilehttps://github.com/tutumcloud/tutum-debian/blob/master/Dockerfile