建立支持SSH服務的鏡像

簡介

  通常狀況下,Linux系統管理員經過SSH服務來管理操做系統,但Docker的不少鏡像是不帶SSH服務的,那麼咱們怎樣才能管理操做系統呢?
  在第一部分中咱們介紹了一些進入容器的辦法,好比用exec命令,可是這些命令都沒法解決遠程管理容器的問題。所以,當讀者須要遠程登陸到容器內進行一些操做的時候,就須要SSH的支持了。
  本文將具體介紹如何自行建立一個帶有SSH服務的鏡像,並詳細介紹兩種建立容器的方法:基於docker commit命令建立和基於Dockerfile建立。python

基於 commit 建立

  Docker 提供了 docker commit 命令,支持用戶提交本身對容器的修改,並生成新的鏡像。命令格式爲 docker commit CONTAINER [REPOSITORY[:TAG]]。
  這裏將介紹如何使用 docker commit 命令,爲 ubuntu 鏡像添加SSH服務。sql

準備工做

  首先,使用 ubuntu 鏡像來建立一個容器:docker

[root@gavin /]# sudo docker run -it ubuntu /bin/bash

  首先嚐試使用 SSHD 命令,你們會發現容器中並無安裝該服務:json

root@c8178608e454:/# sshd
bash: sshd: command not found

  同時,筆者從 apt 包管理器的軟件源信息中亦找不到啓動 SSH 服務須要的 openssh-server,這是由於 Ubuntu 官方鏡像中並無包含軟件包的緩存文件:ubuntu

root@c8178608e454:/# apt-get install openssh-server
Reading package lists... Done
Building dependency tree       
Reading state information... Done
E: Unable to locate package openssh-server

  下面,筆者將演示如何更新軟件包緩存,並安裝 SSHD 服務。vim

配置軟件源

  檢查軟件源,並使用 apt-get update 來更新軟件源信息:api

root@c8178608e454:/# apt-get update
Get:1 http://security.ubuntu.com/ubuntu bionic-security InRelease [88.7 kB]
Get:3 http://archive.ubuntu.com/ubuntu bionic-updates InRelease [88.7 kB]
Get:4 http://security.ubuntu.com/ubuntu bionic-security/multiverse amd64 Packages [4957 B]
...                                                                                              
Fetched 14.4 MB in 36s (404 kB/s)                                                                                                                                         
Reading package lists... Done

安裝和配置 SSH 服務

  更新軟件包緩存後,已經能夠安裝 SSH 服務了,選擇主流的 openssh-server 做爲服務端。能夠看到須要下載安裝衆多的依賴軟件包:緩存

root@c8178608e454:/# apt-get install openssh-server
...
done.
Processing triggers for systemd (237-3ubuntu10.28) ...

  要正常啓動 SSH 服務,須要目錄 /var/run/sshd 存在,手動建立它,並啓動服務:安全

root@c8178608e454:/# mkdir -p /var/run/sshd
root@c8178608e454:/# /usr/sbin/sshd -D &

  修改 SSH 服務的安全登陸配置,取消pam登陸限制:bash

root@c8178608e454:/# sed -ri 's/session required pam_loginuid.so/#session required pam_loginuid.so/g' /etc/pam.d/sshd

  在 root 用戶目錄下建立.ssh目錄,並複製須要登陸的公鑰信息(通常爲本地主機用戶目錄下的 .ssh/id_rsa.pub 文件,可由 ssh-keygen -t rsa命令生成)到 authorized_keys 文件中。

root@c8178608e454:/# mkdir root/.ssh
root@c8178608e454:/# vi /root/.ssh/authorized_keys

  建立自動啓動 SSH 服務的可執行文件 run.sh,並添加可執行權限:

root@c8178608e454:/# vi /run.sh                   
bash: vi: command not found

  此時發現沒法使用 vi 命令,這是由於vim沒有安裝,使用以下命令安裝:

