为镜像添加SSH服务
单纯进入本地容器可以通过attach,exec的方法,但是远程登录到容器内则需要SSH(Secure Shell)的支持。
1.通过docker commit命令创建
进入容器
$ docker run -it ubuntu:latest /bin/bash
更新apt缓存,安装openssh-server(命令如果一遍不成功就再来第二遍)
# apt-get update; apt-get install openssh-server -y
若需要正常启动SSH服务,则目录/var/run/sshd必须存在,并启动SSH服务
# mkdir -p /var/run/sshd
# /usr/sbin/sshd -D &
此时可以使用netstat工具查看,容器22端口已经处于监听状态
# netstat -tunlp(apt-get install net-tools安装netstat)
修改SSH服务安全登录配置,取消pam登录限制(用到sed编辑器)
# sed -ri 's/session required pam_loginuid.so/#session required pam_loginuid.so/g' /etc/pam.d/sshd
相当于把整行注释掉
现在本地主机获取宿主机公钥
$ sudo ssh-keygen -t rsa
$ sudo cat /root/.ssh/id_rsa.pub(创建在/root/.ssh/下面)
将那个文件的内容(公钥)复制到容器下面文件里
# mkdir root/.ssh
# vi /root/.ssh/authorized_keys
创建自动启动SSH服务的可执行文件run.sh
# vi /run.sh
# chmod +x run.sh
其中,run.sh脚本内容如下
#!/bin/bash
/usr/sbin/sshd -D
最后退出容器
# exit
保存镜像
$ docker commit fc1936ea8ceb sshd:ubuntu
![](https://img-blog.csdn.net/20171126042451792?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzc0MjMxOTg=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
2.通过Dockerfile创建实现ssh服务的镜像
创建工作目录,在其中创建Dockerfile文件和run.sh文件
$ mkdir sshd_ubuntu
$ cd sshd_ubuntu/
$ touch Dockerfile run.sh
编写run.sh脚本和authorized_keys文件
$ vi run.sh
#!/bin/bash
/usr/sbin/sshd -D
$ ssh-keygen -t rsa
...
$ cat ~/.ssh/id_rsa.pub > authorized_keys
(生成到sshd_ubuntu文件夹下)
编写Dockerfile文件:
FORM ubuntu:latest
MAINTAINER docker_user (user@docker.com)
RUN apt-get update
RUN apt-get install -y openssh-server
RUN mkdir -p /var/run/sshd
RUN mkdir -p /root/.ssh
RUN sed -ri 's/session required pam_loginuid.so/#session required pam_loginuid.so/g' /etc/pam.d/sshd
(ADD命令,从Dockerfile所在目录里复制authorized_keys文件添,复制到容器目录下的/root/.ssh/authorized_keys)
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命令来创建镜像,需要注意最后还有一个”.”
$ cd sshd_ubuntu
$ docker build -t sshd:dockerfile .
![](https://img-blog.csdn.net/20171126132328853?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzc0MjMxOTg=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
通过docker images查看镜像:
![](https://img-blog.csdn.net/20171126132456096?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzc0MjMxOTg=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
发现dockerfile创建的镜像大小相比更小一些