1,在开动之前首先创建php + nginx + mysql + redis的配置和数据存储路径,大概是下图的样子
// 因为目录全部展开会导致截图不完整,我在这里介绍一下每个目录的功能mysqlconf: 必要目录,使用默认配置即可,mysql8配置密码加密方式会用到data: 必要目录,数据存储路径logs: 必要目录,日志路径nginxconf: 必要目录,下面会放 nginx.confnginx.conf: 必要文件conf.d: 不必要目录,相当于vhostwww.conf: 你的站点配置log: 必要目录,日志路径phpetc: 必要目录,配置项都在这php: 必要目录。ini文件要放这里php.ini: 必要文件,php配置文件php-fpm.d: 必要目录,fpm非通用配置文件目录www.conf: 非必要文件,不同用户不同端口不同任务php-fpm.conf: 必要文件,这是主要配置文件extension: 必要目录,php定制化目录Dockerfile: 必要文件,这里将定制你需要的php,必要的原因是docker-compose会从这buildlog: 必要目录,日志路径redisconf: 必要目录,配置文件目录redis.conf: 必要文件,配置文件data: 必要目录,持久化文件所在目录docker-compose.yaml: 必要文件
2,创建好目录后,我们先来定制我们的php吧,这个Dockerfile你可以先build了,因为在docker-compose要直接用,镜像名字随意,我这里用php74
// 该装的都装上// 版本7.4FROM php:7.4-fpm// composerRUN curl -sS /installer | php \&& mv composer.phar /usr/bin/composer && chmod +x /usr/bin/composer// 各种依赖库和扩展RUN apt-get update \&& apt-get install -y \build-essential \libmagickcore-dev \libmagickwand-dev \imagemagick \libfreetype6-dev \libmcrypt-dev \libpng-dev \libzip-dev \libwebp-dev \&& docker-php-ext-configure gd --with-webp=/usr/include/webp --with-jpeg=/usr/include --with-freetype=/usr/include/freetype2/ \&& docker-php-ext-install -j$(nproc) gd iconv pdo_mysql mysqli bcmath calendar exif gettext sockets dba pcntl shmop sysvmsg sysvsem sysvshm zip \&& pecl install redis-5.1.1 \&& pecl install imagick \&& pecl install mcrypt \&& docker-php-ext-enable redis imagick mcrypt// 这句很重要,如果和你的nginx用户不同会导致你的服务起不来RUN groupadd www && useradd -g www www// 如果你需要别的扩展,还可以再加
3,好了,开始制作一下docker-compose.yaml吧
version: '3'services:php:container_name: "php74" // 可以直接用php镜像,但是出来可能缺东西,而且环境也不完整// image: php:7.4 build: ./docker-manager/php/extension // 这个目录放上我们刚才做好的定制化php的Dockerfileports: - "9000:9000" // fpm 端口// restart: alwaysvolumes:- ./docker-manager/php/etc:/usr/local/etc // 映射配置文件- ./docker-manager/php/log:/var/log/php // 日志文件映射// 内部逻辑:这个必须加,因为nginx将请求转发给php后,实际上是php去执行了脚本解析- /Users/guoyi/php/src:/www // 项目目录,我所有的php项目都在src下面,只要去增加nginx配置就可以了,很方便。stdin_open: true // stdin_open configures service containers to run with an allocated stdin.tty: true // tty configure service container to run with a TTY.links:- "mysql" // 链接mysql服务networks:app_net:ipv4_address: 10.10.10.3 // 分配ipenvironment:- TZ=Asia/Shanghai # 设置时区nginx:container_name: "nginx"image: nginx:latest// build: ./docker-manager/nginx // 也可以定制哟restart: alwaysports:- "80:80"- "443:443"environment:- TZ=Asia/Shanghaidepends_on:- "php" // nginx必须依赖php的,所以要用depends_onlinks:- "php:php74" // 链接phpvolumes:- ./docker-manager/nginx/conf.d:/etc/nginx/conf.d // 子配置文件- ./docker-manager/nginx/conf/nginx.conf:/etc/nginx/nginx.conf // 主配置文件- ./docker-manager/nginx/log:/var/log/nginx/ // 日志networks:app_net:ipv4_address: 10.10.10.2 // 分配ipmysql:container_name: "mylsql"image: mysql:5.7ports:- "13306:3306"volumes:- ./docker-manager/mysql/data:/var/lib/mysql // 数据目录- ./docker-manager/mysql/conf:/etc/mysql/conf.d // 配置文件- ./docker-manager/mysql/logs:/data/mysql/logs // 日志restart: alwaysenvironment:- TZ=Asia/Shanghai- MYSQL_ROOT_PASSWORD=123456 // 初始化密码networks:app_net:ipv4_address: 10.10.10.1 // ipredis:container_name: redisimage: redis:5restart: alwaysports:- "6379:6379"volumes:- ./docker-manager/redis/conf:/usr/local/etc/redis // 配置文件- ./docker-manager/redis/data:/data // 数据目录command:redis-server /usr/local/etc/redis/redis.conf --requirepass 123456 // 启动redisenvironment:- TZ=Asia/Shanghai// 勘误:redis如果不在同一网段,会出现不能访问的问题networks:app_net:ipv4_address: 10.10.10.4networks: // 定义网络app_net:driver: bridgedriver_opts:work.enable_ipv6: "true"ipam:config:- subnet: 10.10.0.0/16
4,到此,环境相关的东西就都准备好了,我们只需要把我们的项目挂载到php容器下面的volumes下面,那就可以直接进行开发调试了。
如果觉得《docker-compose 部署 php + nginx + mysql + redis》对你有帮助,请点赞、收藏,并留下你的观点哦!