Docker 添加容器SSH服務


很多時候我們需要登陸到容器內部操作,此時我們就需要開啟容器的SSH支持了,下面的小例子將具體介紹三種分配IP地址的方法,分別是pipworl分配,commit分配,Docker分配等.

基於commit命令創建

Docker提供了commit命令,支持用戶提交自己對定制容器的修改,並生成新的鏡像.這里將介紹如何用docker commit命令,添加SSH服務的操作流程,首先默認情況下ssh服務在鏡像里是沒有被安裝的,我們需要手動配置一下,后期生成鏡像啟動就方便啦.

1.首先我們先來使用Centos鏡像,放入后台並進入容器內部.

[root@localhost ~]# docker pull centos:latest
[root@localhost ~]# docker run -itd --name my_ssh --net=host centos:latest
[root@localhost ~]# docker exec -it my_ssh /bin/bash
[root@c59a63bbb /]# yum install -y passwd openssh openssh-server

2.如果需要正常啟動SSH服務,則目錄/var/run/sshd必須存在,手動創建它,並啟動SSH服務.

[root@c59a63bbb /]# mkdir -p /var/run/sshd
[root@c59a63bbb /]# /usr/sbin/sshd -D &

上面的啟動命令會報錯,這個錯誤解決方案是,執行下面命令,創建這些文件.

[root@c59a63bbb /]# ssh-keygen -q -t rsa -b 2048 -f /etc/ssh/ssh_host_rsa_key -N ''
[root@c59a63bbb /]# ssh-keygen -q -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -N ''
[root@c59a63bbb /]# ssh-keygen -t dsa -f /etc/ssh/ssh_host_ed25519_key -N ''

3.然后,修改/etc/ssh/sshd_config配置信息UsePAM yes改為UsePAM no,UsePrivilegeSeparation sandbox改為UsePrivilegeSeparation no,可以用vim修改,也可以用下面命令.

[root@c59a63bbb /]# sed -i "s/#UsePrivilegeSeparation.*/UsePrivilegeSeparation no/g" /etc/ssh/sshd_config
[root@c59a63bbb /]# sed -i "s/UsePAM.*/UsePAM no/g" /etc/ssh/sshd_config  不通過pam驗證

[root@c59a63bbb /]# sed -ri 's/session required pam_loginuid.so/#session
required pam_loginuid.so/g' /etc/pam.d/sshd

4.修改完后,重新啟動sshd服務,並修改一個root密碼.

[root@c59a63bbb /]# /usr/sbin/sshd -D
[root@c59a63bbb /]# echo "root" | passwd --stdin root
[root@c59a63bbb /]# echo "/usr/sbin/sshd -D &" >> /etc/profile

5.創建一個自啟動腳本文件,寫入一下內容.

[root@c59a63bbb /]# vi /run.sh
#!/bin/bash
/usr/sbin/sshd -D

[root@c59a63bbb /]# chmod +x run.sh
[root@c59a63bbb /]# exit

6.保存鏡像,將所退出的容器用commit命令保存為一個新的my_ssh:centos鏡像.

