系统运维
开始之前
为什么需要自定义一个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-fpmmaintainer dongnan #<@微信公众号:运维录># envenv tz=asia/shanghai \\\\ lang=en_us.utf-8# aptcopy conf/sources.list /etc/apt/sources.listrun 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/*# extrun docker-php-ext-install bcmath \\\\ dba \\\\ exif \\\\ mysqli \\\\ pdo_mysql \\\\ sysvsem \\\\ sysvshm \\\\ bz2 \\\\ zip \\\\ mysql# gdrun 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 # peclrun 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]
浮夸炫技已成风 手机圈营销炒作都是通病轻量云服务器哪个好用一点企业应用的虚拟主机要多少钱网站经常性打开错误空间俩三天可以打开俩三天又打不开企业邮箱被限制发件怎么解决域名一般选哪个?域名是怎样挑选的?这是怎么回事这个域名是在西维数码备过案吗1号升级问题-云服务器问题