记录一下docker搭建laravel环境

docker搭建nginx+php8.2+mysql8.0+redis7.0+supervisor

目录结构

├── nginx                        nginx配置文件目录
│   ├── default.conf           Nginx 默认配置文件
├── php                          php配置文件目录
│   ├── Dockerfile             PHP 镜像构建文件
│   ├── php.ini                 PHP配置文件
│   ├── start-container       supervisor运行文件
│   ├── supervisord.conf     supervisord配置文件
├── redis                         redis配置文件目录
├── www                         PHP 代码目录
│   ├── php_test                 php项目
│   ├── supervisor             supervisor配置文件目录
│   │    ├── supervisor-test.conf  supervisor配置文件
├── docker-compose-sample.yml   Docker 服务配置示例文件

docker-compose.yml

version: '3'
services:
  lnmp_nginx:
    image: nginx:alpine
    container_name: lnmp_nginx
    ports:
      - 8080:8080
    environment:
      - TZ=Asia/Shanghai
    volumes:
      - ./nginx/default.conf:/etc/nginx/conf.d/default.conf
      - ./www:/var/www/html
    depends_on:
      - lnmp_php
    networks:
      - docker_lnmp
  lnmp_php:
    build:
      context: ./php
      dockerfile: Dockerfile
    container_name: lnmp_php
    environment:
      - TZ=Asia/Shanghai
    ports:
      - 9000:9000
    volumes:
      - ./www:/var/www/html
    depends_on:
      - lnmp_mysql
      - lnmp_redis
    networks:
      - docker_lnmp
  lnmp_mysql:
    image: 'mysql/mysql-server:8.0'
    container_name: lnmp_mysql
    ports:
      - 33061:3306
    environment:
      - MYSQL_ROOT_PASSWORD=password
      - MYSQL_ROOT_HOST=%
      - MYSQL_ALLOW_EMPTY_PASSWORD=1
      - TZ=Asia/Shanghai
    networks:
      - docker_lnmp
  lnmp_redis:
    image: 'redis:alpine'
    container_name: lnmp_redis
    environment:
      - TZ=Asia/Shanghai
    ports:
      - 63791:6379
    command: redis-server --requirepass password # 设置redis密码
    volumes:
      - ./redis:/data
    networks:
      - docker_lnmp
networks:
  docker_lnmp:
    driver: bridge
volumes:
  lnmp_mysql:
    driver: local
  lnmp_redis:
    driver: local

nginx/default.conf

server {
    listen       8080;
    listen  [::]:8080;
    server_name  localhost;
    root           /var/www/html/laravel_docker_test/public;
    index  index.php index.html index.htm;

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    location / {
        try_files $uri $uri/ /index.php$is_args$query_string;
    }

    location ~ \.php$ {
        fastcgi_pass   lnmp_php:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }
}

php/Dockerfile

FROM php:8.2-fpm

RUN apt-get update \
    && apt-get install -y libzip-dev \
    libwebp-dev libjpeg-dev libpng-dev libmemcached-dev libssl-dev zlib1g-dev \
    libfreetype6-dev libjpeg62-turbo-dev libxml2-dev libldap2-dev libmagickwand-dev

RUN docker-php-source extract

RUN /usr/local/bin/docker-php-ext-install bcmath && /usr/local/bin/docker-php-ext-enable bcmath && \
        /usr/local/bin/docker-php-ext-install calendar && /usr/local/bin/docker-php-ext-enable calendar && \
        /usr/local/bin/docker-php-ext-install gd && /usr/local/bin/docker-php-ext-enable gd && \
        /usr/local/bin/docker-php-ext-install pdo_mysql && /usr/local/bin/docker-php-ext-enable pdo_mysql && \
        /usr/local/bin/docker-php-ext-install mysqli && /usr/local/bin/docker-php-ext-enable mysqli && \
        /usr/local/bin/docker-php-ext-install soap && /usr/local/bin/docker-php-ext-enable soap && \
        /usr/local/bin/docker-php-ext-install sockets && /usr/local/bin/docker-php-ext-enable sockets && \
        /usr/local/bin/docker-php-ext-install exif && /usr/local/bin/docker-php-ext-enable exif && \
        /usr/local/bin/docker-php-ext-install zip && /usr/local/bin/docker-php-ext-enable zip && \
        /usr/local/bin/docker-php-ext-install ldap && /usr/local/bin/docker-php-ext-enable ldap

RUN pecl install imagick \
&& /usr/local/bin/docker-php-ext-enable imagick

RUN pecl install https://pecl.php.net/get/redis-5.3.7.tgz \
    && /usr/local/bin/docker-php-ext-enable redis

RUN pecl install https://pecl.php.net/get/swoole-5.0.3.tgz \
    && /usr/local/bin/docker-php-ext-enable swoole

RUN pecl install https://pecl.php.net/get/igbinary-3.2.14.tgz \
    && /usr/local/bin/docker-php-ext-enable igbinary

RUN pecl install https://pecl.php.net/get/msgpack-2.2.0.tgz \
    && /usr/local/bin/docker-php-ext-enable msgpack

RUN pecl install https://pecl.php.net/get/memcached-3.2.0.tgz \
    && /usr/local/bin/docker-php-ext-enable memcached

RUN apt-get update && apt-get install -y supervisor

RUN mkdir -p /var/log/supervisor

COPY start-container /usr/local/bin/start-container
COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf
COPY php.ini /usr/local/etc/php/conf.d/99-jase.ini

RUN chmod +x /usr/local/bin/start-container

CMD ["/usr/local/sbin/php-fpm", "-D", "FOREGROUND"]

ENTRYPOINT ["start-container"]

php.php.ini

[PHP]
post_max_size = 100M
upload_max_filesize = 100M
variables_order = EGPCS

[opcache]
opcache.enable_cli=1

php/start-container

#!/usr/bin/env bash
exec /usr/bin/supervisord -c /etc/supervisor/conf.d/supervisord.conf

php/supervisord.conf

[supervisord]
nodaemon=true
user=root
logfile=/var/log/supervisor/supervisord.log
pidfile=/var/run/supervisord.pid

[program:php-fpm]
command=/usr/local/sbin/php-fpm -c /usr/local/etc/php-fpm.conf

[include]
files = /var/www/html/supervisor/*.conf

www/supervisor/supervisor-test.conf

[program:supervisor-test]
command=/usr/local/bin/php /var/www/html/index.php
autorestart=true
startsecs=3
startretries=3
stdout_logfile=/var/log/supervisor/supervisor-test.out.log
stderr_logfile=/var/log/supervisor/supervisortest.err.log
stdout_logfile_maxbytes=2MB
stderr_logfile_maxbytes=2MB
user=root
priority=999
numprocs=1
process_name=%(program_name)s_%(process_num)02d

启动

docker-compose up -d

重新构建nginx

docker-compose up --force-recreate --build lnmp_nginx
本作品采用《CC 协议》,转载必须注明作者和本文链接
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 4

有 Let's Encrypt SSL 的吗?

7个月前 评论
会尿尿的大鲨鱼 (楼主) 7个月前

不过以alpine为基础镜像的镜像,好像没有时间文件,所以这个- TZ=Asia/Shanghai在这些镜像中应该是无效的

7个月前 评论
会尿尿的大鲨鱼 (楼主) 7个月前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!