Fork me on GitHub

Docker系列之《Dockerfile构建SSH服务镜像》

前言:这又是一篇对Dockerfile实例应用的文章,如果你将本站的几篇Dockerfile文章学完,相信你对docker的理解又提升了不少。

基于commit命令的方式

先运行一个centos或ubuntu镜像,然后安装ssh,然后commit镜像,然后运行即可;
大概步骤:

1
2
3
$ docker run -it centos 
$ yum install openssh-server openssh -y
$ docker commit 容器ID ssh:commit

上面就已经将容器配置好啦,接下来是使用容器

1
$ docker run -d -p 52113:22 ssh:commit /root/run.sh

基于Dockerfile的方式(推荐)

1、准备工作
创建一个存放Dockerfile相关文件的工作目录:

1
$ mkdir /root/Dockerfile/

在该目录下,需要创建3个文件:Dockerfile、run.sh和authorized_keys,Dockerfile用于构建镜像,run.sh是启动SSH服务的脚本文件,authorized_keys则是包含需要远程登录的用户公钥。
run.sh脚本文件的内容如下:

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

authorized_keys文件内容如下:
在宿主机上生成一对ssh密钥

1
2
$ ssh-keygen -t rsa    #一路回车即可
$ cat ~/.ssh/id_rsa.pub >authorized_keys

2、编写Dockerfile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#使用的基础镜像
FROM centos

#添加作者信息
MAINTAINER tanyanhong<tanyanhong@moxiu.net>

#安装阿里epel源
RUN rpm -ivh http://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm

#安装SSH服务
RUN yum install openssh openssh-server -y
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
RUN sed -i 's/HostKey \/etc\/ssh\/ssh_host_rsa_key/#HostKey \/etc\/ssh\/ssh_host_rsa_key/g' /etc/ssh/sshd_config
RUN sed -i 's/HostKey \/etc\/ssh\/ssh_host_ecdsa_key/#HostKey \/etc\/ssh\/ssh_host_ecdsa_key/g' /etc/ssh/sshd_config
RUN sed -i 's/HostKey \/etc\/ssh\/ssh_host_ed25519_key/#HostKey \/etc\/ssh\/ssh_host_ed25519_key/g' /etc/ssh/sshd_config

#添加认证文件和启动脚本
ADD authorized_keys /root/.ssh/authorized_keys
ADD run.sh /root/run.sh
RUN chmod u+x /root/run.sh

#暴露端口
EXPOSE 22

#设置默认的启动命令
CMD ["/root/run.sh"]

3、创建镜像
运行docker build目录,生成目标镜像:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
$ docker build -t docker.io/nicksors/ssh:latest /root/Dockerfile/
# -t 指定tag,我打了自己的仓库标签
Sending build context to Docker daemon 4.608 kB
Step 1 : FROM centos
---> 0584b3d2cf6d
Step 2 : MAINTAINER tanyanhong<tanyanhong@moxiu.net>
---> Running in 0364d111928e
---> c4adaaf68ddb
Removing intermediate container 0364d111928e
Step 3 : RUN rpm -ivh http://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm
---> Running in d351669fb7b4
warning: /var/tmp/rpm-tmp.cIXtaq: Header V3 RSA/SHA256 Signature, key ID 352c64e5: NOKEY
Retrieving http://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm
Preparing... ########################################
Updating / installing...
epel-release-7-8 ########################################
---> fdbef0ca575e
Removing intermediate container d351669fb7b4
Step 4 : RUN yum install openssh openssh-server -y
···略···
Removing intermediate container d6b4d4ece952
Step 11 : ADD authorized_keys /root/.ssh/authorized_keys
---> a9a0f7224e8d
Removing intermediate container 6133f320df7a
Step 12 : ADD run.sh /root/run.sh
---> 3c9ce2d1a03c
Removing intermediate container 2124700e28eb
Step 13 : RUN chmod u+x /root/run.sh
---> Running in f787f85cc2b4
---> 5e81e48e260f
Removing intermediate container f787f85cc2b4
Step 14 : EXPOSE 22
---> Running in d78bd239eeaf
---> 5598dc68af4d
Removing intermediate container d78bd239eeaf
Step 15 : CMD /root/run.sh
---> Running in e1bb50e4f1c7
---> 7ea2a68e47db
Removing intermediate container e1bb50e4f1c7
Successfully built 7ea2a68e47db

看到最后的Successfully built,就表明镜像成功生成了,其中7ea2a68e47db是镜像ID。
使用docker images命令查看本地镜像,可以看到我们刚刚生成的镜像,相关代码如下:

1
2
3
4
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/nicksors/ssh latest 7ea2a68e47db 25 minutes ago 354.8 MB
docker.io/centos latest 0584b3d2cf6d 2 weeks ago 196.5 MB

4、启动并连接容器

1
2
3
4
$ docker run -d -p 52113:22 --name=ssh docker.io/nicksors/ssh /root/run.sh
# 说明
-p 指定宿主机与容器的端口映射
镜像后面的/root/run.sh是启动镜像是需要执行的命令

然后再打开一个属主机终端,并ssh连接到容器里:

1
$ ssh 10.0.10.181 -p 52113

-------------本文结束感谢您的阅读-------------