【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 和你设置的密码。
相关推荐
C_心欲无痕6 小时前
Dockerfile:构建 Docker 镜像
运维·docker·容器
C_心欲无痕8 小时前
Docker 本地部署 CSR 前端项目完整指南
前端·docker·容器
YounGp_oo9 小时前
一次内网开发环境访问方式的改进实践:使用 FRP 替代远程桌面
网络·ssh·frp·内网穿透·开发环境
飞翔沫沫情11 小时前
MinIO 新版本 Docker 部署指南:告别 Web 控制台,拥抱 CLI 管理
docker·容器·docker-compose·对象存储·minio
令狐少侠201111 小时前
docker基本操作 部署启动nginx
nginx·docker·容器
攀小黑12 小时前
docker 部署rabbitmq消息队列并安装延迟队列插件
docker·容器·rabbitmq
虚神界熊孩儿13 小时前
Linux下修改docker和harbor默认网段的方法
linux·docker·harbor
木叶子---13 小时前
Docker
运维·docker·容器
Cyber4K13 小时前
【Kubernetes专项】K8s集群1.31版本安装手册
linux·docker·云原生·容器·kubernetes
凯子坚持 c14 小时前
基于Docker的SD-WAN组网方案:利用节点小宝实现服务器远程开发
服务器·docker·容器