You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何通过SSH连接docker-compose创建的服务?能否登录启动后的容器?

嘿,我来帮你理清楚这个问题!

能不能通过SSH连接docker-compose创建的服务容器?

先给你个明确结论:默认情况下不行。你用到的nginxhttpd官方镜像里都没有预装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.ymlproxy部分,添加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.ymlweb部分:

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

火山引擎 最新活动