通常狀況下,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容器裏面去了。能夠管理這個容器了。