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
如此,就進入了容器。