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

开始之前

为什么需要自定义一个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
  1. 构建镜像
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自定义镜像?

  1. 验证镜像
docker images --format ‘{{.Repository}} {{.Size}}‘

demo-base 723MB

可以使用这个php基础镜像创建一个容器,不过这个容器(镜像)虽然已经安装了nginx 但是并不会运行,目前只有默认的php-fpm在运行,将在下一篇: 《使用supervisor管理Docker容器中多个进程》解决这个问题,敬请期待 公众号每周四 docker专题更新文章。

小结

最后来总结下文章中的知识点

  • 基础镜像作用是为项目镜像提供支持,并在基础镜像之上添加项目代码,完成项目镜像构建工作。
  • 除重大安全更新、添加新的扩展模块之外,基础镜像不会经常更新。
  • 默认情况下 docker只运行一个进程,需要supervisor进程管理软件管理多个进程。

参考文章

doker&k8s Qun [703906133]

原文地址:https://blog.51cto.com/14521173/2459599

时间: 2024-11-01 01:04:50

为什么需要自定义一个基础镜像?的相关文章

docker 实战---安装一个基础镜像 (一)

泡了几天官网,对docker有了一点了解.准备着手搭建一个公司的开发测试环境,包括java.python. 环境介绍 首先说明一下我的环境 2台物理服务器(后面简称主机) 主机A的配置如下: [[email protected] ~]# lsb_release -a LSB Version: :base-4.0-amd64:base-4.0-noarch:core-4.0-amd64:core-4.0-noarch:graphics-4.0-amd64:graphics-4.0-noarch:p

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

开始之前 某个 Python 项目,基于 Python:3.6 与 Django:1.11 框架开发,希望项目能够容器化,然后可以通过 docker-compose 等工具编排容器/应用,本篇文章的目标是自定义Django基础镜像. 与<为什么需要自定义一个基础镜像?>文章相同,基础镜像作用是为项目镜像提供支持.它构建在 Python 官方镜像之上,添加项目一些需要的扩展模块,例如 Django.pymysql.Gunicorn等常用模块,具体以项目实际需求为准. 最后为能够高效的处理静态文件

创建一个基本镜像

创建一个基本镜像 ================== 你想创建你自己的基础镜像?很好! 具体的过程会严重依赖于你想打包的Linux发行版.我们有下面一些例子供你参考. 同时,我们鼓励你通过提交推送请求来贡献你的新镜像. 使用 tar 来创建一个完整的镜像 通常,你要先运行一个可工作的发行版的机器,来打包一个基础镜像.虽然有一些 工具不是必需的,比如 Debian 的 Deboostrap,但是你还是可以用它来生成 Ubuntu 镜像. 下面的例子尽可能简单地创建一个 Ubuntu 基础镜像:

「一」创建一个带 ssh 服务的基础镜像(修订版)--使用「docker commit」创建

在介绍如何创建带 ssh 服务的基础镜像之前,我们想回顾一下之前介绍过的内容,其中提到有三种创建镜像的常用办法: 从文件系统导入 从现有容器使用「docker commit」提交 使用 dockerfile 文件 build 本章将主要介绍后面 2 种方法. 步骤如下: $ sudo docker run -ti ubuntu:14.04 /bin/bash #首先,使用我们最熟悉的 「-ti」参数来创建一个容器. [email protected]:/# sshd bash: sshd: co

面向生产和开发环境的LNP基础镜像

GITHUB地址:https://github.com/banyancheung/base-docker-env 这是一份适用于生产和开发环境的 Dockerfile. 在 phuison/baseimage 的基础上,增加了php.php扩展和nginx的安装脚本, 实现了一键安装LNP及其常用扩展的功能.目前已经在我司的生产环境上并运行良好.日常开发中也是基于此镜像进行的. 镜像内容 此镜像包括如下内容: Ubuntu 16.04 LTS correct init process syslo

测试环境docker化(一)—基于ndp部署模式的docker基础镜像制作

本文来自网易云社区 作者:孙婷婷 背景 我所在测试项目组目前的测试环境只有一套,在项目版本迭代过程中,开发或产品偶尔会在测试环境进行数据校验,QA人数在不断增加,各个人员在负责不同模块工作时也会产生脏数据,导致QA在功能测试和接口测试过程中需要清理测试环境增加工作量,同时QA组在进行异常测试等多维度质量保障时也希望有多套环境进行数据隔离.但目前测试环境多套隔离操作麻烦,每隔离一套环境需要修改大量配置.数据库重新建表到调试可用,在开发的帮助下至少需要3天的时间,在这种场景下,我们借鉴组内大数据QA

docker 构建基础镜像 时区问题

前言 在使用tomcat官方docker 镜像时,程序在与微信通信过程中返回了时间差问题,查看后发现是docker 容器的问题. 问题 docker 官方镜像使用的都是UTC 标准时间,这就导致了比beijing时间晚8小时. 解决这一问题并不难,只要修正容器的时区就可以了.众所周知,对容器的修改并不会影响到镜像,所以又会出现这样一个问题,再次从镜像启动容器时,时间就会又变成UTC 标准时间.对于此问题,自然是可以使用docker commit 来解决,但我并不想这样做-- 解决方案 基于cen

Deskpool安装之:准备Windows 7虚拟机基础镜像

Deskpool虚拟桌面管理系统在配置过程中,需要导入虚拟机镜像,然后将镜像制作成一个虚拟桌面模板.被导入的虚拟机需要满足如下条件,才能保证成功制作成模板. 1.安装虚拟化平台的驱动(XenServer平台是Xen Tools,Hyper-V平台是Hyper-V集成服务) 2.被导入的虚拟机需要启用管理员(Administrator)帐户. 3.被导入的虚拟机需要开启 RDP 服务. 4.被导入的虚拟机需要开启文件共享服务. 5.RDP服务和文件共享服务的防火墙必须处于开启状态. 6.为Wind

Deskpool安装之:准备Windows XP虚拟机基础镜像

Deskpool虚拟桌面管理系统在配置过程中,需要导入虚拟机镜像,然后将镜像制作成一个虚拟桌面模板.被导入的虚拟机需要满足如下条件,才能保证成功制作成模板. 1.安装虚拟化平台的驱动(XenServer平台是Xen Tools,Hyper-V平台是Hyper-V集成服务) 2.被导入的虚拟机需要启用管理员(Administrator)帐户. 3.被导入的虚拟机需要开启 RDP 服务. 4.被导入的虚拟机需要开启文件共享服务. 5.RDP服务和文件共享服务的防火墙必须处于开启状态. 6.为Wind