root@c8178608e454:/# apt-get install vim
Reading package lists... Done
Building dependency tree       
Reading state information... Done
...
Processing triggers for libc-bin (2.27-3ubuntu1) ...

  建立自動啓動 SSH 服務的可執行文件 run.sh,並添加可執行權限:

root@c8178608e454:/# vi /run.sh
root@c8178608e454:/# chmod +x run.sh

  run.sh 腳本內容以下:

#!/bin/bash
/usr/sbin/sshd -D

  若是想要使用 root 登陸,須要修改 /etc/ssh/sshd_config,使得能夠直接使用 root 登陸(此步驟須要重啓後生效):

vim /etc/ssh/sshd_config

  /etc/ssh/sshd_config 追加內容以下:

PermitRootLogin yes
UsePAM no

  設置 root 密碼:

root@c8178608e454:/# passwd root
Enter new UNIX password: 
Retype new UNIX password: 
passwd: password updated successfully

  最後,退出容器:

root@c8178608e454:/# exit
exit

保存鏡像

  將所退出的容器用 docker commit 命令保存爲一個新的 sshd:ubuntu 鏡像:

[root@gavin /]# sudo docker commit c8178608e454 sshd:ubuntu
sha256:00eb7bf408ece207efae9a349b8d36d15d0c9c858ccb013e05561230c9e5c2ab

  使用 docker images 查看本地生成的新鏡像 sshd:ubuntu,目前擁有的鏡像以下:

[root@gavin /]# sudo docker images
REPOSITORY               TAG                 IMAGE ID            CREATED              SIZE
sshd                     ubuntu              00eb7bf408ec        About a minute ago   243MB
ubuntu                   latest              a2a15febcdf3        2 weeks ago          64.2MB

使用鏡像

  啓動容器,並添加端口映射 10022-->22。其中 10022 是宿主主機的端口,22 是容器的 SSH 服務監聽端口:

[root@gavin /]# sudo docker run -p 10022:22 -d sshd:ubuntu /run.sh
ec6a0c53dc5790a569d1eb7b63866856748fc39285f13ffb57e66cfcf5adb061

  啓動成功後,能夠在宿主主機上看到容器運行的詳細信息:

[root@gavin /]# sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS                   NAMES
ec6a0c53dc57        sshd:ubuntu         "/run.sh"           44 seconds ago      Up 43 seconds              0.0.0.0:10022->22/tcp   focused_knuth

  在宿主主機或其餘主機上,能夠經過 SSH 訪問 10022 端口來登陸容器 :

