为什么需要自定义一个基础镜像?-创新互联
开始之前
为什么需要自定义一个PHP
基础镜像?
对于使用php
(python
)等开发的项目,由于是解释型语言并不需要编译代码
这个步骤(go
或者java
将依赖打包到可执行程序或包中),但是往往还需要安装一些依赖的库或者第三方模块。
在项目实践中一般会先在PHP
官方镜像之上,添加项目一些必用扩展模块,例如连接 mysql
数据库的 mysqlnd
模块,或者连接 redis
、memcache
、mongodb
等常用的php
扩展模块,以项目实际需求为准。
基础镜像作用是为项目镜像提供支持,准备好php
基础镜像之后,以此镜像为基础并添加项目代码,完成项目镜像
构建工作,除重大安全更新、添加新的扩展模块之外,基础镜像并不会经常更新和调整。
举个栗子
这里使用一个示例来描述php
基础镜像,环境及需求如下:
项目基于 `php5 + mysql` 开发。
项目使用 `php-fpm` 运行项目代码。
项目使用 `nginx` 反向代理 php-fpm 并提供'静态资源'服务。
项目需要 `mysqlnd、redis、memcache` 等php扩展模块。
默认情况下 docker 只运行一个进程(docker推崇的理念),但是项目需要两个服务(php-fpm、nginx
),所以需要第三方的进程管理软件,在docker中较流行的方案是使用 supervisor
软件管理多个进程。
这篇文章重点介绍如何实现一个php
基础镜像,将在下一篇文章中介绍 如何使用 supervisor
管理多个进程。
操作步骤
- 基于以上的需求,设计
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
- 构建镜像
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自定义镜像? 》
- 验证镜像
docker images --format '{{.Repository}} {{.Size}}'
demo-base 723MB
可以使用这个php
基础镜像创建一个容器,不过这个容器(镜像)虽然已经安装了nginx
但是并不会运行,目前只有默认的php-fpm
在运行,将在下一篇: 《使用supervisor管理Docker容器中多个进程》解决这个问题,敬请期待 公众号每周四 docker专题更新文章。
小结
最后来总结下文章中的知识点
- 基础镜像作用是为
项目镜像
提供支持,并在基础镜像之上添加项目代码,完成项目镜像构建工作。 - 除重大安全更新、添加新的扩展模块之外,基础镜像不会经常更新。
- 默认情况下 docker只运行一个进程,需要
supervisor
进程管理软件管理多个进程。
参考文章
doker&k8s Qun [703906133]
另外有需要云服务器可以了解下创新互联cdcxhl.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。
网站名称:为什么需要自定义一个基础镜像?-创新互联
浏览地址:http://ybzwz.com/article/cdsgcc.html