2017年9月18日 星期一

docker image 與 docker-hub



這篇大致在說明  編寫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"]

大致上就是設定
  1. FORM : 從那個 image 當 base
  2. ENV  :  設定環境變數
  3. RUN :  在這個 base image 裡要執行那些指令
  4. COPY : 將 host 的 (執行 docker build) 所在目錄下的檔案 copy 到 image 內
  5. EXPOSE :  需要使用到的 port
  6. CMD :  當 container 啟動後, 預設會執行的指令
這篇文章 對 Dockerfile 的編寫有不錯的說明 (其實不止 Dockerfile, 這整篇介紹 Docker 都蠻不錯的)


上傳到 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.

沒有留言: