如何在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里:
这样容器启动时会先修正权限,再启动SSH服务,避免因权限问题启动失败。command: sh -c "chmod 600 /etc/ssh/ssh_host_*_key && chmod 644 /etc/ssh/ssh_host_*_key.pub && /usr/sbin/sshd -D"
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
相关产品推荐
相关产品推荐