[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS
e1fc02dfd24f        centos:latest       "/bin/bash"         4 minutes ago       Up 4 minutes

[root@localhost ~]# docker commit e1fc my_ssh:centos
sha256:48997373aee923ee9b6af833de4aa9842dd090c7fee1f2569aa187e66b96231c

[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
myssh               centos              48997373aee9        25 seconds ago      280MB
centos              latest              1e1148e4cc2c        10 days ago         202MB
hello-world         latest              4ab4c602aa5e        3 months ago        1.84kB

7.啟動容器,並添加端口映射10000-->22.其中10000是宿主主機的端口,22是容器的SSH服務監聽端口.

[root@localhost ~]# docker run -itd -p 10000:22 my_ssh:centos
[root@localhost ~]# docker run -p 10000:22 -itd my_ssh:centos /run.sh

b0b073cf4bf933b291f0e0139220d09325e7dead7a1a77cacc243516c09ee931

8.在宿主主機或其他主機上上,可以通過SSH訪問10022端口來登錄容器.

[root@localhost ~]# ssh root@192.168.1.5 -P 10000

## 使用Dockerfile創建

上面的方式比較復雜,接下來我們來看一個簡單的,使用dockerfile的方式來創建一個Ubuntu鏡像.

1.首先,拉取一個基本鏡像,並創建一個sshd_ubuntu工作目錄.

[root@localhost ~]# docker pull ubuntu:latest

[root@localhost ~]# mkdir ssh_ubuntu
[root@localhost ~]# cd ssh_ubuntu/
[root@localhost ssh_ubuntu]# touch Dockerfile
[root@localhost ssh_ubuntu]# touch run.sh

2.編寫run.sh以及,在宿主主機上生成SSH密鑰對,並創建authorized_keys文件.

[root@localhost ssh_ubuntu]# vim run.sh
#!/bin/bash
/usr/sbin/sshd -D

[root@localhost ssh_ubuntu]# ssh-keygen -t rsa
[root@localhost ssh_ubuntu]# cat ~/.ssh/id_rsa.pub >authorized_keys
[root@localhost ssh_ubuntu]# cp -a authorized_keys /root/.ssh/

3.下面是Dockerfile的內容,這和commit命令創建鏡像過程,所進行的操作基本一致.

#設置繼承鏡像
FROM ubuntu:latest
#提供一些作者的信息
MAINTAINER docker_user (user@docker.com)
#下面開始運行更新命令
#RUN apt-get update
#安裝ssh服務
RUN apt-get install -y passwd openssh 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
#設置初始密碼
RUN echo "root"|passwd --stdin root
#設置自啟動命令
CMD ["/run.sh"]

4.創建鏡像,在sshd_ubuntu目錄下,使用build命令來創建鏡像.這里需要注意最后還有一個".",表示使用當前目錄中的Dockerfile

[root@localhost ~]# cd sshd_ubuntu
[root@localhost ssh_ubuntu]# docker build -t sshd:Dockerfile .

5.測試鏡像,運行容器,並通過ssh連接一下.

[root@localhost ~]# docker run -d -p 10122:22 sshd:Dockerfile
890c04ff8d769b604386ba4475253ae8c21fc92d60083759afa77573bf4e8af1
[root@localhost ~]# ssh 192.168.1.200 -p 10122

在Docker社區中,對於是否需要為Docker容器啟用SSH服務一直有爭論,反對方的觀點是:Docker的理念是一個容器只運行一個服務.因此,如果每個容器都運行一個額外的SSH服務,就違背了這個理念.另外認為根本沒有從遠程主機進入容器進行維護的必要.

使用pipwork分配

1.安裝Git工具,並克隆pipwork,放入可執行目錄,並給予相應的權限.

[root@localhost ~]# yum install -y git
[root@localhost ~]# git clone https://github.com/jpetazzo/pipework

[root@localhost ~]# cd pipework/
[root@localhost pipework]# cp -a pipework /usr/local/bin/
[root@localhost pipework]# chmod +x /usr/local/bin/pipework

2.將本機配置成網橋,使之能夠互相通信.

[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens32
[root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens32
DEVICE=eno16777728
TYPE=Ethernet
BOOTPROTO=static
BRIDGE=br0
NM_CONTROLLED=yes
ONBOOT=yes

[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-br0
[root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-br0
TYPE=Bridge
DEVICE=br0
BOOTPROTO=static
IPADDR=192.168.1.13
NETMASK=255.255.255.0
GATEWAY=192.168.1.1
DNS1=8.8.8.8
DNS2=114.114.114.114
ONBOOT=yes

[root@localhost ~]# reboot

3.下載一個Centos鏡像,並運行且指定--net="none",后期使用pipwork分配IP地址.

[root@localhost ~]# docker pull centos:latest

[root@localhost ~]# docker run -d --name my_ssh --restart=always --net="none" centos:latest
cf8354804431a7830a6a46999ac20240ad6402d505d3130789fdc4bbb227e4e3

4.通過命令分配IP地址,與子網掩碼.

[root@localhost ~]# pipework br0 鏡像名稱 192.168.1.100/24

[root@localhost ~]# docker inspect my_ssh |grep "IPAddress"
            "SecondaryIPAddresses": null,
            "IPAddress": "192.168.1.100/24",
                    "IPAddress": "192.168.1.100/24",

docker 給容器分配IP並可以連接SSH (新版)

1.首先創建子網

docker network create --subnet=172.1.0.0/16 mynetwork
docker network ls

2.為容器分配ip

docker run -itd --name lyshark --net mynetwork --ip 172.1.0.2 centos:latest /bin/bash
docker exec -it lyshark /bin/bash

3.安裝各種軟件

yum -y install net-tools passwd openssh-server openssh-clients
passwd root

4.執行ssh生成

ssh-keygen -q -t rsa -b 2048 -f /etc/ssh/ssh_host_rsa_key -N ''
ssh-keygen -q -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -N ''
ssh-keygen -t dsa -f /etc/ssh/ssh_host_ed25519_key -N ''

5.接着修改sshd_config文件配置信息

vi /etc/ssh/sshd_config

開啟 Port 22 注釋
將 PermitRootLogin 的 no 改為 yes

啟動ssh服務 /usr/sbin/sshd -D &

6.退出這個鏡像,然后打包成新的。

docker commit lyshark mycentos 制作新的鏡像

5.直接創建新的容器即可。

docker rm $(docker ps -a -q)

docker run -itd --name centos1 --net mynetwork --ip 172.1.0.2 mycentos /usr/sbin/init

docker exec -it lyshark /bin/bash

6.外網鏈接配置,將外網的5423端口映射到內網主機的 172.1.0.2:22口上,即可外部連接該容器

[root@localhost ~]# firewall-cmd --add-forward-port=port=5423:proto=tcp:toaddr=172.1.0.2:toport=22
success
[root@localhost ~]# firewall-cmd --add-port=5423/tcp
success

參考文獻:《Docker技術入門與實戰》《Docker基礎與實戰》


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM