构建&部署PHP项目镜像

针对PHP项目所需的php、nginx、mysql、redis等等组件,介绍如何构建镜像,及部署容器等。

构建镜像

根据项目功能需要定制所需镜像,一般使用Dockerfile基于官方镜像定制构建。

PHP定制镜像

根据官方php镜像,定制安装所需扩展。

Dockerfile文件

FROM php:8.1.7-fpm-alpine3.16
LABEL MAINTAINER="hoopan108@gmail.com"
ENV TZ "Asia/Shanghai"

# 时区
RUN echo ${TZ} >/etc/timezone

# 配置阿里云镜像源,加快构建速度。
RUN sed -i "s/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g" /etc/apk/repositories

# 创建www用户
RUN addgroup -g 1000 -S www && adduser -s /sbin/nologin -S -D -u 1000 -G www www

# 指定扩展版本
ENV PHPREDIS_VERSION 5.3.7

# PHPIZE_DEPS包含gcc g++等编译辅助类库,完成后删除;pecl安装扩展。
RUN apk add --no-cache $PHPIZE_DEPS \ 
    && apk add --no-cache libstdc++ libzip-dev vim\ 
    && apk add rabbitmq-c-dev \
    && apk update \
    && pecl install redis-$PHPREDIS_VERSION \
    && pecl install zip \
    && pecl install swoole \
    && pecl install mongodb \
    && pecl install amqp \
    && docker-php-ext-enable redis zip swoole mongodb amqp \ 
    && apk del $PHPIZE_DEPS

# docker-php-ext-install安装扩展。 
RUN apk add --no-cache \
       freetype \
       libpng \
       libjpeg-turbo \
       freetype-dev \
       libpng-dev \
       jpeg-dev \
       libjpeg \
       libjpeg-turbo-dev \
       libwebp \
       libwebp-dev \
    && NUMPROC=$(grep -c ^processor /proc/cpuinfo 2>/dev/null || 1) \
    && docker-php-ext-install -j${NUMPROC} gd \
    && docker-php-ext-install -j${NUMPROC} pdo_mysql \
    && docker-php-ext-install -j${NUMPROC} opcache \
    && docker-php-ext-install -j${NUMPROC} bcmath \
    && docker-php-ext-install -j${NUMPROC} mysqli

# 配置文件
COPY ./conf.d/ $PHP_INI_DIR/conf.d/
COPY  www.conf /usr/local/etc/php-fpm.d/www.conf

RUN mv "$PHP_INI_DIR/php.ini-production" "$PHP_INI_DIR/php.ini"

www.conf文件
其中的进程数可以根据服务器情况调整

[www]
user = www
group = www
listen = 0.0.0.0:9000
pm = dynamic
pm.max_children = 10
pm.start_servers = 3
pm.min_spare_servers = 2
pm.max_spare_servers = 5

date.ini文件
在conf.d目录增加date扩展的配置文件

date.timezone = Asia/Shanghai

opcode.ini文件
在conf.d目录增加opcode扩展的配置文件

opcache.enable= 0
opcache.enable_cli=0
opcache.revalidate_freq=60
opcache.max_accelerated_files=100000
opcache.validate_timestamps=1

构建命令

docker build -t hoopan/php:8.1.7 .

构建完成后,docker images 可以查看。

部署容器

将项目所需镜像,部署容器运行,并考虑容器间通信。

MySQL容器

简单部署

docker run -itd -p 3307:3306 \
    -v /data/www/mysql:/var/lib/mysql \
    -e MYSQL_ROOT_PASSWORD=123456 \
    --name mysql8 \
    mysql:8.0.29

自定义配置部署
将配置文件映射到宿主机,方便调整参数

docker run --name tmp-mysql-container -d mysql:8.0.29
sudo docker cp tmp-mysql-container:/etc/mysql/conf.d /data/www/etc/mysql/conf.d
docker rm -f tmp-mysql-container

docker run -itd -p 3307:3306 \
    -v /data/www/mysql:/var/lib/mysql \
    -v /data/www/etc/mysql/conf.d:/etc/mysql/conf.d \
    -e MYSQL_ROOT_PASSWORD=123456 \
    --name mysql8 \
    mysql:8.0.29

Redis容器

配置文件
先创建配置文件redis.conf,如创建/data/www/etc/redis/redis.conf,内容如下

# 注释bind,此值限制本地访问
#bind 127.0.0.1 
# 保护模式关闭,此值限制本地访问
protected-mode no 

# 设置密码
requirepass 123456

# 数据库数量(可选),默认12个,最多255
#databases 16

# 开启持久化,AOF
appendonly yes 

# 日志
#logfile "/data/log/access.log"

部署容器

docker run -itd -p 6380:6379 \
    -v /data/www/redis:/data \
    -v /data/www/etc/redis:/etc/redis \
    --name redis7 \
    redis redis-server /etc/redis/redis.conf

