之前的attach、exec命令无法解决远程连接管理容器的需求,所以考虑为其添加ssh服务。
添加ssh服务有两种方法:基于docker commit命令和Dockerfile创建。
方法1:docker commit
commit支持用户提交自己对定制容器的修改,并生成新的镜像。格式为:docker commit CONTATINER [REPOSITORY[:TAG]]
前期工作
创建容器
docker run -it ubuntu bash
更新apt缓存和安装openssh-server
apt-get update -y ;apt-get install -y openssh-server
启动ssh服务
如果要正常启动ssh服务,/var/run/sshd必须存在,手动创建并启动ssh服务:
mkdir -p /var/run/sshd
/usr/sbin/sshd -D &
查看端口
netstat -tunlp
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 3606/sshd
tcp6 0 0 :::22 :::* LISTEN 3606/sshd
修改ssh服务的安全登录配置,取消pam登录限制
sed -ri 's/session required pam_loginuid.so/#session required pam_loginuid.so/g' /etc/pam.d/sshd
把宿主主机的ssh公钥传给容器
使用复制法,略
创建自启动ssh服务的脚本,添加可执行权限
vi /run.sh
#!/bin/bash
/usr/sbin/sshd -D
chmod +x /run.sh
最后,退出容器
保存镜像
使用docker commit命令生成一个新的镜像:
docker commit [id] [name:tag]
使用docker images查看拥有的镜像,发现已经创建好了。
使用镜像
使用镜像的时候可以考虑端口映射
docker run -p 65533:22 -d ubuntu-ssh /run.sh
然后在网络可达的任意主机使用以下命令进行容器的ssh登录:
ssh [docker-server] -p 65533
方法2 :使用Dockerfile创建
Dockerfile类似于自动化运行的脚本,其内容就是格式化的docker commit,适用于快速批量部署。
创建工作目录
创建一个文件夹,包含Dockerfile和之前所用的run.sh文件
mkdir sshd_ubuntu
cd sshd_ubuntu/
touch Dockerfile run.sh
run.sh内容和上面的一样。
把宿主机的id_rsa.pub写入authorized_keys文件
ssh-keygen
...
cat /root/.ssh/id_rsa.pub > authorized_keys
编写Dockerfiles
把commit涉及到的命令格式化写入
#继承镜像
FROM ubuntu
#提供作者信息
MAINTAINER jason
#更新apt
RUN apt-get update
#安装ssh服务
RUN apt-get install -y openssh-server
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
#复制配置文件到相应目录,赋予权限
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 ubuntu:dockerfile .
在创建过程中,docker会自动删除一些中间层,看到
Successfully built 6c2729dabfd0
Successfully tagged ubuntu:dockerfile
时证明镜像创建完毕,可以用docker images查看
生成容器
# docker run -d -p 65500:22 ubuntu:dockerfile
#docker ps
#ssh [docker server] -p 65500
如此,就进入了容器。