创建支持SSH的镜像(八)

本文详细介绍如何在Docker容器中安装和配置SSH服务,包括使用commit命令和Dockerfile两种方式创建镜像,以及如何设置自动启动SSH服务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一般情况下,Linux系统管理员通过SSH服务来管理操作系统,但Docker的很多镜像不带SSH服务的。

基于commit命令创建

准备工作

首先,使用ubuntu镜像来创建一个容器:

$ sudo docker run -it ubuntu /bin/bash
root@3c6ed6207883:/#

这时候是输入sshd是没有效果的,因为系统里面的软件源信息没有更新。

配置软件源

检查软件源,并使用apt-get update来更新软件源信息:

$ root@3c6ed6207883:/# apt-get update

安装和配置SSH服务

更新软件包缓存后,已经可以安装SSH服务了,选择主流的openssh-server作为服务端,可以看到需要下载安装众多的依赖软件包:

$ root@3c6ed6207883:/# apt-get install openssh-server
。。。
invoke-rc.d: could not determine current runlevel
invoke-rc.d: policy-rc.d denied execution of start.
Processing triggers for libc-bin (2.27-3ubuntu1) …
Processing triggers for ca-certificates (20180409) …
Updating certificates in /etc/ssl/certs…
0 added, 0 removed; done.
Running hooks in /etc/ca-certificates/update.d…
done.
Processing triggers for systemd (237-3ubuntu10.3) …

要正常启动SSH服务,需要目录/var/run/sshd存在,手动创建它,并启动服务:

$ root@3c6ed6207883:/#mkdir -p /var/run/sshd
$ root@3c6ed6207883:/# /usr/sbin/sshd -D &
[1] 3826

此时查看容器的22端口(SSH服务默认监听的端口),已经处于监听状态:

$ root@3c6ed6207883:/# netstat -tunlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 3826/sshd
tcp6 0 0 :::22 ::? LISTEN 3826/sshd

这儿有个问题,在使用netstat的时候会出现问题,这是因为镜像里缺少 net-tools这个包,自己apt-get install net-tools一下就可以了

修改SSH服务的安全登录配置,取消pam登录限制:
$ root@3c6ed6207883:/# sed -ri ‘s/session required pam-loginuid.so/#session required pam-loginuid.so/g’ /etc/pam.d/sshd

在root用户目录下创建.ssh目录,并复制需要登录的公钥信息(一般为本地主机用户目录下的.ssh/id_rsa.pub文件,可由ssh-keygen -t rsa命令生成)到authorized_keys文件中。

$ root@3c6ed6207883:/# mkdir root/.ssh
$ root@3c6ed6207883:/# ssh-keygen -t rsa
$ Generating public/private rsa key pair.
$ Enter file in which to save the key (/root/.ssh/id_rsa): /root/.ssh/authorized_keys
Overwrite (y/n)? y
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/authorized_keys.
Your public key has been saved in /root/.ssh/authorized_keys.pub.
The key fingerprint is:
SHA256:P4ywxwAy+ukXjPvfC7SMeEtP5nazhVYm2+eq6HKR+f4 root@3c6ed6207883
The key’s randomart image is:
±–[RSA 2048]----+
| |
| |
| o . |
| . o . |
|. o +oS o |
| …oo++* @ |
| +.+.BoB * . |
| …ooo+. + |
| .oooE… |
±—[SHA256]-----+

创建自动启动SSH服务的可执行文件run.sh

$ root@3c6ed6207883:/# vi /run.sh

run.sh脚本内容:

#!/bin/bash
/usr/sbin/sshd -D

给run.sh添加可执行权限:

$ chmod +x run.sh

最后退出容器:

$ root@3c6ed6207883:/# exit

保存镜像

将所退出的容器用docker commit命令保存为一个新的sshd:ubuntu镜像:

$ sudo docker commit 3c6 sshd:ubuntu

使用镜像

启动容器,并添加端口映射10022 ————>22。其中10022是宿主主机的端口,22是容器的SSH服务监听端口:

$ sudo docker run -p 10022:22 -d sshd:ubuntu /run.sh
8a2a425bea599fc9654289dd626352c92a412efbfa35e0fc64a3306040757fcf

启动成功后,可以在宿主主机上看到容器运行的详细信息:

$ ssh 192.168.43.216 -p 10022

使用Dockerfile创建

创建工作目录

首先应创建一个sshd_ubuntu工作目录:
$ mkdir sshd_ubuntu

在其中,创建Dockerfile和run.sh文件:
$ cd sshd_ubuntu/
$ touch Dockerfile run.sh

编写run.sh脚本和authorized_keys文件

脚本文件run.sh的内容与上面的一致:

#! /bin/bash
/usr/sbin/sshd -D

在宿主主机上生成SSH密钥对,并创建authorized_keys文件:

