構建一個擁有sshd服務的docker鏡像


 

不直接描述結果,通過一個過程探究如何寫一個 Dockerfile

一、環境

虛擬機CentOS7.4,Docker1.13.1

二、嘗試步驟

1.下載基礎鏡像 docker pull alpine:3.8

下載鏡像的時候習慣帶上tag,否則下載的是 latest,后面不知道具體的版本。在 Dockerfile 的編寫中也需要注意,指定具體的版本,不然當有了新的版本發布后,這個 Dockerfile 就會有差異了

2.啟動一個容器

docker run -itd -p 10022:22 -v /home/docker-volume:/home alpine:3.8

-p將容器的 22 端口暴露出來是方便測試 sshd,掛載卷是為了后面步驟拷貝文件需要

3.進入容器

docker exec -it 8f sh

添加阿里雲軟件源

更新軟件,安裝open-ssh

apk update

apk add openssh-server

 直接啟動 sshd 會出現如下錯誤:

需要安裝一個服務管理軟件

但是安裝 openrc 后還是會有如下問題。原因是,容器本身是一個進程,已經是屬於 init 0 進程的,不能使用/init.d下來啟動

 

所以使用 /usr/sbin/sshd -D 方式啟動。但是又出現如下錯誤,查看是由於沒有公鑰文件,ls /etc/ssh 下只有sshd_config 配置

使用下述方式創建公鑰

ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key
ssh-keygen -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key
ssh-keygen -t ed25519 -f /etc/ssh/ssh_host_ed25519_key

創建完成后,/usr/sbin/sshd -D 啟動成功

此處先拷貝 ssh 配置到 /home 目錄下,后續步驟使用

cp /etc/ssh/* /home

三、編寫Dockerfile

編寫 dockerfile 的過程就是將上述手動操作的過程,翻譯成 dockerfile 的語法。

FROM alpine:3.8

# 拷貝軟件園文件和公鑰文件到容器內 COPY file/ /tmp/
# 先替換軟件源 RUN \mv /tmp/repositories /etc/apk/repositories \
# 安裝 sshd 軟件 && apk update && apk add openssh-server --no-cache \
# 拷貝公鑰文件 && mv /tmp/ssh* /etc/ssh/ \
# 修改初始密碼 && echo "root:admin" | chpasswd \
# 清理環境 && rm -rf /var/cache/apk/* /tmp/* # 暴露22端口 EXPOSE 22 # 啟動 sshd 服務 CMD ["/usr/sbin/sshd", "-D"]

將公鑰文件放在目錄 file 下,Dockerfile 文件與 file 目錄放在同一級目錄下。然后執行命令,docker build -t alpine-sshd:v1 . 進行構建。完成后能在 docker images 鏡像中看見

測試:

docker run -itd -p 10022:22 alpine-sshd:v1 啟動一個容器,然后使用命令 ssh root@[ip] 10022 連接到容器

到此,整個編寫 Dockerfile 的流程就結束了。但是上面的 Dockerfile 還能優化一下

四、進階

比如,初始密碼不能通過啟動參數修改,啟動服務沒有使用啟動腳本,擴展性不好等

對於以上修改后的文件鏈接:https://github.com/ucookie/DockerBuild/tree/master/alpine-sshd,可以直接構建


免責聲明!

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



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