[root@gavin ~]# ssh 192.168.41.15 -p 10022
root@192.168.41.15's password: 
Welcome to Ubuntu 18.04.3 LTS (GNU/Linux 3.10.0-957.el7.x86_64 x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

This system has been minimized by removing packages and content that are
not required on a system that users do not log into.

To restore this content, you can run the 'unminimize' command.
Last login: Wed Sep  4 13:25:49 2019 from 192.168.41.15
root@bc419278a175:~# 

使用 Dockerfile 建立

  在第一部分中筆者曾介紹過 Dockerfile 的基礎知識,下面將介紹如何使用 Dockerfile 來建立一個支持 SSH 服務的鏡像。

建立工做目錄

  首先建立一個 sshd_ubuntu 工做目錄:

[root@gavin /]# mkdir sshd_ubuntu
[root@gavin /]# cd sshd_ubuntu/
[root@gavin sshd_ubuntu]# touch Dockerfile run.sh sources.list
[root@gavin sshd_ubuntu]# ls
Dockerfile  run.sh

  編寫 run.sh 腳本的內容與上一小節中一致:

#!/bin/bash
/usr/sbin/sshd -D

  更換源爲國內源(這裏用的是阿里源)下載速度快,編寫 source.list 內容:

deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse

deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse

deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse

deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse

deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse

  在宿主主機上生成 SSH 祕鑰對,並建立 authorized_keys 文件:

[root@gavin /]# ssh-keygen -t rsa
...
[root@gavin sshd_ubuntu]# cat ~/.ssh/id_rsa.pub >authorized_keys

編寫 Dockerfile

  下面是 Dockerfile 的內容及各部分的註釋,能夠發現,對比上一節中利用 docker commit 命令建立鏡像過程,所進行的操做基本一致。

# 設置繼承鏡像
FROM ubuntu

# 提供一些做者信息
MAINTAINER from gavin_g@qq.com

# 更換源爲國內源
ADD sources.list /etc/apt/ # 配置軟件源
RUN apt-get clean RUN apt
-get update --fix-missing # 安裝和配置 ssh 服務 RUN apt-get install -y 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 # 設置自啓動命令 CMD ["/run.sh"]

建立鏡像

  在 sshd_ubuntu 目錄下,使用 docker build 命令來建立鏡像。注意一下,在最後還有一個「.」,表示使用當前目錄中的 Dockerfile。

[root@gavin sshd_ubuntu]# sudo docker build -t sshd:dockerfile .

  若是讀者使用 Dockerfile 建立自定義鏡像,那麼須要注意的是 Docker 會自動刪除中間臨時建立的層,還須要注意每一步的操做和編寫的 Dockerfile 中命令的對應關係。
  執行 docker build 命令的輸出參考結果以下:

Sending build context to Docker daemon  4.608kB
Step 1/12 : FROM ubuntu
 ---> a2a15febcdf3
Step 2/12 : MAINTAINER from gavin_g@qq.com
 ---> Using cache
 ---> dc49243843b7
Step 3/12 : RUN apt-get update
 ---> Using cache
 ---> ce8282eea754
Step 4/12 : RUN apt-get install -y openssh-server
 ---> Running in 8ceb2d7d95fc
Reading package lists...
Building dependency tree...
Reading state information...
The following additional packages will be installed:
  ca-certificates dbus dmsetup file gir1.2-glib-2.0 krb5-locales libapparmor1
  libargon2-0 libbsd0 libcap2 libcryptsetup12 libdbus-1-3 libdevmapper1.02.1
  libedit2 libexpat1 libgirepository-1.0-1 libglib2.0-0 libglib2.0-data
  libgssapi-krb5-2 libicu60 libidn11 libip4tc0 libjson-c3 libk5crypto3
  libkeyutils1 libkmod2 libkrb5-3 libkrb5support0 libmagic-mgc libmagic1
  libmpdec2 libnss-systemd libpam-systemd libpsl5 libpython3-stdlib
  libpython3.6-minimal libpython3.6-stdlib libreadline7 libsqlite3-0
  libssl1.0.0 libssl1.1 libsystemd0 libwrap0 libx11-6 libx11-data libxau6
  libxcb1 libxdmcp6 libxext6 libxml2 libxmuu1 mime-support multiarch-support
  ncurses-term networkd-dispatcher openssh-client openssh-sftp-server openssl
  publicsuffix python3 python3-certifi python3-chardet python3-dbus python3-gi
  python3-idna python3-minimal python3-pkg-resources python3-requests
  python3-six python3-urllib3 python3.6 python3.6-minimal readline-common
  shared-mime-info ssh-import-id systemd systemd-sysv ucf wget xauth
  xdg-user-dirs xz-utils
Suggested packages:
  default-dbus-session-bus | dbus-session-bus krb5-doc krb5-user iw
  | wireless-tools keychain libpam-ssh monkeysphere ssh-askpass molly-guard
  rssh ufw python3-doc python3-tk python3-venv python-dbus-doc
  python3-dbus-dbg python3-setuptools python3-cryptography python3-openssl
  python3-socks python3.6-venv python3.6-doc binutils binfmt-support
  readline-doc systemd-container policykit-1
The following NEW packages will be installed:
  ca-certificates dbus dmsetup file gir1.2-glib-2.0 krb5-locales libapparmor1
  libargon2-0 libbsd0 libcap2 libcryptsetup12 libdbus-1-3 libdevmapper1.02.1
  libedit2 libexpat1 libgirepository-1.0-1 libglib2.0-0 libglib2.0-data
  libgssapi-krb5-2 libicu60 libidn11 libip4tc0 libjson-c3 libk5crypto3
  libkeyutils1 libkmod2 libkrb5-3 libkrb5support0 libmagic-mgc libmagic1
  libmpdec2 libnss-systemd libpam-systemd libpsl5 libpython3-stdlib
  libpython3.6-minimal libpython3.6-stdlib libreadline7 libsqlite3-0
  libssl1.0.0 libssl1.1 libwrap0 libx11-6 libx11-data libxau6 libxcb1
  libxdmcp6 libxext6 libxml2 libxmuu1 mime-support multiarch-support
  ncurses-term networkd-dispatcher openssh-client openssh-server
  openssh-sftp-server openssl publicsuffix python3 python3-certifi
  python3-chardet python3-dbus python3-gi python3-idna python3-minimal
  python3-pkg-resources python3-requests python3-six python3-urllib3 python3.6
  python3.6-minimal readline-common shared-mime-info ssh-import-id systemd
  systemd-sysv ucf wget xauth xdg-user-dirs xz-utils
The following packages will be upgraded:
  libsystemd0
1 upgraded, 82 newly installed, 0 to remove and 14 not upgraded.
Need to get 27.3 MB of archives.
After this operation, 118 MB of additional disk space will be used.
Get:1 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 libsystemd0 amd64 237-3ubuntu10.28 [204 kB]
Get:2 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 libssl1.1 amd64 1.1.1-1ubuntu2.1~18.04.4 [1300 kB]
Get:3 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 libpython3.6-minimal amd64 3.6.8-1~18.04.1 [533 kB]
...
Successfully built 18f9de8b84b7
Successfully tagged sshd:dockerfile

  命令執行完畢後,若是可見 「Successfully built xxx」字樣,則說明鏡像建立成功。能夠看到,以上命令生成的鏡像ID是 18f9de8b84b7。
  在本地查看 sshd:dockerfile 鏡像已存在:

[root@gavin sshd_ubuntu]# sudo docker images
REPOSITORY               TAG                 IMAGE ID            CREATED             SIZE
sshd                     dockerfile          18f9de8b84b7        5 minutes ago       207MB

測試鏡像,運行容器

  使用剛纔建立的 sshd:dockerfile 鏡像來運行一個容器。直接啓動鏡像,映射容器的 22 端口到本地的 10122 端口:

[root@gavin sshd_ubuntu]# sudo docker run -d -p 10122:22 sshd:dockerfile 
177ebf24952b871bd5de74a665d1bf962859f6f453e18c5d6b038df7be6c47ba
[root@gavin sshd_ubuntu]# sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS                   NAMES
177ebf24952b        sshd:dockerfile     "/run.sh"                4 seconds ago       Up 3 seconds                0.0.0.0:10122->22/tcp   vigorous_matsumoto

  在宿主機打開一個新的終端,鏈接到新建的容器:

[root@gavin sshd_ubuntu]# ssh 192.168.41.15 -p 10122
Welcome to Ubuntu 18.04.3 LTS (GNU/Linux 3.10.0-957.el7.x86_64 x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

This system has been minimized by removing packages and content that are
not required on a system that users do not log into.

To restore this content, you can run the 'unminimize' command.
Last login: Thu Sep  5 14:02:46 2019 from 192.168.41.15
root@177ebf24952b:~# 

  效果與上一節一致,鏡像建立成功。

 

這篇文章是我學習 Docker 的記錄,內容參考自《Docker技術入門與實戰》
相關文章
相關標籤/搜索