Docker 配置Linux容器远程SSH登录

在Docker日常运维中,原生CentOS基础镜像未预装SSH服务,无法直接通过远程终端登录容器进行调试与配置。同时容器网桥采用动态IP分配策略,容器重启、重建后IP会随机变动,易造成SSH连接断开、端口转发与服务映射规则失效。本文涵盖手动定制镜像与Dockerfile自动化构建镜像两种实现方案,完整讲解自定义Bridge隔离网桥、配置容器固定静态IP、部署SSH远程服务、开放Root登录权限、配置公网端口映射的全流程实操,一站式解决容器远程运维问题。

1、实操前必须保证Docker服务正常运行、无报错、无端口占用,执行以下命令开机自启并校验状态。

[root@localhost ~]# systemctl start docker
[root@localhost ~]# systemctl enable docker
[root@localhost ~]# systemctl status docker

docker.service - Docker Application Container Engine
Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; preset: disabled)
Active: active (running) since Mon 2026-08-24 08:33:24 CST; 3h 17min ago
Invocation: 245ead3ca1d84bd588b892db71983d88
TriggeredBy: docker.socket
Docs: https://docs.docker.com
Main PID: 5243 (dockerd)
Tasks: 29
Memory: 218.3M (peak: 592.5M)
CPU: 46.781s
CGroup: /system.slice/docker.service

2、以官方centos:7作为基础镜像,所有自定义配置均基于该镜像迭代,镜像拉取完成后,可查看镜像ID、大小等信息,该原生镜像为后续SSH服务定制的基础载体。

[root@localhost ~]# docker pull centos:7
Pulling from library/centos
2d473b07cdd5: Pull complete
Digest: sha256:9d4bcbbb213dfd745b58be38b13b996ebb5ac315fe75711bd618426a630e0987
Status: Downloaded newer image for centos:7
docker.io/library/centos:7

[root@localhost ~]# docker images
IMAGE ID DISK USAGE CONTENT SIZE EXTRA
centos:7 9d4bcbbb213d 299MB 76.1MB

3、容器中默认bridge网络为DHCP动态分配IP,容器重启、重建后IP会随机变化,直接导致SSH远程连接、端口转发规则失效。通过自定义Bridge网桥+指定固定网段,可实现容器永久静态IP,解决IP变动问题,同时实现多容器网络隔离。

执行命令可看到新增的mynetwork网桥,后续所有自定义容器均使用该网络,绑定固定静态IP

# 创建172.1.0.0/16网段网络
[root@localhost ~]# docker network create --subnet=172.1.0.0/16 mynetwork
846fa83c59b1e7aa72c92eb14aa24e0e7910c9ff0394daf05a9b9e8e4617b390

