Contents

Docker基于Alpine构建SSH服务

1. SSH (Secure Shell) 简介

SSH是最为常见的远程连接协议,其是可以帮助我们在互联网中使用Shell 的程序和协议。SSH 为我们在互联网中传递对服务器的操作,并对服务器返回的结果进行加密,以确保远程操作服务器时的安全;对服务器的远程操作,Shell程序比必然是输入指令和展示结果最有效的工具,每一位开发者或多或少都会对Shell程序有所了解;对于为运维人员,使用Shell程序更是家常便饭,对服务器的所有操作,以及查看监测服务器的状态都需要通过Shell程序。

2. SSH服务适用场景

通过SSH服务连接和访问到容器内部

通过SSH服务管理应用配置文件等,使用和配置隔离,防止因为服务被入侵后的安全问题;

2.1. sshd 服务启动方式

在Linux服务器系统中习惯以系统服务的方式启动Linux,但在Docker环境下,我们需要让容器绑定到sshd 服务的进程上,因此需要直接使用SSHD程序启动; 默认SSHD程序会被安装在/usr/sbin 下,并以守护进程的方式启动SSH 服务端程序;因此,我们需要通过 -D 参数使它转换到前台运行;

1# /usr/sbin/sshd -D 

当服务端程序启动之后,程序会监听默认端口 22 ,接收并响应客户端的请求,即通过客户端远程连接访问服务器。也可以在连接时,通过-p 参数连接自定义的端口。

3. Docker构建SSH服务镜像

3.1. SSH服务镜像说明

Alpine 开源,轻量linux 系统,适合轻量服务开发
OpenSSH ,SSHD服务程序、ssh 客户端等,远程连接访问工具

3.2. 创建Dockerfile目录

1 #  mkdir alpine_ssh && cd alpine_ssh && touch Dockerfile-ssh

3.3. 编辑Dockerfile 文件

 1 # 指定创建的基础镜像
 2 FROM alpine
 3 
 4 # 作者描述信息
 5 LABEL MAINTAINER "xzeu admin<@xzeu.com>"
 6 LABEL DESC "alpine_sshd_service"
 7 
 8 # 替换阿里云的并更新源、安装openssh 并修改配置文件和生成key 并且同步时间
 9 RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories \    
10	&& apk update \    
11	&& apk add --no-cache openssh tzdata \
12	&& cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
13	&& sed -i "s/#PermitRootLogin.*/PermitRootLogin yes/g" /etc/ssh/sshd_config \
14	&& ssh-keygen -t dsa -P "" -f /etc/ssh/ssh_host_dsa_key \
15	&& ssh-keygen -t rsa -P "" -f /etc/ssh/ssh_host_rsa_key \ 
16	&& ssh-keygen -t ecdsa -P "" -f /etc/ssh/ssh_host_ecdsa_key \
17	&& ssh-keygen -t ed25519 -P "" -f /etc/ssh/ssh_host_ed25519_key \
18	&& echo "root:admin" | chpasswd
19
20 # 开放22端口
21 EXPOSE 22
22 
23 # 容器启动时执行ssh启动命令
24 CMD ["/usr/sbin/sshd", "-D"]

3.4. 构建SSH服务镜像

通过Docker build 构建SSH服务:

 1 [root@localhost SSHD]# docker build -t mysshd:v2 .  
 2 Sending build context to Docker daemon  31.23kB
 3 Step 1/5 : FROM alpine:3.11
 4 ---> 3ddbc1193bef
 5 Step 2/5 : MAINTAINER alpine_sshd_service
 6 ---> Running in b6b66b0ccf32
 7 Removing intermediate container b6b66b0ccf32
 8 ---> 6e6bb1e10a62
 9 Step 3/5 : RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories     && apk update   && apk add --no-cache openssh tzdata     && cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime  && sed -i "s/#PermitRootLogin.*/PermitRootLogin yes/g" /etc/ssh/sshd_config      && ssh-keygen -t dsa -P "" -f /etc/ssh/ssh_host_dsa_key  && ssh-keygen -t rsa -P "" -f /etc/ssh/ssh_host_rsa_key         && ssh-keygen -t ecdsa -P "" -f /etc/ssh/ssh_host_ecdsa_key      && ssh-keygen -t ed25519 -P "" -f /etc/ssh/ssh_host_ed25519_key         && echo "root:admin" | chpasswd
