不同基础镜像docker构建及对比

• 19 分钟阅读 • docker

前文构建了一个镜像,发现dockerfile里有些用不到的数据库和php扩展,本文试着用不同方式构建镜像。

以alpine为基础镜像

Dockerfile:

FROM php:7.3-fpm-alpine3.11

# 1. 使用国内镜像源加速(可选)
RUN echo "https://mirrors.aliyun.com/alpine/v3.11/main" > /etc/apk/repositories && \
    echo "https://mirrors.aliyun.com/alpine/v3.11/community" >> /etc/apk/repositories

# 2. 仅安装必要软件(Nginx,删除所有编译工具)
RUN apk update && \
    apk add --no-cache nginx && \
    mkdir /run/nginx

# 3. 直接使用默认配置(删除不必要的扩展和自定义配置)
# 注:默认 php.ini 已足够,无需覆盖

# 4. 添加最小化文件
COPY index.php /var/www/html/
COPY default.conf /etc/nginx/conf.d/
COPY run.sh /

# 5. 设置权限并清理
RUN chmod +x /run.sh && \
    rm -rf /var/cache/apk/*

# 6. 暴露端口
EXPOSE 80

# 7. 启动命令
ENTRYPOINT ["/run.sh"]

default.conf:

server {
  listen 80;
  server_name localhost;

  root /var/www/html;
  index index.php index.html index.htm index.nginx-debian.html;

  location / {
    try_files $uri $uri/ =404;
  }
  location ~ \.php$ {
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
  }

run.sh:

#!/bin/sh
# 后台启动
php-fpm -D
# 关闭后台启动,hold住进程
nginx -g 'daemon off;'

文件结构:
├── Dockerfile
├── default.conf
├── index.php
└── run.sh
构建过程输出:

root@onecloud:~/php/php-alpine# docker build -t qs/php-alpine:v1 .
[+] Building 16.3s (12/12) FINISHED                                                                         docker:default
 => [internal] load build definition from Dockerfile                                                                  0.3s
 => => transferring dockerfile: 814B                                                                                  0.1s
 => [internal] load metadata for docker.io/library/php:7.3-fpm-alpine3.11                                             1.9s
 => [internal] load .dockerignore                                                                                     0.1s
 => => transferring context: 2B                                                                                       0.0s
 => CACHED [1/7] FROM docker.io/library/php:7.3-fpm-alpine3.11@sha256:b0d07b0ccb6847add12a222025066d406a55f055acfce7  0.0s
 => [internal] load build context                                                                                     0.2s
 => => transferring context: 74.37kB                                                                                  0.1s
 => [2/7] RUN echo "https://mirrors.aliyun.com/alpine/v3.11/main" > /etc/apk/repositories &&     echo "https://mirro  2.7s
 => [3/7] RUN apk update &&     apk add --no-cache nginx &&     mkdir /run/nginx                                      6.3s
 => [4/7] COPY index.php /var/www/html/                                                                               0.5s 
 => [5/7] COPY default.conf /etc/nginx/conf.d/                                                                        0.5s 
 => [6/7] COPY run.sh /                                                                                               0.5s 
 => [7/7] RUN chmod +x /run.sh &&     rm -rf /var/cache/apk/*                                                         1.2s 
 => exporting to image                                                                                                1.6s 
 => => exporting layers                                                                                               1.4s 
 => => writing image sha256:4753ea1ce06772744ecacaec680891a2211f3b55f797860c1132449b160fd1f7                          0.0s
 => => naming to docker.io/qs/php-alpine:v1    

以ubuntu为基础镜像

Dockerfile:

# 使用官方Ubuntu镜像
FROM ubuntu:22.04

# 设置非交互式环境
ENV DEBIAN_FRONTEND=noninteractive

# 创建工作目录
RUN mkdir -p /var/www/html

# 安装必要软件
RUN apt-get update && \
   apt-get install -y --no-install-recommends \
   nginx \
   php-fpm \
   && \
   apt-get clean && \
   rm -rf /var/lib/apt/lists/*

# 复制文件(使用明确路径)
COPY index.php /var/www/html/
COPY default.conf /etc/nginx/conf.d/
COPY run.sh /

# 设置权限
RUN chmod +x /run.sh && \
   chown -R www-data:www-data /var/www/html

# 清理默认配置
RUN rm -f /etc/nginx/sites-enabled/default

# 暴露端口
EXPOSE 80

# 启动命令
CMD ["/run.sh"]

default.conf:

server {
    listen 80;
    server_name localhost;
    root /var/www/html;
    index index.php;

    location / {
        try_files $uri $uri/ =404;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php-fpm.sock;
    }
}

run.sh:

#!/bin/sh
# 后台启动
service php8.1-fpm start  # 根据实际 PHP 版本调整
# 关闭后台启动,hold住进程
nginx -g 'daemon off;'

构建过程输出:

root@onecloud:~/php/php-ubuntu# docker build -t qs/php-ubuntu:v1 .
[+] Building 335.9s (13/13) FINISHED                                                                        docker:default
 => [internal] load build definition from Dockerfile                                                                  0.2s
 => => transferring dockerfile: 712B                                                                                  0.0s
 => [internal] load metadata for docker.io/library/ubuntu:22.04                                                       1.8s
 => [internal] load .dockerignore                                                                                     0.1s
 => => transferring context: 2B                                                                                       0.0s
 => [internal] load build context                                                                                     0.7s
 => => transferring context: 90B                                                                                      0.0s
 => [1/8] FROM docker.io/library/ubuntu:22.04@sha256:d80997daaa3811b175119350d84305e1ec9129e1799bba0bd1e3120da3ff52  58.5s
 => => resolve docker.io/library/ubuntu:22.04@sha256:d80997daaa3811b175119350d84305e1ec9129e1799bba0bd1e3120da3ff52c  0.3s
 => => sha256:d80997daaa3811b175119350d84305e1ec9129e1799bba0bd1e3120da3ff52c3 6.69kB / 6.69kB                        0.0s
 => => sha256:4f6f9af1518bf360df5bd6214cd573d6dc0143334234757ed745715f6a95d0cd 424B / 424B                            0.0s
 => => sha256:9aa01b7cb660ca7978b749d3ddd2ce2bf9495d1556820e724c091be026c33ad4 2.31kB / 2.31kB                        0.0s
 => => sha256:f3e10eb95482b14d0f5a969fafb71afd541d5efd38890d551e27c957ed3ae84e 26.64MB / 26.64MB                     30.0s
 => => extracting sha256:f3e10eb95482b14d0f5a969fafb71afd541d5efd38890d551e27c957ed3ae84e                            22.7s
 => [2/8] RUN mkdir -p /var/www/html                                                                                  6.2s
 => [3/8] RUN apt-get update &&     apt-get install -y --no-install-recommends     nginx     php-fpm     &&     ap  235.0s
 => [4/8] COPY index.php /var/www/html/                                                                               0.5s 
 => [5/8] COPY default.conf /etc/nginx/conf.d/                                                                        0.4s 
 => [6/8] COPY run.sh /                                                                                               0.3s 
 => [7/8] RUN chmod +x /run.sh &&     chown -R www-data:www-data /var/www/html                                        2.1s 
 => [8/8] RUN rm -f /etc/nginx/sites-enabled/default                                                                  1.5s 
 => exporting to image                                                                                               28.3s 
 => => exporting layers                                                                                              28.0s
 => => writing image sha256:c53001d8d966e2e8951c57d26a7c90477eecae863ead67dd13071f93475ef8af                          0.0s
 => => naming to docker.io/qs/php-ubuntu:v1   

以debian为基础镜像

只有Dockerfile第一行与以ubuntu为基础镜像的Dockerfile不同:

# 使用 Debian 官方 slim 镜像(比 Ubuntu 更小)
FROM debian:11-slim

构建过程输出:

root@onecloud:~/php/php-debian# docker build -t qs/php-debian .
[+] Building 275.6s (13/13) FINISHED                                                                        docker:default
 => [internal] load build definition from Dockerfile                                                                  0.1s
 => => transferring dockerfile: 745B                                                                                  0.0s
 => [internal] load metadata for docker.io/library/debian:11-slim                                                     1.0s
 => [internal] load .dockerignore                                                                                     0.0s
 => => transferring context: 2B                                                                                       0.0s
 => [1/8] FROM docker.io/library/debian:11-slim@sha256:7aafeb23eaef5d5b1de26e967b9a78f018baaac81dd75246b99781eaaa2d  32.4s
 => => resolve docker.io/library/debian:11-slim@sha256:7aafeb23eaef5d5b1de26e967b9a78f018baaac81dd75246b99781eaaa2d5  0.1s
 => => sha256:7aafeb23eaef5d5b1de26e967b9a78f018baaac81dd75246b99781eaaa2d59ef 4.54kB / 4.54kB                        0.0s
 => => sha256:b04da799ff9e4e278427561460ab9a95eaa9264e67cde09b1eb306e5c2bc3f7f 1.04kB / 1.04kB                        0.0s
 => => sha256:9c163ad39b7cf022fcd764b33bcf677bfdfc4afb538d049c49c8e2cb2d76eacb 466B / 466B                            0.0s
 => => sha256:bfc445187b87c4f640fe8b85c4ee3c251ce5e7023a5ff0acd053bde1f01e6aaf 25.54MB / 25.54MB                      9.3s
 => => extracting sha256:bfc445187b87c4f640fe8b85c4ee3c251ce5e7023a5ff0acd053bde1f01e6aaf                            19.3s
 => [internal] load build context                                                                                     0.1s
 => => transferring context: 246B                                                                                     0.0s
 => [2/8] RUN mkdir -p /var/www/html                                                                                  4.5s
 => [3/8] RUN apt-get update &&     apt-get install -y --no-install-recommends     nginx     php-fpm     &&     ap  207.7s
 => [4/8] COPY index.php /var/www/html/                                                                               0.5s 
 => [5/8] COPY default.conf /etc/nginx/conf.d/                                                                        0.3s 
 => [6/8] COPY run.sh /                                                                                               0.3s 
 => [7/8] RUN chmod +x /run.sh &&     chown -R www-data:www-data /var/www/html                                        3.3s 
 => [8/8] RUN rm -f /etc/nginx/sites-enabled/default                                                                  1.8s 
 => exporting to image                                                                                               22.8s 
 => => exporting layers                                                                                              22.3s
 => => writing image sha256:dfc71ebf160c92153b8974ee4c86624ad4a8a2652155a049cd3f3b942be77605                          0.0s
 => => naming to docker.io/qs/php-debian

对比

基础镜像 构建时间 镜像大小
alpine 16s 64M
ubuntu 336s 187M
debian 276s 164M


镜像体积对比

镜像 基础体积 安装 Nginx+PHP 后体积 特点
alpine ~5MB ~50MB 最小,适合极致轻量化
debian (slim) ~50MB ~100MB 平衡体积与兼容性
ubuntu ~70MB ~150MB 最大,但工具链最完整

结论

文章标签: docker

上一篇 : 静态音乐播放器HeoMusic
下一篇 : docker打包一个php环境
留言
阅读进度 0%