很多人在拿到一个可运行的 CentOS 容器后,第一反应会是:能不能像登录普通 Linux 主机那样,用 PuTTY 或 `ssh` 直接连进去?答案是可以,但这并不是容器管理的常规做法。下面按实际操作顺序,把从创建容器、安装 SSH,到生成新镜像并开放端口连接的过程梳理一遍,同时也说明这种方案适合什么场景、不适合什么场景。
先说明一点:原文已经明确提到,并不推荐把 SSH 当成连接容器的默认方式。如果你只是临时验证环境、做兼容性测试,或者确实需要让某些老工具通过 SSH 接入容器,这个方法可以用;如果是日常容器运维,通常仍应优先考虑 Docker 自己的管理方式。相关讨论可参考:https://www.oschina.net/translate/why-you-dont-need-to-run-sshd-in-docker
先准备一个可用的 CentOS 7 容器
如果你还没有基础容器,先从官方 `centos:7` 镜像开始。这里保留原始命令,分别完成拉取镜像、创建容器并进入容器:
docker pull centos:7
docker run --name=c7 --privileged -itd centos:7 /usr/sbin/init
docker exec -it c7 bash
这一步的重点有两个。第一,容器名是 `c7`,后面的 `docker exec` 会直接用到它;第二,容器启动命令写的是 `/usr/sbin/init`,这是为了让容器里具备更接近传统系统服务的运行环境,后面启动 `sshd` 时会更顺手。
在容器里安装并配置 OpenSSH 服务
进入容器后,先安装 `openssh-server`:

yum -y install openssh-server
安装完成后,还不能直接登录。因为 SSH 服务需要主机密钥,所以要依次生成三类常见密钥:
ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key -N ""
ssh-keygen -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -N ""
ssh-keygen -t ed25519 -f /etc/ssh/ssh_host_ed25519_key -N ""
接着给当前容器里的账户设置密码,原文示例直接使用:
passwd
根据提示输入两遍密码即可。后面无论你用 SSH 客户端还是 PuTTY,登录时都要用这个密码。
密码和密钥都准备好之后,就可以启动 SSH 服务:
/usr/sbin/sshd -D
如果你希望通过服务管理方式重启,也可以使用:
systemctl restart sshd
这两种写法都来自原文。实际使用时,你只要确认 `sshd` 已经正常启动即可。完成后执行 `exit` 退出容器。
把当前改动提交成新的 SSH 镜像
如果只是改完当前容器却不保存,那么容器删掉后这些配置也就没了。更实用的做法,是把已经装好 SSH 的容器提交为一个新镜像,便于后续重复创建:
docker commit lanmp local/c7-sshd
原文这里的目标镜像名是 `local/c7-sshd`,表示当前容器的修改会被保存到这个新镜像里。提交完成后,可以用下面的命令确认镜像是否已经生成:
docker image ls
如果列表里出现了 `local/c7-sshd`,说明提交成功,后面就可以直接基于它启动新容器,而不用每次都重新安装 `openssh-server`、重新生成密钥。
用新镜像创建容器并映射 SSH 端口
有了新镜像后,下一步是启动一个真正用于远程连接的容器:

docker run --name=c7-sshd --privileged -itd -p 1022:22 local/c7-sshd /usr/sbin/init
这一行里最关键的是 `-p 1022:22`。它的含义是把宿主机的 `1022` 端口映射到容器的 `22` 端口,也就是 SSH 默认端口。这样一来,你并不是直接连容器内部地址,而是通过宿主机 IP 加上 `1022` 来访问容器里的 SSH 服务。
容器名这里换成了 `c7-sshd`,与前面的基础容器 `c7` 区分开,便于你后续管理和识别。
通过 SSH 或 PuTTY 登录容器
到这一步,连接方式就和普通 Linux 主机差不多了。连接地址填写宿主机的 IP,端口使用 `1022`,用户名是 `root`,密码就是前面执行 `passwd` 时设置的密码。
如果直接在命令行里测试,可以使用原文给出的命令:
ssh root@127.0.0.1 -p 1022
输入密码后,就可以进入这个支持 SSH 的 CentOS 容器。若你使用的是 PuTTY,也只需要把主机地址、端口和账户信息按同样规则填入即可。
总结一下,这种做法的核心流程其实很明确:先在 `centos:7` 容器里装好 `openssh-server`,生成主机密钥并设置密码,再通过 `docker commit` 固化为新镜像,最后用 `-p 1022:22` 暴露 SSH 端口。这样做适合演示、测试和兼容某些老式连接习惯;但如果你追求更符合容器理念的运维方式,仍然应该把它当成特定场景下的补充方案,而不是默认方案。









