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 {} \;