我遇到了一个奇怪的问题。
我无法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
似乎并没有开始。
我该怎么办?
答案 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
值得一试:)