一些进入容器的办法,比如attach、exec等命令,都无法解决远程管理容器的问题。因此,当我们需要远程登录到容器内进行一些操作的时候,就需要SSH的支持了。
有两种创建带有SSH服务的镜像:基于Docker commit命令创建和基于Dockerfile创建。
基于commit命令创建
Docker提供了docker commit命令,支持用户提交自己对制定容器的修改,并生产新的镜像。
命令格式:docker commit CONTAINER[REPOSITORY:[:TAG]]
1、准备工作
首先,使用ubuntu:14.04镜像来创建容器:docker run -it ubuntu:14.04 /bin/bash
更新apt缓存,并安装openssh-serverapt-get update;apt-get install -y openssh-server
2、安装和配置SSH服务
如果需要正常启动SSH服务,则目录/var/run/sshd必须存在,手动创建它,并启动SSH服务。1
2mkdir -p /var/run/sshd
/usr/sbin/sshd -D &
此时查看容器的22端口(ssh服务默认监听端口),可见此端口已经处于监听状态:1
2
3netstat -tlnp
//修改SSH服务的安全登录配置,取消pam登录限制
sed -ri 's/session required pam_loginuid.so/#session required pam_loginuid.so/g` /etc/pam.d/sshd
在root用户目录下创建.ssh目录,并复制需要登录的公钥信息(一般为本地主机目录下的.ssh/id_rsa.pub文件,可由ssh-keygen -t rsa命令生成)到authorized_keys文件中。
创建自动启动SSH服务的可执行文件run.sh。并添加可执行权限:1
2vi /run.sh
chmod +x run.sh
其中,run.sh脚本内容如下:1
2#!/bin/bash
/usr/sbin/sshd -D
最后,退出容器执行,exit命令。
3、保存镜像
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
4、使用镜像
启动容器,并添加端口映射10022-->22。其中10022是宿主主机的端口,22是容器的SSH服务端口:1
2
3
4//启动容器
docker run -p 10022:22 -d sshd:ubuntu /run.sh
//查看运行进程
docker ps
在宿主主机(192.168.1.200)或其他主机上,可以通过SSH访问10022端口来登录容器:1
ssh 192.168.1.200 -p 10022
使用Dockerfile创建
1、创建工作目录
创建一个ssh_ubuntu目录,mkdir ssh_ubuntu,并在其中创建Dockerfile和run.sh:1
touch Dockerfile run.sh
2、编写run.sh脚本和authorized_keys文件
1 | #!/bin/bash |
在宿主主机上生成SSH秘钥对,并创建authorized_keys文件:1
2ssh-keygen -t rsa
cat ~/.ssh/id_rsa.pub > authorized_keys
3、编写Dockerfile
1 | #设置基础镜像 |
4、创建镜像xd
在ssh_ubuntu目录下,使用docker build命令来创建镜像,这里注意还有一个”.”,表示使用当前目录中的Dockerfile:1
2cd ssh_ubuntu
docker build -t sshd:Dockerfile .
5、测试镜像,运行容器
1 | //启动镜像,映射容器22端口到本地的10122端口 |