一般情况下,linux系统管理员通过ssh服务来管理操作系统,但是docker的很多镜像是不带ssh服务的,那么我们怎么样才能管理操作系统呢?
我们学过attach ,exec的命令进入容器的方法,但是都无法解决远程管理容器的问题,因此,我们需要远程登录到容器内进行一些操作的时候,就需要ssh的支持了。
以下的镜像基于docker commit命令创建。
1.首先使用ubuntu:14.04创建一个一个容器
docker run -it -v /opt/ssh:/opt/ssh ubuntu:14.04 /bin/bash
解释一下:
基于ubuntu的14.04版本的镜像启动一个容器
-it是为了让docker分配一个伪终端,并绑定到标准输入上,且让容器的标准输入保持打开。
-v 后面的是将本地的/opt/ssh目录挂到容器的/opt/ssh上面去,是为了将宿主机上面的文件拷贝到容器里面去。(主要是为了将authorized_keys文件从宿主机拷贝到容器中的去)
2.默认没有sshd服务,安装sshd服务
apt-get install openssh-server
一般会失败,这是因为ubuntu官方镜像中并没有包含软件包的缓存文件,使用如下命令来更新软件源信息:
apt-get update
再使用
apt-get install openssh-server
完成安装ssh服务了。
3.启动ssh服务
要正常启动ssh服务,需要目录/var/run/sshd存在,手动创建它,并启动服务:
mkdir -p /var/run/sshd
/usr/sbin/sshd -D &
此时查看容器的22端口,已经处于监听状态:
netstat -untlp
4.配置ssh服务
修改ssh服务的安全登录配置,取消pam登录限制:
sed -ri 's/session required pam_loginuid.so/#session required pam_loginuid.so/g' /etc/pam.d/sshd
将宿主机上面的authorized_keys拷贝到容器的/root/.ssh下面。
因为容器里面的/opt/ssh映射到了宿主机的/opt/ssh文件夹,所以宿主机的/opt/ssh里面的东西,都会在容器的/opt/ssh下面。
所以可以将该文件拷贝过去。
然后创建自动启动SSH服务的可执行文件run.sh,并添加可执行权限:
run.sh
#!/bin/bash
/usr/sbin/sshd -D
最后,退出容器
exit
5.保存镜像
将所退出的容器用docker commit命令保存为一个新的sshd:ubuntu镜像(我的例子中成功了ssh免密码登录的是sshd3:ubuntu):
docker docker commit 容器id sshd:ubuntu
然后就可以使用docker images查看本地生成的新镜像sshd:ubuntu.
6.使用镜像
启动容器,并添加端口映射10022 ---》22。其中10022是宿主机的端口,22是容器的ssh服务监听端口:
docker run -p 10022:22 -d sshd:ubuntu /run.sh
7.远程连接容器,来管理容器
可以在宿主机和其他远程主机上,可以通过ssh访问10022端口来登录容器:
我是在其他的远程主机上面来登录的
容器的宿主机是172.16.81.99
而想要ssh登录的主机是172.16.81.104
可以看得到我们成功从172.16.81.104免密码登录到172.16.81.99的ubuntu容器里面去了。可以管理这个容器了。