【Docker实战】在容器内配置 SSH 服务:安装、Vim配置与连接验证(保姆级教程)
在进行深度学习或后端开发时,我们经常需要使用 Docker 容器。但原生的 Docker 容器通常是一个"裸机",没有 SSH 服务,导致我们无法使用 VS Code Remote 进行远程开发,也无法用 FileZilla 传输文件。
本文将手把手教你在正在运行的 Docker 容器中安装 SSH,使用 Vim 修改关键配置(开启端口、允许Root登录),并最终成功连接。
前置准备
确保你已经进入了容器内部。如果还没有,请在宿主机终端执行:
bash
# rf 是你的容器名字或者 ID
docker exec -it rf /bin/bash
第一步:安装必要软件 (SSH 和 Vim)
大多数 Docker 镜像(如 Ubuntu/Debian 基础镜像)为了精简体积,默认没有安装 SSH 服务,甚至连 vim 编辑器都没有。我们需要手动安装。
在容器终端内执行:
bash
# 1. 更新软件源(这一步很重要,否则可能找不到包)
apt-get update
# 2. 安装 SSH 服务端和 Vim 编辑器
apt-get install -y openssh-server vim
第二步:配置 SSH (关键步骤)
安装完不能直接用,因为我们需要开启监听端口 并且允许 Root 用户密码登录 。我们需要修改 /etc/ssh/sshd_config 文件。
1. 设置 Root 密码
首先,你必须给 root 用户设置一个密码(Docker 容器默认 root 是没密码的):
bash
passwd root
输入两次密码(输入时屏幕不会显示,输完回车即可),看到 password updated successfully 即表示成功。
2. 使用 Vim 修改配置文件
执行以下命令打开配置文件:
bash
vim /etc/ssh/sshd_config
Vim 修改操作指南(请按顺序操作):
-
进入编辑模式 :按键盘上的
i键(左下角出现-- INSERT --)。 -
修改端口配置:
-
找到
#Port 22这一行(通常在文件靠前的位置)。 -
去掉开头的
#号,使其变成高亮颜色。 -
修改后:
textPort 22
-
-
修改 Root 登录权限:
-
向下滚动,找到
#PermitRootLogin prohibit-password这一行。 -
去掉开头的
#号。 -
将
prohibit-password改为yes。 -
修改后:
textPermitRootLogin yes
-
-
保存退出 :按一下
Esc键退出编辑模式,然后输入:wq并回车(Write and Quit)。
第三步:启动 SSH 服务
这是最容易踩坑的地方!
Docker 容器不像虚拟机,安装完软件后不会自动启动服务,且重启容器后服务默认是关闭的。
1. 修复运行目录缺失问题
SSH 启动时需要一个特定的目录,有时候安装过程不会自动创建:
bash
mkdir -p /var/run/sshd
2. 启动服务
执行以下命令:
bash
/etc/init.d/ssh start
# 或者
service ssh start
当你看到类似 * Starting OpenBSD Secure Shell server sshd [ OK ] 的提示,说明服务启动成功了。
第四步:验证 SSH 是否成功
在配置客户端之前,我们先在容器内部自测一下。
1. 检查进程
查看 SSH 进程是否在运行:
bash
ps -e | grep ssh
如果有输出 sshd,说明进程活了。
2. 外部连接测试
现在回到你的宿主机(也就是你原本的终端,不是 Docker 里面的),测试连接。
假设你的 Docker 启动命令映射了端口(例如 -p 2223:22):
bash
# 这里的 2223 是你映射到宿主机的端口
ssh root@localhost -p 2223
输入刚才设置的密码。如果能成功进入,恭喜你,大功告成!
避坑指南(常见问题)
Q1: 为什么容器重启后,SSH 又连不上了?
- 原因 :Docker 容器重启后,只会运行启动时的
CMD(通常是 bash),不会自动运行 SSH 服务。 - 解决 :每次重启容器 (
docker start) 后,都需要进入容器执行/etc/init.d/ssh start。
Q2: 连接时提示 Connection refused?
- 原因:要么 SSH 服务没开(参考第三步),要么端口映射错了。
- 检查 :使用
docker ps查看PORTS一栏,确保有类似0.0.0.0:xxxx->22/tcp的显示。
Q3: FileZilla 怎么连?
- 协议 :选择 SFTP (SSH File Transfer Protocol)。
- 主机 :
localhost(如果容器在本地)。 - 端口:你映射出来的端口(如 2223)。
- 用户/密码 :
root和你设置的密码。