為什麼需要自定義一個基礎鏡像?

  • 2019 年 12 月 4 日
  • 筆記

為什麼需要自定義一個PHP基礎鏡像?

對於使用php (python)等開發的項目,由於是解釋型語言並不需要編譯程式碼這個步驟(go或者java將依賴打包到可執行程式(包)中),但是往往還需要安裝一些依賴的庫或者第三方模組。

在項目實踐中一般會先在PHP官方鏡像之上,添加項目一些必用擴展模組,例如連接 mysql資料庫的 mysqlnd 模組,或者連接 redismemcachemongodb 等常用的php擴展模組,具體以項目實際需求為準。

基礎鏡像作用是為項目鏡像提供支援,準備好php基礎鏡像之後,以此鏡像為基礎並添加項目程式碼,完成項目鏡像構建工作,除重大安全更新、添加新的擴展模組之外,基礎鏡像並不會經常更新和調整

舉個栗子


使用一個示例來描述php基礎鏡像,環境及需求如下:

項目基於 `php5 + mysql` 開發。  項目使用 `php-fpm` 運行項目程式碼。  項目使用 `nginx` 反向代理 php-fpm 並提供'靜態資源'服務。  項目需要 `mysqlnd、redis、memcache` 等php擴展模組。

默認情況下 docker 只運行一個進程(docker推崇的理念),但是項目需要兩個服務(php-fpm、nginx),所以需要第三方的進程管理軟體,在docker中較流行的方案是使用 supervisor 軟體管理多個進程

這篇文章重點介紹如何實現一個php基礎鏡像,將在下一篇文章中介紹 如何使用 supervisor 管理多個進程。

操作步驟


1. 基於以上的需求,設計 Dockerfile 文件。

cat base/php/5.6/Dockerfile    # 使用 php:5.6-fpm 官方鏡像  FROM php:5.6-fpm  MAINTAINER dongnan #<@微信公眾號:運維錄>    # env  ENV TZ="Asia/Shanghai"       LANG="en_US.UTF-8"    # apt  COPY conf/sources.list /etc/apt/sources.list  RUN apt-get update && apt-get install -y       supervisor nginx       libfreetype6-dev       libjpeg62-turbo-dev       libmcrypt-dev       libpng-dev       libmagickwand-dev       libmemcached-dev       bzip2       && apt-get clean && rm -r /var/lib/apt/lists/*    # ext  RUN docker-php-ext-install bcmath   dba   exif   mysqli   pdo_mysql   sysvsem   sysvshm   bz2   zip   mysql    # gd  RUN docker-php-ext-install -j$(nproc) iconv mcrypt       && docker-php-ext-configure gd       --with-freetype-dir=/usr/include/       --with-jpeg-dir=/usr/include/       && docker-php-ext-install -j$(nproc) gd    # pecl  RUN pecl install imagick   memcached-2.2.0   redis-4.3.0   && docker-php-ext-enable imagick   && docker-php-ext-enable memcached   && docker-php-ext-enable redis

2. 構建鏡像

cd base/php/5.6/  docker build -t demo-base:0.0.1 .    Sending build context to Docker daemon 3.0 kb  # 省略....  Successfully built cd34135ed904

不明白Dockerfile 文件參數含義,或者 build 命令使用方法,請參考這篇文章 《如何使用 Dockerfile自定義鏡像?

3. 驗證鏡像

docker images --format '{{.Repository}} {{.Size}}'    demo-base 723MB

可以使用這個php基礎鏡像創建一個容器,不過這個容器(鏡像)雖然已經安裝了nginx 但是並不會運行,目前只有默認的php-fpm在運行。

將在下一篇: 《使用supervisor管理Docker容器中多個進程》解決這個問題,敬請期待 公眾號每周四 docker專題更新文章。

小結


最後來總結下文章中的知識點

  • 基礎鏡像作用是為項目鏡像提供支援,並在基礎鏡像之上添加項目程式碼,完成項目鏡像構建工作。
  • 除重大安全更新、添加新的擴展模組之外,基礎鏡像不會經常更新。
  • 默認情況下 docker只運行一個進程,需要supervisor進程管理軟體管理多個進程。