如何启用docker image ssh

问题描述 投票:3回答:4

我们在一台机器上运行docker

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

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

如何启用docker image ssh。

docker chef
4个回答
5
投票

添加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"]

3
投票

在您的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


2
投票

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


1
投票

您可以找到已安装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

© www.soinside.com 2019 - 2024. All rights reserved.