$ ssh-keygen -t rsa
<pre>Generating public/private rsa key pair.
Enter file in which to save the key (/home/huangyongpeng/.ssh/id_rsa): /home/huangyongpeng/.ssh/authorized_keys
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/huangyongpeng/.ssh/authorized_keys.
Your public key has been saved in /home/huangyongpeng/.ssh/authorized_keys.pub.
The key fingerprint is:
SHA256:dp3D0IzeKcH+5bjTtKkzSMZdle29wGkdp8P+frzbJGM huangyongpeng@huangyongpeng-Inspiron-5442
The key's randomart image is:
±–[RSA 2048]----+
| o|
| . + o+|
| = +.o++|
| o * B=.o|
| S.=.Ooo…|
| . .+o.=o. |
| o .ooE=.|
| . +o++=|
| o= +*|
±—[SHA256]-----+

编写Dockerfile

下面是Dockerfile的内容及部分的注释

#设置继承镜像
FROM ubuntu
#提供一些作者的信息
MAINTAINER from www.dockerpool.com by waitfish 

RUN apt-get update

#安装ssh服务
RUN apt-get install -y openssh-server
RUN mkdir -p /var/run/sshd
RUN mkdir -p /root/.ssh

#取消pam限制
 RUN sed -ri 's/session required pam-loginuid.so/#session required pam-loginuid.so/g' /etc/pam.d/sshd

#复制配置文件到相应位置,并赋予脚本可执行权限
ADD authorized_keys /root/.ssh/authorized_keys
ADD run.sh /run.sh
RUN chmod 755 /run.sh

#开放端口
EXPOSE 22

#设置自启动命令
CMD ["/run.sh"]

创建镜像

在sshd_ubuntu目录下,使用docker build命令来创建镜像,注意一下,在最后还有一个“.”,表示使用当前目录中的Dockerfile。

$ cd sshd_ubuntu
$ sudo docker build -t sshd:dockerfile .

测试镜像,运行容器

使用刚才创建的sshd:dockerfile镜像来运行一个容器。直接启动镜像,映射容器的22端口到本地10122端口:

$ sudo docker run -d -p 10122:22 sshd:dockerfile

在宿主主机新打开一个终端,连接到新建的容器:

$ ssh 192.168.43.216 -p 10122

成功就表示镜像创建成功。

### SSH镜像的含义及用途 SSH(Secure Shell)是一种网络协议,用于安全地远程访问计算机或其他设备。它提供了加密通信通道,能够保护数据传输的安全性和隐私性。而所谓的 **SSH镜像** 并不是一个严格定义的技术术语,但在某些上下文中可能指代以下几种情况: #### 1. 基于SSH服务的基础容器镜像Docker等容器技术中,“SSH镜像”通常是指预装了SSH服务器组件(如OpenSSH Server)的容器镜像。这种镜像的主要目的是允许用户通过SSH客户端连接到运行中的容器实例,从而实现对容器内部操作系统的管理和维护。 例如,在构建一个基于Debian或Ubuntu的操作系统镜像时,可以通过安装`openssh-server`来提供SSH支持: ```dockerfile FROM ubuntu:latest RUN apt-get update && \ apt-get install -y openssh-server && \ mkdir /var/run/sshd && \ echo 'root:somepassword' | chpasswd && \ sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config CMD ["/usr/sbin/sshd", "-D"] ``` 此脚本会创建一个带有启用状态下的SSH服务的容器镜像[^1]。当启动该容器并映射相应的端口后,外部用户即可借助标准SSH工具对其进行交互式控制。 #### 2. 使用SSH作为迁移手段的镜像处理方式 另一种解释涉及到了利用SSH来进行跨节点间的数据交换或者部署活动。“SSH镜像”的概念在此处更多体现为一种流程方法论——即采用SSH隧道配合其他命令完成诸如备份恢复、版本分发等工作流的一部分环节。比如下面这个例子展示了怎样把本地保存下来的Docker image文件压缩并通过SSH发送至远端再加载回目标环境中去[^3]: ```bash docker save <镜像名> | bzip2 | pv | ssh <用户名>@<主机名> 'cat | docker load' ``` 这里并没有实际意义上的所谓“SSH镜像”,而是整个过程中运用到了SSH协议保障链路安全性的同时完成了资源转移的任务。 #### 3. 虚拟化平台上的VNC与SSH关联应用案例 对于由libvirt驱动管理的KVM/QEMU虚拟机而言,虽然主要依赖图形界面展示其初始引导过程,但也可以结合SSH一起工作形成完整的解决方案路径。假如某台虚拟机遇到了显示异常等问题致使常规途径难以接入,则可以尝试调整相关参数重新暴露新的监听地址给外界可达范围内的合法请求者使用[^5]: - 修改XML描述文档增加额外选项:`<graphics type='spice' port='-1' tlsPort='-1'/>` - 执行必要的生命周期指令确保更改生效:`virsh define --file updated.xml && virsh start vmname` 最终达成的效果便是除了原有的GUI呈现形式之外还额外补充了一种文字模式下的备选方案可供选择切换之间相互补足各自优劣之处共同服务于业务需求之上。 --- ### 总结 综上所述,“SSH镜像”并非特指某一类具体产品形态;相反,它是围绕着SSH这一成熟可靠的网络安全机制所衍生出来的多种实践应用场景集合体的表现形式之一而已。无论是为了简化日常运维事务还是增强特殊状况下应急响应能力等方面均发挥出了不可替代的重要作用价值所在。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值