You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在docker-compose up/down间保持相同SSH密钥及容器ID?

解决Docker-Compose重启后SSH主机密钥不匹配的问题

哈哈,这个坑我帮好几个同行踩过!每次docker-compose down再up就触发REMOTE HOST IDENTIFICATION HAS CHANGED错误,核心原因很简单:容器每次启动时都会自动生成全新的SSH主机密钥,而你本地~/.ssh/known_hosts里还存着上一次容器的旧密钥,两者一冲突就报错了。下面给你几个从临时救急到长期根治的方案,按需选:

1. 给容器配置固定SSH密钥(长期根治)

这是最稳妥的办法,让容器每次启动都用同一套预先生成的密钥,彻底杜绝密钥变化的问题:

  • 第一步,在本地生成一对固定的SSH主机密钥(选你常用的加密算法,比如ed25519):
    ssh-keygen -t ed25519 -f ./container_ssh_host_key -N ""
    
    执行后会得到两个文件:container_ssh_host_key(私钥)和container_ssh_host_key.pub(公钥)。
  • 第二步,在docker-compose.yml里把这两个文件挂载到容器的SSH密钥目录(Debian/Ubuntu/CentOS一般都是/etc/ssh/):
    services:
      your-service-name:
        # 你的其他配置(镜像、端口映射等)...
        volumes:
          - ./container_ssh_host_key:/etc/ssh/ssh_host_ed25519_key
          - ./container_ssh_host_key.pub:/etc/ssh/ssh_host_ed25519_key.pub
        # 如果用的是RSA密钥,对应挂载ssh_host_rsa_key和ssh_host_rsa_key.pub
    
  • 第三步,确保容器内的密钥文件权限正确(SSH服务对权限要求很严):
    你可以在docker-compose.yml的command里加权限配置,或者直接写到Dockerfile里:
    command: sh -c "chmod 600 /etc/ssh/ssh_host_*_key && chmod 644 /etc/ssh/ssh_host_*_key.pub && /usr/sbin/sshd -D"
    
    这样容器启动时会先修正权限,再启动SSH服务,避免因权限问题启动失败。

2. 临时跳过密钥校验(仅测试环境用)

如果只是测试环境图省事,不想折腾固定密钥,可以让SSH直接忽略这个主机的密钥校验,但生产环境绝对别这么干,会有安全风险:

  • 单次连接时加参数跳过:
    ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null your-user@container-ip
    
  • 或者把规则写到本地~/.ssh/config里,以后连接该主机自动跳过:
    Host container-ip-or-hostname
        StrictHostKeyChecking no
        UserKnownHostsFile /dev/null
    

3. 自动更新本地known_hosts(折中方案)

写个小脚本,每次启动容器后自动更新本地known_hosts里的密钥记录,不用手动操作:

#!/bin/bash
# 启动容器
docker-compose up -d

# 获取容器的IP地址(替换成你的容器名称)
CONTAINER_IP=$(docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' your-service-container-name)

# 删除旧的密钥记录,添加新的
ssh-keygen -R "$CONTAINER_IP"
ssh-keyscan "$CONTAINER_IP" >> ~/.ssh/known_hosts

把这个脚本保存为start-container.sh,每次用bash start-container.sh代替直接docker-compose up,就能自动同步密钥了。

额外优化:给容器分配静态IP

如果你的容器IP每次重启都会变,结合上面的固定密钥方案,再给容器分配一个静态IP,就能彻底解决所有问题:
在docker-compose.yml里添加自定义网络和静态IP配置:

networks:
  custom-net:
    ipam:
      config:
        - subnet: 172.21.0.0/16

services:
  your-service-name:
    # 其他配置...
    networks:
      custom-net:
        ipv4_address: 172.21.0.10

这样容器每次启动都是同一个IP,配合固定密钥,SSH连接再也不会报错啦!

内容的提问来源于stack exchange,提问作者akhil raja

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:21:46