PHP容器

由于PHP需要连接MySQL和redis服务,因此PHP容器需要link它们,以便访问其服务。
简单部署

docker run -itd -p 9001:9000 \
    -v /data/www/html:/var/www/html \
    --name php8 \
    --link mysql8 \
    --link redis7 \
    hoopan/php:8.1.7

自定义配置部署
将配置文件映射到宿主机,方便调整参数

# 先获取原始配置内容,本地目录需要创建
docker run --name tmp-php-container -d hoopan/php:8.1.7
sudo docker cp tmp-php-container:/usr/local/etc/php /data/www/etc/
sudo docker cp tmp-php-container:/usr/local/etc/php-fpm.d /data/www/etc/
docker rm -f tmp-php-container

# 创建容器
docker run -itd -p 9001:9000 \
    -v /data/www/html:/var/www/html \
    -v /data/www/etc/php:/usr/local/etc/php \
    -v /data/www/etc/php-fpm.d:/usr/local/etc/php-fpm.d \
    --link mysql8 \
    --link redis7 \
    --name php8 \
    hoopan/php:8.1.7

注意事项

  1. 进程池用户组及用户:www.conf里定义了user和group,但是/var/www/html映射到宿主机的文件权限可能跟这里定义的用户不一致,会造成读写权限缺失,因此需要在docker里查看/var/www/html目录下真实用户组和用户ID,然后再修改www.conf文件里的user和group。

Nginx容器

简单部署

docker run -d -p 8201:80 \
    -v /data/www/html:/usr/share/nginx/html \
    -v /data/www/nginx/conf/conf.d:/etc/nginx/conf.d \
    --link php8 \
    --name nginx \
    nginx

自定义配置部署

# 先获取原始配置内容
docker run --name tmp-nginx-container -d nginx
sudo docker cp tmp-nginx-container:/etc/nginx/nginx.conf /data/www/etc/nginx/nginx.conf
docker rm -f tmp-nginx-container

#创建容器
docker run -d -p 8201:80 \
    -v /data/www/html:/usr/share/nginx/html \
    -v /data/www/etc/nginx/nginx.conf:/etc/nginx/nginx.conf \
    -v /data/www/etc/nginx/conf.d:/etc/nginx/conf.d \
    -v /data/www/log/nginx:/var/log/nginx \
    --name nginx \
    --link php8 \
    nginx

配置nginx站点文件

vim /data/www/etc/nginx/conf.d/default.conf

配置内容如下
需在/data/www/html站点目录内创建 blog 项目目录

server {
  listen 80;
  root /usr/share/nginx/html/blog;
  index index.html index.php;

  location / {
        # Redirect everything that isn't a real file to index.php
        try_files $uri $uri/ /index.php$is_args$args;
    }

  location ~ \.php$ {
    # 注意用link的php容器名称,不能用127.0.0.1,端口使用容器内部9000
    fastcgi_pass php8:9000;
    fastcgi_index index.php;
    # 脚本目录指定php容器的路径,与上面root的nginx路径不同
    fastcgi_param SCRIPT_FILENAME /var/www/html/blog$fastcgi_script_name;
    include fastcgi_params;
    }
}

Compose 部署容器

上面是采用每个容器服务单独部署的方式,也可以使用compose一键部署。

创建compose模板

默认模板文件名称为 docker-compose.yml,格式为 YAML 格式。
注意:模板文件中的映射配置文件需要提前准备好

version: "3"

services:
    nginx:
        image: nginx
        restart: always
        volumes:
            - ./html:/usr/share/nginx/html
            - ./etc/nginx/nginx.conf:/etc/nginx/nginx.conf
            - ./etc/nginx/conf.d:/etc/nginx/conf.d
            - ./log/nginx:/var/log/nginx
        ports:
            - 8202:80

    php:
        image: hoopan/php:8.1.7
        restart: always
        volumes:
            - ./html:/var/www/html
            - ./etc/php:/usr/local/etc/php
            - ./etc/php-fpm.d:/usr/local/etc/php-fpm.d

    mysql:
        image: mysql:8.0.29
        restart: always
        environment:
            MYSQL_ROOT_PASSWORD: 123456
            MYSQL_DATABASE: blog
            MYSQL_USER: blog_user
            MYSQL_PASSWORD: 123456
        volumes:
            - ./mysql:/var/lib/mysql
            - ./etc/mysql/conf.d:/etc/mysql/conf.d

    redis:
        image: redis:7.0.2
        restart: always
        volumes:
            - ./redis:/data
            - ./etc/redis:/etc/redis
        command: 
            redis-server /etc/redis/redis.conf

启动项目

在当前目录中执行以下命令

docker-compose up -d

项目仓库

以上镜像、代码等已构建上传到公共仓库,可以下载使用

参考

未经作者允许,禁止转载。
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
下一篇