10 ---> Running in 34d9ac38d4de
11 (1/10) Installing openssh-keygen (8.1_p1-r0)
12 (2/10) Installing ncurses-terminfo-base (6.1_p20200118-r4)
13 (3/10) Installing ncurses-libs (6.1_p20200118-r4)
14 (4/10) Installing libedit (20191211.3.1-r0)
15 (5/10) Installing openssh-client (8.1_p1-r0)
16 (6/10) Installing openssh-sftp-server (8.1_p1-r0)
17 (7/10) Installing openssh-server-common (8.1_p1-r0)
18 (8/10) Installing openssh-server (8.1_p1-r0
19 (9/10) Installing openssh (8.1_p1-r0)
20 (10/10) Installing tzdata (2020a-r0)
21 Executing busybox-1.31.1-r9.trigger
22 OK: 15 MiB in 24 packages
23 ........
24 chpasswd: password for 'root' changed
25 Removing intermediate container 34d9ac38d4de
26 ---> 86b646b9401a
27 Step 4/5 : EXPOSE 22
28 ---> Running in 51f292956b6e
29 Removing intermediate container 51f292956b6e
30 ---> aef65d0f8331
31 Step 5/5 : CMD ["/usr/sbin/sshd", "-D"]
32 ---> Running in 6abd00112f70
33 Removing intermediate container 6abd00112f70
34 ---> 5c8359952fca
35 'Successfully' built 5c8359952fca
36 Successfully tagged mysshd:v2

3.5. 通过创建的SSH服务镜像创建SSH服务容器

1 [root@localhost SSHD]# docker run -d --name sshdocker -P mysshd:v2
2609dd1c2f1f97098a244af988d805a16fb2ac8d8045dd48f45f2bb9a35bd68b4
3 [root@localhost SSHD]# docker ps
4 CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                        NAMES
5 609dd1c2f1f9        mysshd:v2           "/usr/sbin/sshd -D"      3 seconds ago       Up 2 seconds        0.0.0.0:32769->22/tcp                        sshdocker

3.6. 通过ssh 客户端连接SSH服务容器

通过ssh 客户端连接SSH服务容器,来进行容器内的访问和管理;

 1 [root@localhost SSHD]# ssh -p 32769 root@192.168.5.128
 2 The authenticity of host '[192.168.5.128]:32769 ([192.168.5.128]:32769)' can't be established.
 3 ECDSA key fingerprint is SHA256:6WCdoR+cRGc7qHuIqInuIa0XQ1XnaaXUJsLHrIjwVyw.
 4 ECDSA key fingerprint is MD5:d4:b7:82:43:8e:90:01:df:c7:29:85:89:ff:98:59:27.
 5 Are you sure you want to continue connecting (yes/no)? yes
 6 Warning: Permanently added '[192.168.5.128]:32769' (ECDSA) to the list of known hosts.
 7 root@192.168.5.128's password:
 8 Welcome to Alpine!
 9
10 The Alpine Wiki contains a large amount of how-to guides and general
11 information about administrating Alpine systems.
12 See <http://wiki.alpinelinux.org/>.
13
14 You can setup the system with the command: setup-alpine
15
16 You may change this message by editing /etc/motd.
17
18 609dd1c2f1f9:~# cat /etc/issue
19 Welcome to Alpine Linux 3.11
20 Kernel \r on an \m (\l)
21
22 # 查看当前目录
23 609dd1c2f1f9:~# pwd  
24 /root

4. 总结:

到此一个简单的SSH服务容器的镜像生成到完成远程的链接访问就完成,接下来,我会通过数据卷管理容器,以实现将程序拆分到不同的容器中,形成不同容器中的微服务。利用数据卷容器封装特性,更好的将动态代码、程序的配置管理、输出日志的导出等文件,实现快速迁移的便利。为数据迁移提供良好的适应性与项目中对Docker的使用提供了一致性保障。