专栏首页运维录为什么需要自定义一个基础镜像?

为什么需要自定义一个基础镜像?

为什么需要自定义一个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进程管理软件管理多个进程。

本文分享自微信公众号 - 运维录(gh_70d95b8f5f7c),作者:东南

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-11-28

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Django容器(上): 自定义基础镜像

    某个 Python 项目,基于 Python:3.6 与 Django:1.11 框架开发,希望项目能够容器化,然后可以通过 docker-compose 等工...

    用户1560186
  • 为什么Docker镜像大小与仓库中不一致?

    如果仔细观察你会发现,Docker宿主机中某个镜像所占用的磁盘空间和在 Docker Hub(仓库)上看到的镜像大小是不同的,例如 golang:1.9 在 D...

    用户1560186
  • 没有Docker仓库还能分发镜像吗?

    首先明确的是建议优先使用Docker仓库,特别是对于Docker集群而言 Docker仓库非常重要,但是某些应用场景下比如单机环境下使用docker-comps...

    用户1560186
  • 分享WordPress各种标签大全集合 以及如何调用

    wordpress程序日渐成熟,开发者越来越多,各种模版层出不穷,但是想要做一个好的wordpress模版,前提不只是要掌握HTML5前端技术,还必须了解wor...

    于飞云计算
  • docker运行php网站程序

    官方提供了诸如php:7.1-apache的基础镜像,但是确认必要的扩展,例如gd,当然官方提供了docker-php-ext-install命令,可以用来安装...

    JadePeng
  • 删除容器镜像中心的镜像

    在使用容器的时候,我们都是自己搭建一个私有的容器镜像环境,一般使用的镜像也就是registry了,用来保存相关的镜像,搭建了镜像,上传了镜像,使用了镜像,那么...

    SRE运维实践
  • WordPress丨常见函数及拓展模板函数大全

    wordpress模板是由PHP语句组成,很多不懂代码的站长都被PHP复杂的代码难倒,难以自己开发个性化的模板。其实想开发一个wordpress模板并不是太难,...

    V站CEO-西顾
  • php & apache2 &操作系统之间的一些黑魔法

    做了一个CTF题目,遇到了一些有趣的东西,所以写了这篇文章记录了一下。 但是我却不明白造成这个问题的原因在哪里,所以不知道给文章起什么标题,就姑且叫这个非常宽泛...

    不知雨
  • php实现tcp服务器

    经过了一个半月的研究,终于将php多进程,和tcp方面研究通了,这篇文章主要讲解一下我了解到的知识点

    仙士可
  • yum安装新版php7.0

    这两天又装了一下虚拟机,又要编译lnmp,还要弄各种拓展,很麻烦,能不能直接yum安装呢?答案是可以的!

    逐梦的青春

扫码关注云+社区

领取腾讯云代金券