如何通过SSH连接docker-compose创建的服务?能否登录启动后的容器?
嘿,我来帮你理清楚这个问题!
能不能通过SSH连接docker-compose创建的服务容器?
先给你个明确结论:默认情况下不行。你用到的nginx和httpd官方镜像里都没有预装SSH服务,所以启动容器后没法直接用SSH连进去。不过有两种办法能实现你的需求,其中第一种是Docker官方推荐的方式,简单又高效。
方法1:用docker exec直接进入容器(强烈推荐)
不需要额外装任何东西,直接用Docker自带的exec命令就能进入容器的交互式终端,这比SSH方便太多了。针对你的两个服务,命令分别是:
- 进入
proxy(nginx)容器:
docker-compose exec proxy sh
(注:nginx镜像默认用的是sh而不是bash,如果是其他支持bash的镜像可以换成bash)
- 进入
web(httpd)容器:
docker-compose exec web sh
执行命令后你就直接进入容器内部了,能执行各种操作,和SSH登录后的效果一样,但步骤更简单,还不用折腾SSH服务。
方法2:给容器安装SSH服务(仅当你必须用SSH时才用)
如果你因为某些特殊场景一定要用SSH连接,那得修改镜像,给容器装上SSH服务。下面是针对你两个服务的具体操作:
针对proxy服务(自定义nginx镜像)
修改你的nginx.Dockerfile,添加安装SSH服务的步骤:
# 假设你原来的Dockerfile基础是nginx镜像 FROM nginx:latest # 安装openssh-server并配置 RUN apt-get update && apt-get install -y openssh-server \ && mkdir -p /var/run/sshd \ # 设置root密码(替换成你自己的密码) && echo 'root:your_secure_password' | chpasswd \ # 修改SSH配置允许root登录 && sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config # 暴露SSH端口 EXPOSE 22 # 启动nginx和SSH服务(需要用脚本同时启动两个服务) # 创建start.sh脚本内容如下: # #!/bin/bash # service ssh start # nginx -g 'daemon off;' # 然后在Dockerfile里添加: # COPY start.sh /start.sh # RUN chmod +x /start.sh # CMD ["/start.sh"]
然后修改docker-compose.yml的proxy部分,添加SSH端口映射:
proxy: build: context: . dockerfile: nginx.Dockerfile ports: - '80:80' - '2222:22' # 把容器的22端口映射到主机的2222端口
针对web服务(自定义httpd镜像)
因为你用的是官方httpd镜像,需要创建一个新的Dockerfile(比如httpd.Dockerfile):
FROM httpd:latest # 安装openssh-server并配置 RUN apt-get update && apt-get install -y openssh-server \ && mkdir -p /var/run/sshd \ && echo 'root:your_secure_password' | chpasswd \ && sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config EXPOSE 22 # 同样需要启动脚本同时运行httpd和SSH服务 # 创建start.sh脚本内容如下: # #!/bin/bash # service ssh start # httpd-foreground # 然后在Dockerfile里添加: # COPY start.sh /start.sh # RUN chmod +x /start.sh # CMD ["/start.sh"]
然后修改docker-compose.yml的web部分:
web: build: context: . dockerfile: httpd.Dockerfile volumes: - ./html:/usr/local/apache2/htdocs/ ports: - '2223:22' # 映射到主机的2223端口,避免和proxy的端口冲突
配置完成后,重新构建镜像并启动服务:
docker-compose up --build
之后你就能用SSH连接了:
- 连接proxy容器:
ssh root@localhost -p 2222,输入你设置的密码 - 连接web容器:
ssh root@localhost -p 2223
⚠️ 注意:用这种方式的话,强烈建议不要用密码登录,最好配置SSH密钥认证,把你的公钥放到容器的/root/.ssh/authorized_keys里,这样更安全。
内容的提问来源于stack exchange,提问作者Vikas Rathore




