這篇大致在說明 編寫image設定檔, 然後透過 github 及 docker hub 自動產生 image 的流程.
基礎資訊
很多情況, 會需要自己建一個符合需求的 image, 例如說我需要 php 7.0 + mongo + mysql 的環境, 但可能沒有剛好符合需求的 image , 就需要自己 build image 了.在自建 image 前, 先考慮要將 image 放在那個 repo , 最簡單的就是放在 docker hub 上.
假設要放在 docker hub 上, 先去註冊一個帳號, 這個帳號會用來之後 image 要 push 或 pull 時的識別. 例如我的帳號是 duanli , 建立的 image 名稱是 php-fpm , 那 image 完整的識別名稱就是 duanli/php-fpm .
可以用指令 docker login 來快速在 docker hub 上申請帳號.
編寫 Dockerfile 及 build image
docker 要 build image 的設定檔是 Dockerfile , 然後透過指令來 create image在設定好的 Dockerfile 同目錄下, 最簡單的指令是
docker build -t "duanli/php-fpm" .
以下是我的 php-fpm 的 Dockerfile
FROM ubuntu:xenial
MAINTAINER duan duan.li@gmail.com
ENV HOME /root
ENV LC_ALL C.UTF-8
ENV LANG en_US.UTF-8
ENV LANGUAGE en_US.UTF-8
RUN mkdir -p /usr/local/openssl/include/openssl/ /var/www/html && \
ln -s /usr/include/openssl/evp.h /usr/local/openssl/include/openssl/evp.h && \
mkdir -p /usr/local/openssl/lib/ && \
ln -s /usr/lib/x86_64-linux-gnu/libssl.a /usr/local/openssl/lib/libssl.a && \
ln -s /usr/lib/x86_64-linux-gnu/libssl.so /usr/local/openssl/lib/
RUN pecl install mongodb
RUN echo "extension=mongodb.so" > /etc/php/7.0/fpm/conf.d/20-mongodb.ini && \
echo "extension=mongodb.so" > /etc/php/7.0/cli/conf.d/20-mongodb.ini && \
echo "extension=mongodb.so" > /etc/php/7.0/mods-available/mongodb.ini
COPY fpm /etc/php/7.0/fpm
COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf
EXPOSE 9000
CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/conf.d/supervisord.conf"]
大致上就是設定
- FORM : 從那個 image 當 base
- ENV : 設定環境變數
- RUN : 在這個 base image 裡要執行那些指令
- COPY : 將 host 的 (執行 docker build) 所在目錄下的檔案 copy 到 image 內
- EXPOSE : 需要使用到的 port
- CMD : 當 container 啟動後, 預設會執行的指令
上傳到 Docker Hub
上傳到 Docker Hub 相當簡單, 以上面例子來說docker push duanli/php-fpm
之後就可以在任何機器上用 docker pull duanli/php-fpm 取得自建的 image 了.
自動化流程
有時候可能只是改一點 Dockerfile 的設定, 不想用自己機器來 build image , 可以考慮把 Dockerfile 放上 github / bitbucket , 再透過設定去觸發 docker hub 做自動 build image 的流程, 像 這篇文章 最下面提到的流程.
以 github 為例, 這篇 有蠻完整的設定流程.
之後每次把 Dockerfile push 到 github 後, 在 docker hub 上就會自動 build 最新版的 image.