不直接描述結果,通過一個過程探究如何寫一個 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 配置
使用下述方式創建公鑰
創建完成后,/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,可以直接構建