通常状况下,linux系统管理员经过ssh服务来管理操做系统,可是docker的不少镜像是不带ssh服务的,那么咱们怎么样才能管理操做系统呢?linux
咱们学过attach ,exec的命令进入容器的方法,可是都没法解决远程管理容器的问题,所以,咱们须要远程登陆到容器内进行一些操做的时候,就须要ssh的支持了。docker
如下的镜像基于docker commit命令建立。ubuntu
docker run -it -v /opt/ssh:/opt/ssh ubuntu:14.04 /bin/bash
解释一下:缓存
基于ubuntu的14.04版本的镜像启动一个容器安全
-it是为了让docker分配一个伪终端,并绑定到标准输入上,且让容器的标准输入保持打开。bash
-v 后面的是将本地的/opt/ssh目录挂到容器的/opt/ssh上面去(若是容器里面的/opt下面没有ssh目录,则直接会建立ssh目录),是为了将宿主机上面的文件拷贝到容器里面去。(主要是为了将authorized_keys文件从宿主机拷贝到容器中的去)session
apt-get install openssh-server
通常会失败,这是由于ubuntu官方镜像中并无包含软件包的缓存文件,使用以下命令来更新软件源信息:ssh
apt-get update
再使用ui
apt-get install openssh-server
完成安装ssh服务了。spa
要正常启动ssh服务,须要目录/var/run/sshd存在,手动建立它,并启动服务:
mkdir -p /var/run/sshd /usr/sbin/sshd -D &
此时查看容器的22端口,已经处于监听状态:
netstat -untlp
修改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
将所退出的容器用docker commit命令保存为一个新的sshd:ubuntu镜像(个人例子中成功了ssh免密码登陆的是sshd3:ubuntu):
docker commit 容器id sshd:ubuntu
而后就可使用docker images查看本地生成的新镜像sshd:ubuntu.
启动容器,并添加端口映射10022 ---》22。其中10022是宿主机的端口,22是容器的ssh服务监听端口:
docker run -p 10022:22 -d sshd:ubuntu /run.sh
能够在宿主机和其余远程主机上,能够经过ssh访问10022端口来登陆容器:
我是在其余的远程主机上面来登陆的
容器的宿主机是172.16.81.99
而想要ssh登陆的主机是172.16.81.104
能够看获得咱们成功从172.16.81.104免密码登陆到172.16.81.99的ubuntu容器里面去了。能够管理这个容器了。