# 查询当前所有的网络网段
[root@localhost ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
6f26b73ea6e9 bridge bridge local
a6b53bf7cc9c host host local
846fa83c59b1 mynetwork bridge local
f29f4bd3c8b2 none null local

指定自定义网络并分配固定静态IP,后台启动容器

# 运行容器并指定默认IP地址
[root@localhost ~]# docker run -itd --name my_centos --net mynetwork --ip 172.1.0.2 centos:7 /bin/bash
dd8c0d5d9c71a475e4dde8fed8db5ebcb7c086721b24e65178c5d698b2666ab8

# 查询正在运行的容器信息
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
dd8c0d5d9c71 centos:7 "/bin/bash" 16 seconds ago Up 15 seconds my_centos

# 进入容器内部
[root@localhost ~]# docker exec -it my_centos /bin/bash
[root@dd8c0d5d9c71 /]#
[root@dd8c0d5d9c71 /]# uname -a
Linux dd8c0d5d9c71 6.12.0-254.el10.x86_64 #1 SMP PREEMPT_DYNAMIC Thu Jul 30 21:44:41 UTC 2026 x86_64 x86_64 x86_64 GNU/Linux

4、CentOS7官方默认YUM源为国外地址,下载速度慢、且官方已停止维护,极易出现超时、包不存在等报错。需清空默认源,替换为阿里云高速镜像源。

[root@dd8c0d5d9c71 ~]# cd /etc/yum.repos.d/
[root@dd8c0d5d9c71 yum.repos.d]# rm -fr *
[root@dd8c0d5d9c71 yum.repos.d]# curl -k -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
[root@dd8c0d5d9c71 yum.repos.d]# yum clean all && yum makecache

5、远程连接需要服务端、客户端、密码认证、网络工具全套依赖,并配置系统默认ROOT密码等。

# 安装包
[root@dd8c0d5d9c71 yum.repos.d]# yum -y install net-tools passwd openssh openssh-server openssh-clients
Loaded plugins: fastestmirror, ovl
Loading mirror speeds from cached hostfile
* base: mirrors.cloud.aliyuncs.com
* extras: mirrors.cloud.aliyuncs.com
* updates: mirrors.cloud.aliyuncs.com
Package net-tools-2.0-0.25.20131004git.el7.x86_64 already installed and latest version
Package passwd-0.79-6.el7.x86_64 already installed and latest version
Package openssh-7.4p1-23.el7_9.x86_64 already installed and latest version
Package openssh-server-7.4p1-23.el7_9.x86_64 already installed and latest version
Package openssh-clients-7.4p1-23.el7_9.x86_64 already installed and latest version
Nothing to do

# 设置root密码
[root@dd8c0d5d9c71 yum.repos.d]# passwd
Changing password for user root.
New password:
BAD PASSWORD: The password is shorter than 8 characters
Retype new password:
passwd: all authentication tokens updated successfully.

6、SSH服务基于非对称加密实现通信安全,容器默认无主机密钥文件,未配置密钥会导致SSH服务启动失败、远程连接闪退。需手动生成RSA、ECDSA、ED25519三种主流加密密钥,适配所有终端连接方式。

[root@dd8c0d5d9c71 ~]# ssh-keygen -q -t rsa -b 2048 -f /etc/ssh/ssh_host_rsa_key -N ''
[root@dd8c0d5d9c71 ~]# ssh-keygen -q -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -N ''
[root@dd8c0d5d9c71 ~]# ssh-keygen -q -t ed25519 -f /etc/ssh/ssh_host_ed25519_key -N ''

7、SSH默认禁止Root账号远程登录,需手动修改配置文件,放开权限并监听所有网络地址,并配置一个开机自动运行SSHD服务的脚本。

[root@dd8c0d5d9c71 ~]# vi /etc/ssh/sshd_config
Port 22
AddressFamily any
ListenAddress 0.0.0.0
ListenAddress ::
PermitRootLogin yes

[root@dd8c0d5d9c71 ~]# vi /bin/RunSSH.sh
#!/bin/bash
/usr/sbin/sshd -D

[root@dd8c0d5d9c71 ~]# chmod +x /bin/RunSSH.sh
[root@dd8c0d5d9c71 ~]# exit
exit
[root@localhost ~]#

8、所有容器内配置完成后,通过docker commit命令将运行中的容器环境固化为新镜像,保存所有配置,实现复用。

# 将my_centos容器保存为centos_ssh镜像
[root@localhost ~]# docker commit my_centos centos_ssh
sha256:0b8040b8323e4811b83644397fa785b88f7262071a3bc99b35b1688d0c9665f0

# 查看镜像
[root@localhost ~]# docker images
IMAGE ID DISK USAGE CONTENT SIZE EXTRA
centos:7 9d4bcbbb213d 299MB 76.1MB U
centos_ssh:latest 0b8040b8323e 1GB 241MB

9、使用新镜像启动容器,此时已完成手动镜像构建,该镜像预装SSH服务、配置好YUM源、支持静态IP,可直接启动使用。

# 结束运行所有容器
[root@localhost ~]# docker rm -f $(docker ps -a -q)
93c84903ab3e
dd8c0d5d9c71
15f77598bc24

# docker原生端口映射方式
[root@localhost ~]# docker run -itd --name centos1 --net mynetwork --ip 172.1.0.2 -p 5423:22 centos_ssh /bin/RunSSH.sh
afe05aec48bb16fb925018e8b15fc510820dc96968d36ed74bcc024bdb730718

# 进入新容器centos1
[root@localhost ~]# docker exec -it centos1 /bin/bash
[root@dd8c0d5d9c71 /]#

10、容器端口映射后,默认无法被外网访问,需配置防火墙放行端口、配置端口转发,实现公网终端远程SSH连接容器。

# 配置端口转发
[root@localhost ~]# firewall-cmd --add-forward-port=port=5423:proto=tcp:toaddr=172.1.0.2:toport=22

# 放行宿主机5423端口
[root@localhost ~]# firewall-cmd --add-port=5423/tcp

# 保存永久生效
[root@localhost ~]# firewall-cmd --runtime-to-permanent

11、最后就可以使用外部CMD终端并传入-p端口号登录到容器的内部。

CMD> ssh root@8.140.234.178 -p 5423
The authenticity of host '[8.140.234.178]:5423 ([8.140.234.178]:5423)' can't be established.
ED25519 key fingerprint is SHA256.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '[8.140.234.178]:5423' (ED25519) to the list of known hosts.
root@8.140.234.178's password:
[root@dd8c0d5d9c71 ~]#

附加内容

手动构建镜像存在环境不可复用、配置不统一、操作繁琐、无法批量迭代等问题,仅适合学习测试。生产环境统一使用Dockerfile脚本化构建,将所有配置固化为代码,一键构建标准化镜像,可复用、可迁移、可批量部署。

通过把所有操作写进 Dockerfile,docker build自动化构建镜像,替代手工提交。

目录结构目录结构:centos_ssh/ 包含 Dockerfile(构建规则)、RunSSH.sh(容器启动脚本)两个核心文件。

[root@localhost centos_ssh]# ll
total 8
-rw-r--r-- 1 root root 1053 Aug 24 10:38 Dockerfile
-rw-r--r-- 1 root root 30 Aug 24 10:25 RunSSH.sh

[root@localhost centos_ssh]# cat RunSSH.sh
#!/bin/bash
/usr/sbin/sshd -D

[root@localhost centos_ssh]# cat Dockerfile
FROM centos:7
LABEL maintainer="docker_user <user@docker.com>"

# 替换阿里云yum源
RUN rm -fr /etc/yum.repos.d/* \
&& curl -k -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo \
&& yum clean all \
&& yum makecache

# 安装依赖
RUN yum install -y net-tools passwd openssh openssh-server openssh-clients \
&& yum clean all \
&& rm -rf /var/cache/yum/*

# SSH运行目录
RUN mkdir -p /var/run/sshd

# 生成SSH主机密钥
RUN ssh-keygen -q -t rsa -b 2048 -f /etc/ssh/ssh_host_rsa_key -N '' \
&& ssh-keygen -q -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -N '' \
&& ssh-keygen -q -t ed25519 -f /etc/ssh/ssh_host_ed25519_key -N ''

# ----------------容器ssh关键适配----------------

# 关闭UsePAM、权限隔离,注释pam_loginuid模块
RUN sed -i 's/^#UsePrivilegeSeparation.*/UsePrivilegeSeparation no/' /etc/ssh/sshd_config \
&& sed -i 's/^UsePAM.*/UsePAM no/' /etc/ssh/sshd_config \
&& sed -ri 's/^session required pam_loginuid.so/#session required pam_loginuid.so/' /etc/pam.d/sshd \
&& sed -i 's/^#PermitRootLogin.*/PermitRootLogin yes/' /etc/ssh/sshd_config

ADD RunSSH.sh /bin/RunSSH.sh
RUN chmod 755 /bin/RunSSH.sh

# 声明对外暴露22端口
EXPOSE 22

# 设置root密码root
RUN echo "root:root" | chpasswd

# 容器前台运行sshd作为主进程,容器不能退出
CMD ["/bin/RunSSH.sh"]

进入到目录下,并执行docker build命令完成构建任务。构建完成后镜像完全标准化,任意Docker环境均可直接部署使用,无需重复配置。

[root@localhost ~]# docker build -t centos7-ssh:v1 .
[root@localhost ~]# docker run -itd --name ssh-test --net mynetwork --ip 172.1.0.10 -p 5423:22 centos7-ssh:v1