基於 Dockfile 給映象增加 SSH 服務

alalala發表於2019-08-15

使用 Dockfile 給映象上增加 ssh 服務。

佈置環境

阿里雲輕量應用伺服器 映象資訊:Ubuntu 16.04

拉取 ubuntu:latest 映象

docker pull ubuntu:latest

完成後,檢視映象是否成功下載

~ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              latest              3556258649b2        3 weeks ago         64.2MB

建立工作目錄

新建 sshd-ubuntu 資料夾

mkdir sshd_ubuntu

在其中新建 Dockerfilerun.sh 檔案

cd sshd_ubuntu
touch Dockerfile run.sh

編寫 run.sh 和 authorized_keys 檔案

  • run.sh 此處書寫 容器執行時 執行的命令
    #!/bin/bash
    /usr/sbin/sshd -D
  • authorized_keys 此處書寫宿主機中生成的 ssh 公鑰
    ssh-keygen -t rsa 
    cat ~/.ssh/id_rsa.pub > authorized_keys

編寫 Dockerfile

#設定繼承映象
FROM ubuntu:latest

#作者資訊
MAINTAINER docker_user (user@docker.com)

#先更新快取,安裝ssh服務
RUN apt-get update \
    && apt-get install -y openssh-server \
    &&  mkdir -p /var/run/sshd \
    && 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"]
  • RUN 執行指定命令。格式為 RUN commend 或 RUN ["executable", ”paraml”, ”param2"]

    前者是在 shell 終端執行,即 /bin/sh -c ; 後者指令會被解析為 json,所以必須為雙引號使用 exec 執行,不啟動 shell 環境。
    每條 RUN 指令將在當前映象基礎上執行指定命令,並提交為新的映象層 ,所以,RUN命令能合併則合併,儘量減少映象層。

  • CMD 用來指定啟動容器時預設執行的命令 。 CMD ["executable ",”paraml ” , "param2 "]

    每個 Dockerfile 中只能有一條CMD命令,多條的話,只有最後一條執行。
    如果使用者啟動容器時候手動指定了執行的命令(作為 run 命令的引數),則會覆蓋掉
    CMD 指定的命令 。

  • ADD 新增內容到映象 。格式 ADD ,該命令將複製指定的< src>路徑下內容到容器中的< dest>路徑下 。

    其中可以是 Dockerfile所在目錄的一個相對路徑(檔案或目錄);也可以是一個URL ;還可以是一個 tar 檔案(自動解壓為目錄) 可以是映象內絕對路徑,或者相對於工作目錄( WORKDIR)的相對路徑 。 *路徑支援正則格式,例如: ADD .c /code/**

  • COPY 複製內容到映象 。格式 COPY

    COPY 與 ADD 指令功能類似,當使用本地目錄為源目錄時,推薦使用 COPY。

建立映象

在 sshd_ubuntu 目錄下,使用 docker build建立映象。

docker build -t sshd:dockerfile .

注意上面命令末尾的 . 號指的是當前目錄

檢視映象是否安裝建立成功

~ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
sshd                dockerfile      e35f180c1e98        5 hours ago         207MB
ubuntu              latest              3556258649b2        3 weeks ago         64.2MB

測試映象,執行容器

  1. 使用剛才建立的 sshd:dockerfile 映象來執行一個容器。
    直接啟動映象,對映容器的 22 埠到本地的 10086 埠:
    docker run -d -p 10086:22 --name sshd-test sshd:dockerfile  

    2.檢視容器是否成功啟動

    ~ docker ps
    CONTAINER ID        IMAGE                 COMMAND             CREATED             STATUS              PORTS                   NAMES
    c2c2e2688046        sshd:dockerfile   "/run.sh"           5 hours ago         Up 5 hours          0.0.0.0:10086->22/tcp   sshd-test

    3.檢視 docker 執行的IP地址

    ~ ifconfig docker|grep inet
    inet addr:172.17.0.1  Bcast:172.17.255.255  Mask:255.255.0.0

地址為 172.17.0.1

4.透過 ssh 連線容器

~ ssh 172.17.0.1 -p 10086
Welcome to Ubuntu 18.04.2 LTS (GNU/Linux 4.4.0-93-generic 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 Aug 15 11:38:03 2019 from 172.17.0.1
-bash: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8)
root@c2c2e2688046:~#    

連線成功!

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章