1. 程式人生 > >創建支持帶有ssh服務鏡像的兩種方法

創建支持帶有ssh服務鏡像的兩種方法

Docker 虛擬化 Dockerfile

創建支持帶有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,更多方法請看我的另一篇博客

http://blog.51cto.com/12943999/2073117

[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 &&

/usr/sbin/sshd -D &

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服務鏡像的兩種方法