为Docker镜像添加SSH服务

容器内到底要不要运行sshd服务,这个话题应该能在知乎引起一场旷日持久的骂战。因为习惯的原因,很多人都把Docker当作一个性能更好的虚拟机用,到底有什么比较好的方法进入容器内调试?容器内是否应该默认存在一个公钥文件?定时任务该如何设置?监控怎么办?如此看来,把容器当虚拟机用还是很难。
其实,容器最初的理想是这样的:一个容器,一个进程,一个进程,一个服务。总结来说就是术业有专攻,一个容器只干一件事。然而现在很多人思维都没转变过来,理所当然的把容器当作虚拟机使用,上面所提到的一个容器只干一件事,一生只爱一个人,他们会用一个暴击式的理由来反驳你,远程登录容器怎么办?这确实是当下没有比较完美解决方案的一个问题。比较折中的方案是,用户通过ssh安全审计系统登录到运行Docker服务所在的机器,然后再通过docker exec命令进入容器。但当下依然有很多人因为奇奇怪怪的原因需要在容器里面跑SSHD服务,所以本文介绍下如何通过Dockerfile创建一个带sshd服务的镜像。

常用Dockerfile指令

INSTRUCTION Description
FROM 指定所创建镜像的基础镜像.
MAINTAINER 指定维护者信息.
RUN 制作镜像过程中运行的命令.
CMD 容器启动时 默认执行的命令.
ENTRYPOINT 指定镜像的默认入口.
LABEL 给镜像添加标签信息.
EXPOSE 声明镜像内服务所监听的端口.
ENV 指定环境变量.
ADD 添加指定文件到容器中 若是tar包,会自动解压到目标路径下.
COPY 复制本地主机中的文件到容器中.
跟[ADD]的区别在于,不能指定remore URL,也不会自动提取存档文件.
VOLUME 创建数据卷挂载点
USER 运行容器时的用户或者UID.
WORKDIR 配置工作目录.

ENTRYPOINT指令相关可参考这里

创建镜像源目录

[root@hqidi docker]# mkdir sshd_cenos
[root@hqidi docker]# cd sshd_cenos/
[root@hqidi sshd_cenos]# touch authorized_keys  Dockerfile  run.sh

编写run.sh脚本和authorized_keys文件

run.sh脚本内容:

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

在宿主机上生成SSH密钥,并生成authorized_keys文件

[root@hqidi sshd_cenos]# ssh-keygen -t rsa -P "" -f ~/.ssh/id_rsa
Generating public/private rsa key pair.
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
bb:99:99:b4:b6:75:92:69:bc:32:46:c9:f4:87:ce:5e root@hqidi
The key's randomart image is:
+--[ RSA 2048]----+
|                 |
|                 |
|                 |
|        .        |
|       oSo .     |
|        +ooo.    |
|       .ooB.E    |
|       .=Xo=     |
|       oO=o      |
+-----------------+
[root@hqidi sshd_cenos]# cat ~/.ssh/id_rsa.pub >authorized_keys

编写Dockerfile

#指定继承镜像
FROM centos
#提供一些作者的信息
MAINTAINER hqidi.com 
#搞事情
RUN yum -y install openssl openssh-server
RUN mkdir -p /root/.ssh
RUN sed -ri 's/session    required     pam_loginuid.so/#session    required     pam_loginuid.so/g' /etc/pam.d/sshd
RUN ssh-keygen -t dsa  -f  /etc/ssh/ssh_host_dsa_key 
RUN ssh-keygen -t rsa  -f  /etc/ssh/ssh_host_rsa_key
#添加配置文件到相应位置,并赋权
ADD authorized_keys /root/.ssh/authorized_keys
ADD run.sh /run.sh
RUN chmod 755 /run.sh

#声明端口
EXPOSE 22

#设置随容器启动的命令
CMD ["/run.sh"]

创建镜像

[root@hqidi sshd_cenos]# docker build -t sshd:hqidicom .
Sending build context to Docker daemon 4.096 kB
Step 1 : FROM centos
 ---> 3bee3060bfc8
Step 2 : MAINTAINER serverworld 
 ---> Running in de77e8dfbf9f
 ---> a6e6752bebd6
Removing intermediate container de77e8dfbf9f
Step 3 : RUN yum -y install openssl openssh-server
 ---> Running in 2d9693970c71
Loaded plugins: fastestmirror, ovl
Determining fastest mirrors
 * base: centos.ustc.edu.cn
 * extras: mirrors.zju.edu.cn
 * updates: mirrors.zju.edu.cn
 ……………………
 Step 4 : RUN mkdir -p /root/.ssh
 ---> Running in 5109e21c6805
 ---> 0c9b421e55b6
Removing intermediate container 5109e21c6805
Step 5 : ADD authorized_keys /root/.ssh/authorized_keys
 ---> 5be39377350d
Removing intermediate container 47b5764ddb53
Step 6 : ADD run.sh /run.sh
 ---> 871a7156cbef
Removing intermediate container 1acc06cc4a27
Step 7 : RUN chmod 755 /run.sh
 ---> Running in 9c3812848a87
 ---> e6fc70a3b844
Removing intermediate container 9c3812848a87
Step 8 : EXPOSE 22
 ---> Running in b25ab1bbd19b
 ---> 3d58d9fe5c8b
Removing intermediate container b25ab1bbd19b
Step 9 : CMD /run.sh
 ---> Running in af086b351af3
 ---> bec46aa68feb
Removing intermediate container af086b351af3
Successfully built bec46aa68feb

创建成功,体积有点大,应该删除下tmp文件清空下yum缓存的。

[root@hqidi sshd_cenos]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
sshd                hqidicom            bec46aa68feb        2 minutes ago       292.9 MB
docker.io/centos    latest              3bee3060bfc8        2 weeks ago         192.5 MB

测试镜像

[root@hqidi sshd_cenos]# docker run -d -p 20221:22 sshd:hqidicom
652c8895059c9332508fc4c3bb12a568165371cfde18543d407171d3063ff327

[root@hqidi ~]# docker ps -l
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                  NAMES
652c8895059c        sshd:hqidicom       "/run.sh"           4 minutes ago       Up 4 minutes        0.0.0.0:20221->22/tcp   sharp_mcnulty

[root@hqidi ~]# iptables -t nat -nvL |tail -1
    0     0 DNAT       tcp  --  !docker0 *       0.0.0.0/0            0.0.0.0/0            tcp dpt:20221 to:172.17.0.2:22

在宿主机打开一个新的终端,ssh登录到容器

[root@hqidi ~]# ssh 192.168.2.77 -p 20221
Last login: Wed Jun 21 03:43:37 2017 from 192.168.2.77
[root@2d20c4be7388 ~]# ps aux
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root          1  0.0  0.1  11628  1324 ?        Ss   03:43   0:00 /bin/bash /run.sh
root          5  0.0  0.3 105480  3912 ?        S    03:43   0:00 /usr/sbin/sshd -D
root         23  0.0  0.5 141660  5084 ?        Ss   03:45   0:00 sshd: root@pts/0
root         25  0.0  0.1  15172  1900 pts/0    Ss   03:45   0:00 -bash
root         38  0.0  0.1  50844  1692 pts/0    R+   03:45   0:00 ps aux

原创文章,转载请注明: 转载自笛声

本文链接地址: 为Docker镜像添加SSH服务

2 条评论

  • 自媒体网站 2017年6月23日 回复

    虽然用不上、也看不懂,但必须支持一下!

  • 姜辰 2017年7月1日 回复

    感觉ssh是为了方便从外部使用

发表评论

电子邮件地址不会被公开。 必填项已用*标注