docker-compose 部署 php + nginx + mysql + redis

1,在开动之前首先创建php + nginx + mysql + redis的配置和数据存储路径,大概是下图的样子

// 因为目录全部展开会导致截图不完整,我在这里介绍一下每个目录的功能
mysql
    conf: 必要目录,使用默认配置即可,mysql8配置密码加密方式会用到
    data: 必要目录,数据存储路径
    logs: 必要目录,日志路径
nginx
    conf: 必要目录,下面会放 nginx.conf
        nginx.conf: 必要文件
    conf.d: 不必要目录,相当于vhost
        www.conf: 你的站点配置
    log: 必要目录,日志路径
php
    etc: 必要目录,配置项都在这
        php: 必要目录。ini文件要放这里
            php.ini: 必要文件,php配置文件
        php-fpm.d: 必要目录,fpm非通用配置文件目录
            www.conf: 非必要文件,不同用户不同端口不同任务
        php-fpm.conf: 必要文件,这是主要配置文件
    extension: 必要目录,php定制化目录
        Dockerfile: 必要文件,这里将定制你需要的php,必要的原因是docker-compose会从这build
    log: 必要目录,日志路径
redis
    conf: 必要目录,配置文件目录
        redis.conf: 必要文件,配置文件
    data: 必要目录,持久化文件所在目录

docker-compose.yaml: 必要文件

            

 2,创建好目录后,我们先来定制我们的php吧,这个Dockerfile你可以先build了,因为在docker-compose要直接用,镜像名字随意,我这里用php74

// 该装的都装上

// 版本7.4
FROM php:7.4-fpm

// composer
RUN curl -sS https://getcomposer.org/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的Dockerfile
    ports: 
      - "9000:9000" // fpm 端口
//    restart: always
    volumes:
      - ./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 // 分配ip
    environment:
        - TZ=Asia/Shanghai # 设置时区
  nginx:
    container_name: "nginx"
    image: nginx:latest
//    build: ./docker-manager/nginx // 也可以定制哟
    restart: always
    ports:
      - "80:80"
      - "443:443"
    environment:
      - TZ=Asia/Shanghai
    depends_on:
      - "php" // nginx必须依赖php的,所以要用depends_on
    links:
      - "php:php74" // 链接php
    volumes:
      - ./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 // 分配ip
  mysql:
    container_name: "mylsql"
    image: mysql:5.7
    ports:
      - "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: always
    environment:
      - TZ=Asia/Shanghai
      - MYSQL_ROOT_PASSWORD=123456 // 初始化密码
    networks:
      app_net:
        ipv4_address: 10.10.10.1 // ip
  redis:
    container_name: redis
    image: redis:5
    restart: always
    ports:
      - "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 // 启动redis
    environment:
      - TZ=Asia/Shanghai
    // 勘误:redis如果不在同一网段,会出现不能访问的问题
    networks:
      app_net:
        ipv4_address: 10.10.10.4
networks: // 定义网络
  app_net:
    driver: bridge
    driver_opts:
      com.docker.network.enable_ipv6: "true"
    ipam:
      config:
        - subnet: 10.10.0.0/16

4,到此,环境相关的东西就都准备好了,我们只需要把我们的项目挂载到php容器下面的volumes下面,那就可以直接进行开发调试了。

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值