Docker使用Alpine作为基础镜像安装PHP7.4及PHP8.3环境

Alpine Linux 概述

Alpine Linux 是一个小巧、安全且功能强大的 Linux 发行版,广泛用于构建 Docker 镜像。相比于其他 Linux 发行版,Alpine 的镜像体积更小,启动速度更快,适合构建微服务架构的应用。

目录结构

├── docker-compose.yml
├── dump
│   └── test.sql
├── php74
│   ├── Dockerfile
├── php83
│   ├── Dockerfile
├── server
│   ├── apache
│   │   ├── conf
│   │   │   ├── php74.conf
│   │   │   └── php83.conf
│   │   └── logs
│   └── mysql
│       ├── conf.d
│       │   ├── buffer.cnf
│       │   ├── charset.cnf
│       │   ├── log.cnf
│       │   └── timezone.cnf
│       └── logs
└── www
    ├── index.php
    └── session

说明:dump、php74、php83、server、www为文件夹。其中server/mysql/conf.d文件夹用于映射到/etc/mysql/conf.d/目录,该目录是是MySQL中用于存放额外配置文件的目录。它的主要作用是允许用户或管理员在不修改主配置文件(/etc/my.cnf)的情况下,添加自定义配置或覆盖默认配置。dump文件夹将映射到/docker-entrypoint-initdb.d目录,该目录是Docker官方MySQL镜像中用于初始化数据库的特殊目录。它的主要作用是在容器首次启动时,自动执行目录中的 SQL 脚本或 Shell 脚本,以完成数据库的初始化工作。www目录为网站根目录。

完整代码:https://github.com/dedemao/docker-alpine

docker-compose.yml

version: '3.8'
services:
  apache-php74:
    image: httpd:alpine
    container_name: apache-php74
    ports:
      - "80:80"
      - "8074:80"
    volumes:
      - wwwroot:/var/www/html
      - ./server/apache/conf/php74.conf:/usr/local/apache2/conf/extra/php74.conf
      - ./server/apache/logs:/usr/local/apache2/logs
    command: ["httpd", "-D", "FOREGROUND", "-f", "/usr/local/apache2/conf/httpd.conf", "-C", "Include conf/extra/php74.conf"]
    depends_on:
      - php74
    networks:
      - default

  apache-php83:
    image: httpd:alpine
    container_name: apache-php83
    ports:
      - "8083:80"
    volumes:
      - wwwroot:/var/www/html
      - ./server/apache/conf/php83.conf:/usr/local/apache2/conf/extra/php83.conf
      - ./server/apache/logs:/usr/local/apache2/logs
    command: ["httpd", "-D", "FOREGROUND", "-f", "/usr/local/apache2/conf/httpd.conf", "-C", "Include conf/extra/php83.conf"]
    depends_on:
      - php83
    networks:
      - default

  php74:
    build: ./php74
    container_name: php74
    volumes:
      - wwwroot:/var/www/html
    networks:
      - default
  php83:
    build: ./php83
    container_name: php83
    volumes:
      - wwwroot:/var/www/html
    networks:
      - default
  db:
    image: mysql:8.0
    container_name: mysql
    ports: 
        - "3306:3306"
    command: --default-authentication-plugin=mysql_native_password
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: testdb
      MYSQL_USER: test
      MYSQL_PASSWORD: test
    volumes:
        - ./dump:/docker-entrypoint-initdb.d
        - ./server/mysql/conf.d:/etc/mysql/conf.d
        - ./server/mysql/logs:/var/log/mysql
        - mysql_data:/var/lib/mysql
    networks:
      - default
volumes:
  mysql_data:
  wwwroot:
    driver: local
    driver_opts:
      type: none
      device: ./www
      o: bind
networks:
  default:
    driver: bridge

php74/Dockerfile

FROM php:7.4-fpm-alpine
# 替换为国内镜像源
RUN echo "https://mirrors.aliyun.com/alpine/v3.16/main" > /etc/apk/repositories && \
    echo "https://mirrors.aliyun.com/alpine/v3.16/community" >> /etc/apk/repositories

# 安装依赖并配置 PHP 扩展
RUN apk update && apk add --no-cache \
    # 安装依赖
    libpng \
    libjpeg-turbo \
    freetype \
    libwebp \
    libzip \
    zlib \
    curl \
    libpng-dev \
    libjpeg-turbo-dev \
    freetype-dev \
    libwebp-dev \
    libzip-dev \
    zlib-dev \
    oniguruma-dev \
    libxml2-dev \
    curl-dev \
    bash \
    # 安装PHP 扩展  
    && docker-php-ext-configure gd --with-jpeg --with-freetype --with-webp \
    && docker-php-ext-install \
        pdo \
        pdo_mysql \
        mysqli \
        gd \
        zip \
        opcache \
        bcmath \
    # 删除编译时依赖
    && apk del \
        libpng-dev \
        libjpeg-turbo-dev \
        freetype-dev \
        libwebp-dev \
        libzip-dev \
        zlib-dev \
        oniguruma-dev \
        libxml2-dev \
        curl-dev \
    && rm -rf /var/cache/apk/*

php83/Dockerfile

FROM php:8.3-fpm-alpine
# 替换为国内镜像源
RUN echo "https://mirrors.aliyun.com/alpine/v3.21/main" > /etc/apk/repositories && \
    echo "https://mirrors.aliyun.com/alpine/v3.21/community" >> /etc/apk/repositories

# 安装依赖并配置 PHP 扩展
RUN apk update && apk add --no-cache \
    # 安装依赖
    libpng \
    libjpeg-turbo \
    freetype \
    libwebp \
    libzip \
    zlib \
    curl \
    libpng-dev \
    libjpeg-turbo-dev \
    freetype-dev \
    libwebp-dev \
    libzip-dev \
    zlib-dev \
    oniguruma-dev \
    libxml2-dev \
    curl-dev \
    bash \
    # 安装PHP 扩展  
    && docker-php-ext-configure gd --with-jpeg --with-freetype --with-webp \
    && docker-php-ext-install \
        pdo \
        pdo_mysql \
        mysqli \
        gd \
        zip \
        opcache \
        bcmath \
    # 删除编译时依赖
    # 删除编译时依赖
    && apk del \
        libpng-dev \
        libjpeg-turbo-dev \
        freetype-dev \
        libwebp-dev \
        libzip-dev \
        zlib-dev \
        oniguruma-dev \
        libxml2-dev \
        curl-dev \
    && rm -rf /var/cache/apk/*

开始构建

docker-compose up -d

构建后,如果修改了Dockerfile文件,需要使用docker-compose up -d --build重新构建。

宿主机权限设置

以下命令在docker宿主机上执行。

查询php容器的GID

docker exec -it php74 id www-data
docker exec -it php83 id www-data

结果:

uid=82(www-data) gid=82(www-data) groups=82(www-data),82(www-data)

创建与容器 GID 匹配的用户组

创建与容器 GID 匹配的用户组(假设 GID=82)

groupadd -g 82 docker-www-data

将目录组改为 docker-www-data(假设web目录为:/www/wwwroot/docker-alpine/www)

chgrp -R docker-www-data /www/wwwroot/docker-alpine/www

赋予组写入权限(保留原有权限结构)

chmod g+w /www/wwwroot/docker-alpine/www

可选:递归设置子目录权限

目录可读可写可进入

find /www/wwwroot/docker-alpine/www -type d -exec chmod g+rwx {} \;

文件可读可写

find /www/wwwroot/docker-alpine/www -type f -exec chmod g+rw {} \;

发表评论

邮箱地址不会被公开。 必填项已用*标注