【Docker实战】在容器内配置 SSH 服务:安装、Vim配置与连接验证(保姆级教程)

【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 修改操作指南(请按顺序操作):

  1. 进入编辑模式 :按键盘上的 i 键(左下角出现 -- INSERT --)。

  2. 修改端口配置

    • 找到 #Port 22 这一行(通常在文件靠前的位置)。

    • 去掉开头的 #,使其变成高亮颜色。

    • 修改后:

      text 复制代码
      Port 22
  3. 修改 Root 登录权限

    • 向下滚动,找到 #PermitRootLogin prohibit-password 这一行。

    • 去掉开头的 #

    • prohibit-password 改为 yes

    • 修改后:

      text 复制代码
      PermitRootLogin yes
  4. 保存退出 :按一下 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 和你设置的密码。
相关推荐
了一梨1 小时前
使用Docker配置适配泰山派的交叉编译环境
linux·docker
White-Legend3 小时前
支持docker一键部署了
运维·docker·容器
The star"'3 小时前
docker(6-10)
docker·容器·eureka
普罗米修斯Aaron_Swartz4 小时前
云主机(容器)内实现本地VNC访问
网络·docker
LSL666_6 小时前
docker概述
运维·docker·容器
cqsztech6 小时前
如何在Oracle linux9.6 安装docker软件
数据库·docker·oracle
码灵7 小时前
docker export 和 docker commit的区别
docker
jthou@hotmail.com7 小时前
远程服务器 Docker 环境配置指南
运维·服务器·docker