在docker容器中安装openssh需三步:安装openssh-server等必要包,配置permitrootlogin yes并设置root密码,创建/var/run/sshd、生成host key后以/usr/sbin/sshd -d前台启动;构建镜像时用cmd指定该命令,并通过-p映射端口实现外部ssh连接。

在 Docker 容器里装 OpenSSH,核心就三件事:装服务、配权限、启进程。它不是开个服务就完事,得让容器一启动 SSH 就跑起来,而且能被外部连上——尤其注意 root 密码、配置文件修改和端口映射这三点,漏一个就登不进去。
安装 OpenSSH 和基础工具
进容器后先更新源,再装包(以 Ubuntu/Debian 为例):
- apt-get update —— 不更新很可能找不到 openssh-server 包
- apt-get install -y openssh-server net-tools vim —— sshd 是必须的;net-tools 用来查端口(如 netstat -tuln | grep :22);vim 方便改配置
- 如果是 CentOS/RHEL 镜像,换成 yum install -y openssh-server,并确保已装 passwd(用于设密码)
配置允许 root 登录和设置密码
默认容器里 root 没密码,且 sshd 默认禁止 root 密码登录,这两步必须做:
- echo 'root:yourpass' | chpasswd —— 设置 root 密码(比如用 123456,后续务必改)
- sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config —— 开启 root 密码登录
- 可选但推荐:sed -i 's/session required pam_loginuid.so/session optional pam_loginuid.so/g' /etc/pam.d/sshd —— 避免 ssh 登录时报错 “Failed to write entry”
准备运行环境并启动服务
sshd 启动前要手动创建运行目录,且不能用 systemctl(容器没 init 系统):
- mkdir -p /var/run/sshd —— 否则启动报错 “Could not load host key” 或直接退出
- ssh-keygen -A —— 生成缺失的 host key(rsa、ecdsa、ed25519 等),否则连接时可能被拒绝
- /usr/sbin/sshd -D —— 前台运行 sshd(-D 表示不转后台),这是容器内正确启动方式;别用 service ssh start 或 systemctl
让 SSH 随容器自动启动(持久化)
手动敲命令只管当前会话,要真正“自启动”,得走两种路:
- 用 Dockerfile 构建镜像:把上面所有操作写成 RUN 指令,最后用 CMD ["/usr/sbin/sshd", "-D"] —— 这样每次 run 容器都会自动拉起 sshd
- 用 docker commit 保存状态:在已配置好的运行中容器里执行 docker commit my-ssh-ubuntu,新镜像就自带 SSH 环境了
- 别忘了启动容器时加端口映射:docker run -d -p 2222:22 my-ssh-ubuntu,这样宿主机或局域网才能用 ssh -p 2222 root@localhost 连入











