容器内到底要不要运行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 条评论
虽然用不上、也看不懂,但必须支持一下!
感觉ssh是为了方便从外部使用