一些进入容器的办法,比如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-server
apt-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端口 |