第一篇是生成docker容器後,在容器中執行各類命令安裝ssh,第二篇是用Dockerfile來實現的。寫的都很清楚,這裏再稍微延伸一點點。linux
一、在/root目錄下新建sshd_centos目錄用於存放Dockerfile和其餘相關文件。docker
mkdir sshd_centos #進入該目錄 cd sshd_centos
二、新建在容器中啓動sshd服務的腳本vim
vim run.sh
腳本內容以下:centos
#!/bin/bash /usr/sbin/sshd -D
三、在宿主機上生成RSA密鑰bash
ssh-keygen -t rsa -b 2048 -f /etc/ssh/ssh_host_rsa_key
而後將生成的密鑰複製到sshd_centos目錄中ssh
cp /etc/ssh/ssh_host_rsa_key /etc/ssh/ssh_host_rsa_key.pub /root/sshd_centos
cat ssh_host_rsa_key.pub>authorized_keys
五、在/root/sshd_centos目錄下新建Dockerfile文件ui
vim Dockerfile
Dockerfile內容:spa
#生成的新鏡像以centos鏡像爲基礎 FROM centos MAINTAINER by test(test@163.com) #升級系統 RUN yum -y update #安裝openssh-server RUN yum -y install openssh-server #修改/etc/ssh/sshd_config RUN sed -i 's/UsePAM yes/UsePAM no/g' /etc/ssh/sshd_config #將密鑰文件複製到/etc/ssh/目錄中 ADD ssh_host_rsa_key /etc/ssh/ssh_host_rsa_key ADD ssh_host_rsa_key.pub /etc/ssh/ssh_host_rsa_key.pub RUN mkdir -p /root/.ssh ADD authorized_keys /root/.ssh/authorized_keys #將ssh服務啓動腳本複製到/usr/local/sbin目錄中,並改變權限爲755 ADD run.sh /usr/local/sbin/run.sh RUN chmod 755 /usr/local/sbin/run.sh #變動root密碼爲test RUN echo "root:test"|chpasswd #開放窗口的22端口 EXPOSE 22 #運行腳本,啓動sshd服務 CMD ["/usr/local/sbin/run.sh"]
FROM centos,指明基礎鏡像,能夠先用docker search centos查看一下有哪些鏡像,這裏用的是官方鏡像:
RUN sed -i 's/UsePAM yes/UsePAM no/g' /etc/ssh/sshd_config 的意思是,編輯sshd的配置文件/etc/ssh/sshd_config,將其中UsePAM參數設置成「no」,
-i,直接修改並保存,
s,替換文本中的字符串
g,全面替換標記, /g 標記會替換每一行中的全部匹配,若是沒有g標記,則只有每行第一個匹配的被替換
sed命令詳見【http://man.linuxde.net/sed】
以下會匹配file文件中每一行的第一個book替換爲books:
sed -i 's/book/books/g' file
此時 /root/sshd_centos目錄下應該存在以下文件:.net
Dockerfile
run.sh
ssh_host_rsa_key
ssh_host_rsa_key.pub
六、使用docker build生成鏡像文件code
docker build -t centos_sshd:v1 .
注意命令最後面是一個」.」,這說明Dockerfile是在當前目錄下。
執行完成後,會在最後顯示相似以下:
Successfully built 21fbbc4
七、以新建立的鏡像新建容器
docker run -d -p 10022:22 centos_sshd:v1 /usr/local/sbin/run.sh
八、ssh鏈接容器
查看容器IP爲 172.17.0.2 :
docker inspect 容器ID
這裏其實已經接近尾聲了,可是鏈接容器浪費了幾乎一下午的時間,鏈接的時候老是以下提示:
ssh root@172.17.0.2 -p 10022
ssh: connect to host 172.17.0.2 port 10022: Connection refused
期間嘗試查看防火牆狀態:
service iptables status
防火牆轉發規則:
iptables -t nat -nL
容器中的配置文件等,無果,後來嘗試了以下成功了:
ssh root@172.17.0.2 -p 22
可是明明端口綁定到了10022,爲何會出現這種狀況?
原來鏈接容器要用宿主機的IP和綁定的端口,而不是用容器的IP,容器是宿主機的一個進程,用以下鏈接容器成功:
ssh root@92.168.195.1 -p 10022