創建支持帶有ssh服務鏡像的兩種方法
之前分享了一些容器的辦法,比如attach、exec等命令,但這些命令都無法解決遠程管理容器的問題。因此,需要遠程登錄到容器內進行操作的時候,就需要ssh的支持了。
一:基於commit命令創建
1.準備工作
[root@chengcheng ~]# cat /etc/redhat-release
CentOS Linux release 7.3.1611 (Core)
需要先安裝基礎軟件,我用的是最小化安裝,yum -y install unzip wget vim gcc* lrzsz yum-fastestmirror
然後安裝docker,可用一鍵安裝腳本curl -sSL https://get.docker.com/ | sh,更多方法請看我的另一篇博客
[root@chengcheng ~]# useradd cheng && echo "cheng" | passwd --stdin cheng(這一步我在裝系統是做過了)
[root@chengcheng ~]# usermod -aG docker cheng (這一步是用cheng這個用戶運行docker命令的時候不用sudo)
[root@chengcheng ~]# id cheng
uid=1000(cheng) gid=1000(cheng) groups=1000(cheng),994(docker)
2.使用ubuntu:17.10鏡像來創建一個容器,為ubuntu:18.04鏡像添加ssh服務。
運行docker run -it ubuntu:17.10 /bin/bash,報錯提示docker daemon running 沒運行
運行systemctl enable docker && systemctl start docker,再執行命令完美解決問題。
3.在容器內安裝軟件,嘗試使用sshd命令,發現容器中沒安裝此命令,鏡像是精簡鏡像,使用apt-get update更新軟件源信息。
apt-get install openssh-server && apt-get install vim net-tools && mkdir -p /var/run/sshd &&
4.查看端口是否開啟,netstat -anptu
5.修改ssh服務的安全登錄配置,取消pam登錄限制
sed -ri "s/session required pam_loginuid.so/#session required pam_loginuid.so/g" /etc/pam.d/sshd
6.root用戶下創建.ssh目錄,並復制需要登陸的公鑰信息,一般為本地用戶目錄下的.ssh/id_rsa.pub文件,可由ssh-key -t rsa命令生成到容器authorized_keys文件中。(此步可另外開一個終端,在宿主下運行ssh-key -t rsa,把.ssh/id_rsa.pub裏邊內容黏貼過來)
mkdir root/.ssh
vi /root/.ssh/authorized_keys
7.創建自啟動的可執行文件,並添加可執行權限
vi /run.sh
chmod +x run.sh
run.sh腳本內容如下
#!/bin/bash
/usr/sbin/sshd -D
8.保存為一個新的鏡像
docker commit -a "chengcheng" -m "my create ubuntu:17.10" 3c28ebc314e6 myubuntu/v1.0.1:17.10
9.啟動容器,添加端口映射
docker run -d -p 10022:22 myubuntu/v1.0.1:17.10 /run.sh
10.在宿主主機或其他主機上,可以通過ssh訪問10022端口來登陸容器
ssh 192.168.44.135 -p 10022
11.可看到最下面的紅色箭頭證明已經成功登錄到容器
二:使用Dockerfile創建
如果對Dockerfie文件還不太熟悉的可看我的另一篇博客 http://blog.51cto.com/12943999/2085761
1.創建工作目錄
mkdir sshd_ubuntu
cd sshd_ubuntu/
touch Dockfile run.sh
2.編寫run.sh腳本和authorized_keys文件
cat run.sh
#!/bin/bash
/usr/sbin/sshd -D
3.宿主機上生成ssh密鑰對,並創建authorized_keys文件
ssh-keygen -t rsa
cat ~/.ssh/id_rsa.pub > authorized_keys
4.編寫Dockerfile
cat Dockerfile
#This dockerfile uses the ubuntu:17.10
FROM ubuntu:17.10
MAINTAINER Username [email protected]
RUN apt-get update
RUN apt-get install openssh-server vim net-tools && mkdir -p /var/run/sshd
RUN sed -ri "s/session required pam_loginuid.so/#session required pam_loginuid.so/g" /etc/pam.d/sshd
RUN apt-get clean && apt-get autoclean && apt-get autoremove
ADD authorized_keys /root/.ssh/authorized_keys
ADD run.sh /run.sh
RUN chmod 755 /run.sh
EXPOSE 22
CMD [/run.sh]
5.構建鏡像
[root@chengcheng sshd_ubuntu]# docker build -t myubuntu/v1.0.2:17.10 .
這一步一直過不去,搞了半天也沒解決,心裏還在想著怎麽自動輸入yes,在RUN apt-get update後添加-y問題還是沒解決,最後瞎倒騰在這行前面(/etc/apt/source.list)追加了源,還是不行,網上說在使用apt-get安裝軟件時,需要加上"-y"的參數,如果不指定-y參數的話,apt-get命令會進入交互模式,需要用戶輸入命令來進行確認,但在docker環境中是無法響應這種交互的。所以就會造成安裝中斷這種問題。在RUN apt-get install openssh-server vim net-tools && mkdir -p /var/run/sshd這一行加了-y參數,完美解決問題。下面這份文件和上一份文件增加的部分是綠色,重要的還是加上-y參數,追加不追加源都可以的。
cat Dockerfile
#This dockerfile uses the ubuntu:17.10
FROM ubuntu:17.10
MAINTAINER Username [email protected]
RUN echo deb http://archive.ubuntu.com/ubuntu/ artful main restricted >> /etc/apt/source.list
RUN echo deb http://archive.ubuntu.com/ubuntu/ artful-updates main restricted >> /etc/apt/source.list
RUN echo deb http://archive.ubuntu.com/ubuntu/ artful universe >> /etc/apt/source.list
RUN echo deb-src http://archive.ubuntu.com/ubuntu/ artful universe >> /etc/apt/source.list
RUN echo deb http://archive.ubuntu.com/ubuntu/ artful-updates universe >> /etc/apt/source.list
RUN echo deb-src http://archive.ubuntu.com/ubuntu/ artful-updates universe >> /etc/apt/source.list
RUN echo deb http://archive.ubuntu.com/ubuntu/ artful multiverse >> /etc/apt/source.list
RUN echo deb http://archive.ubuntu.com/ubuntu/ artful-updates multiverse >> /etc/apt/source.list
RUN echo deb http://archive.ubuntu.com/ubuntu/ artful-backports main restricted universe multiverse >> /etc/apt/source.list
RUN apt-get update -y
RUN apt-get install -y openssh-server vim net-tools && mkdir -p /var/run/sshd
RUN sed -ri "s/session required pam_loginuid.so/#session required pam_loginuid.so/g" /etc/pam.d/sshd
RUN apt-get clean && apt-get autoclean && apt-get autoremove
ADD authorized_keys /root/.ssh/authorized_keys
ADD run.sh /run.sh
RUN chmod 755 /run.sh
EXPOSE 22
CMD [/run.sh]
[root@chengcheng sshd_ubuntu]#docker build -t myubuntu/v1.0.2:17.10 .
成功如上截圖,通過docker images可看到1983f49e9937
[root@chengcheng sshd_ubuntu]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
myubuntu/v1.0.2 17.10 1983f49e9937 17 minutes ago 245MB
myubuntu/v1.0.1 17.10 8aee079b2d8f 39 minutes ago 245MB
ubuntu 17.10 1af812152d85 8 days ago 98.4MB
ssh 192.168.11.435 -p 10122
三:小結
對於是否需要Docker容器啟用ssh服務網上說法不一,一種說法是Docker的理念是一個容器只提供一個服務,因此一個容器在運行一個ssh服務,違背了這個理念,另外認為根本沒有從遠程主機進入容器進行維護的必要。另一種說法是如果使用attach方法進入容器,經常會出現卡死的情況,雖然也可以通過exec方法從宿主機進入容器,但是如果從其他遠程主機進入容器依然沒有好的解決方案。不過話說回來,個人覺得使用ssh方法維護服務依然是Linux用戶較為熟悉的方式。
四:問題
1.出現的第一個問題
在鏡像構建完成後,會自動出現上述信息,要按Ctrl+C才能終止。
我的宿主機系統是CentOS Linux release 7.3.1611 (Core), 這是官方的一個說法:https://serverfault.com/questions/650377/linux-kernel-bug-w-netns-and-or-xen-guest-unregister-netdevice-waiting-for,說是一個bug。
2.出現的第二個問題
執行docker run -d -p 10122:22 myubuntu/v1.0.2:17.10不能成功進入容器,我在Dockerfile中定義了CMD [/run.sh],並賦予權限,為什麽不行,而docker run -d -p 10122:22 myubuntu/v1.0.2:17.10 ./run.sh成功啟動容器,實在想不明白,望本文有幸技術大牛看到能不吝賜教,謝謝!
創建支持帶有ssh服務鏡像的兩種方法