openssh-server不在Docker容器中启动

时间:2015-01-09 12:22:59

标签: docker openssh dockerfile

我遇到了一个奇怪的问题。

我无法ssh到具有IP地址172.17.0.61的docker容器。

我收到以下错误:

$ ssh 172.17.0.61
ssh: connect to host 172.17.0.61 port 22: Connection refused

我的Dockerfile确实包含openssh-server安装步骤:

RUN apt-get -y install curl runit openssh-server

并且步骤开始ssh:

RUN service ssh start

可能是什么问题?

当我使用nsenter进入容器并启动ssh服务时,我可以使用ssh。但是创建容器ssh-server似乎并没有开始。

我该怎么办?

3 个答案:

答案 0 :(得分:9)

构建Dockerfile时,您将创建一个图像。但是,您无法使用已运行的ssh守护程序或任何正在运行的服务创建映像。首先,如果您从图像中创建一个正在运行的容器,则可以在其中启动服务。例如。通过将开始指令附加到docker run命令:

sudo docker run -d mysshserver service ssh start

您可以使用 CMD 为docker镜像定义默认命令。以下是Dockerfile的示例:

FROM ubuntu:14.04.1
MAINTAINER Thomas Steinbach
EXPOSE 22
RUN apt-get install -y openssh-server
CMD service ssh start && while true; do sleep 3000; done

您可以使用以下两个命令构建运行此映像:

sudo docker build -t sshtest .
sudo docker run -d -P --name ssht sshtest

现在您可以通过ssh连接到此容器。请注意,在示例Dockerfile中,没有创建用户和登录。此图像仅作为示例,您可以启动与它的ssh连接,但不能登录。

答案 1 :(得分:0)

我认为有更好的方法:

Dockerfile

FROM ubuntu:14.04.1
EXPOSE 22
COPY docker-entrypoint.sh /docker-entrypoint.sh
RUN chmod +x /docker-entrypoint.sh
RUN apt-get install -y openssh-server

ENTRYPOINT ["sh", "/docker-entrypoint.sh"]

# THIS PART WILL BE REPLACED IF YOU PASS SOME OTHER COMMAND TO docker RUN
CMD while true; do echo "default arg" && sleep 1; done

docker-entrypoint.sh

#!/bin/bash
service ssh restart
exec "$@"

构建命令 docker build -t sshtest .

这种方法的好处是,当您使用docker run时,ssh守护程序将始终启动,但是您也可以指定可选参数,例如:

docker run sshtest将每1秒打印一次default arg docker run sshtest sh -c 'while true; do echo "passed arg" && sleep 3; done'是否每3秒打印一次passed arg

答案 2 :(得分:0)

我遇到了同样的问题。 幸运的是,我可以通过检查 kenorb 答案并将其调整到我的 Dockerfile 来解决它: https://stackoverflow.com/a/61738823/4058295

值得一试:)