1. 程式人生 > >docker-為容器新增ssh服務

docker-為容器新增ssh服務

之前的attach、exec命令無法解決遠端連線管理容器的需求,所以考慮為其新增ssh服務。

新增ssh服務有兩種方法:基於docker commit命令和Dockerfile建立。

方法1:docker commit

commit支援使用者提交自己對定製容器的修改,並生成新的映象。格式為:docker commit CONTATINER [REPOSITORY[:TAG]]

前期工作

建立容器
docker run -it ubuntu bash
更新apt快取和安裝openssh-server
apt-get update -y ;apt-get install -y openssh-server


啟動ssh服務
如果要正常啟動ssh服務,/var/run/sshd必須存在,手動建立並啟動ssh服務:

mkdir -p /var/run/sshd
/usr/sbin/sshd -D &

檢視埠

netstat -tunlp
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      3606/sshd       
tcp6       0
0 :::22 :::* LISTEN 3606/sshd

修改ssh服務的安全登入配置,取消pam登入限制
sed -ri 's/session required pam_loginuid.so/#session required pam_loginuid.so/g' /etc/pam.d/sshd

把宿主主機的ssh公鑰傳給容器
使用複製法,略

建立自啟動ssh服務的指令碼,新增可執行許可權

vi /run.sh
    #!/bin/bash
    /usr/sbin/sshd -D
chmod +x
/run.sh

最後,退出容器

儲存映象

使用docker commit命令生成一個新的映象:
docker commit [id] [name:tag]
使用docker images檢視擁有的映象,發現已經建立好了。

使用映象

使用映象的時候可以考慮埠對映

docker run -p 65533:22 -d ubuntu-ssh /run.sh

然後在網路可達的任意主機使用以下命令進行容器的ssh登入:

ssh [docker-server] -p 65533

方法2 :使用Dockerfile建立

Dockerfile類似於自動化執行的指令碼,其內容就是格式化的docker commit,適用於快速批量部署。

建立工作目錄

建立一個資料夾,包含Dockerfile和之前所用的run.sh檔案

mkdir sshd_ubuntu
cd sshd_ubuntu/
touch Dockerfile run.sh

run.sh內容和上面的一樣。

把宿主機的id_rsa.pub寫入authorized_keys檔案

ssh-keygen
...
cat /root/.ssh/id_rsa.pub > authorized_keys

編寫Dockerfiles

把commit涉及到的命令格式化寫入

#繼承映象
FROM ubuntu

#提供作者資訊
MAINTAINER jason 

#更新apt
RUN apt-get update 

#安裝ssh服務
RUN apt-get install -y openssh-server
RUN mkdir -p /var/run/sshd
RUN mkdir -p /root/.ssh

#取消pam限制
RUN sed -ri 's/session    required     pam_loginuid.so/#session    required     pam_loginuid.so/g' /etc/pam.d/sshd 

#複製配置檔案到相應目錄,賦予許可權
ADD authorized_keys /root/.ssh/authorized_keys
ADD run.sh /run.sh
RUN chmod 755 /run.sh

#開放埠
EXPOSE 22

#設定自啟動執行
CMD ["/run.sh"]

建立映象

在sshd_ubuntu目錄下,使用docker build命令建立映象:

cd sshd_ubuntu
docker build -t ubuntu:dockerfile .

在建立過程中,docker會自動刪除一些中間層,看到

Successfully built 6c2729dabfd0
Successfully tagged ubuntu:dockerfile

時證明映象建立完畢,可以用docker images檢視

生成容器

# docker run -d -p 65500:22 ubuntu:dockerfile
#docker ps 
#ssh [docker server] -p 65500

如此,就進入了容器。