淺析docker容器如何配置ssh連接和如何以Dockerfile的方式創建ssh直連docker容器


一、需求背景

  我們要做一個在線能力實驗平台,xterm 連接服務器進行 ssh 連接及相關操作實現了(見之前博客)。現在需要的是不同用戶選擇不同場景(比如不同數據庫)進行練習。起初想到的是通過 ssh 連接服務器,然后再通過命令行模式進入容器:docker run -it ubuntu /bin/bash,這樣有個問題就是:如果退出容器 exit 時,就退到了服務器,這樣別人就可以在服務器上做一些操作,不安全。后來了解到可以通過 ssh 連接容器,這樣 exit 退出容器時,就直接退出了 ssh,不會退到服務器。

  查了資料之后了解到:centos容器安裝配置ssh,就可以通過ssh工具連接了。

二、centos 容器配置 ssh 連接

1、下載centos鏡像

docker pull centos

2、運行容器

docker run -it --name mycontainer -p 9022:22 --privileged centos /usr/sbin/init

  將容器的22端口映射到主機的9022端口

  --privileged=true 給容器訪問Linux內核特權,后面要訪問systemctl

  注意:必須加上--privileged  /usr/sbin/init,以特權模式運行容器,否則當容器使用 systemctl 啟動 sshd 服務時會報錯:Failed to get D-Bus connection: Operation not permitted

原因轉自:https://blog.csdn.net/zhenliang8/article/details/78330658

Docker的設計理念是在容器里面不運行后台服務,容器本身就是宿主機上的一個獨立的主進程,也可以間接的理解為就是容器里運行服務的應用進程。

一個容器的生命周期是圍繞這個主進程存在的,所以正確的使用容器方法是將里面的服務運行在前台。

再說到 systemd,這個套件已經成為主流 Linux 發行版(比如CentOS7、Ubuntu14+)默認的服務管理,取代了傳統的 SystemV 風格服務管理。systemd 維護系統服務程序,它需要特權去會訪問Linux內核。而容器並不是一個完整的操作系統,只有一個文件系統,而且默認啟動只是普通用戶這樣的權限訪問Linux內核,也就是沒有特權,所以自然就用不了!

因此,請遵守容器設計原則,一個容器里運行一個前台服務!

3、安裝ssh服務

yum -y install openssh-server yum -y install openssh-clients

  修改配置:

vi /etc/ssh/sshd_config RSAAuthentication yes #啟用 RSA 認證 PubkeyAuthentication yes #啟用公鑰私鑰配對認證方式 AuthorizedKeysFile .ssh/authorized_keys #公鑰文件路徑(和上面生成的文件同) PermitRootLogin yes #root能使用ssh登錄

  修改root用戶密碼:進入容器后,使用passwd密碼來修改密碼(如提示沒有這個命令行使用yum install passwd安裝)

# passwd root Changing password for user root. New password: BAD PASSWORD: The password is shorter than 8 characters Retype new password: passwd: all authentication tokens updated successfully.

4、啟動sshd服務

#啟動
systemctl start sshd
 
#設置開機自啟動
systemctl enable sshd

5、root用戶設置密碼

passwd

  密碼得安裝sshd服務后設置,否則ssh連接一起提示密碼錯誤。

6、ssh連接容器

  • 通過主機端口映射連接:ssh -p 9022 root@主機ip
  • 直接連接容器(需要網絡通):ssh -p 22 root@容器ip

三、以Dockerfile的方式創建ssh直連docker容器

1、創建 Dockerfile 文件

# 生成的新鏡像以centos7鏡像為基礎 FROM centos:8 # 升級 yum 源,全選 yes 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 # 生成sshkey RUN ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key # 變更root密碼 RUN echo "root:12345"|chpasswd # 開放22端口 EXPOSE 22 # 運行腳本,啟動sshd服務 CMD ["/usr/sbin/sshd", "-D"]

2、根據 Dockerfile 文件構建鏡像:docker build -t centos8_ssh:test .

  命令成功后,就會創建一個名字為centos8_ssh的image,可以使用“docker images”來查看

3、根據鏡像啟動容器:docker run -d -P 23:22 --name=ssh_test_8 centos8_ssh:test

4、通過端口映射即可連接 ssh 了:ssh -p 23 root@localhost


免責聲明!

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



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