使用Docker Compose构建Nginx+PHP+MySQL+Redis环境

使用Docker Compose构建Nginx+PHP+MySQL+Redis环境。

我在2021年搭建了最新的Nginx+PHP+MySQL+Redis环境,并提供了每个服务项的说明。

Docker的結構是怎樣的?

コンテナミドルウェアWebNginxPHPPHP8DBMySQLRedisRedis

目录结构

docker_lamp/  
|-- mysql  
|   |-- dump  
|   |   `-- setup.sql  
|   |-- logs
|   |-- mount  
|   `-- settings
|       `-- my.cnf
|-- php  
|   |-- logs  
|   |-- settings  
|   |   |-- php.dev.ini
|   |   |-- php.prod.ini
|   |   |-- www.dev.conf
|   |   `-- www.prod.conf  
|   `-- Dockerfile
|-- project  
|   `-- html
|        `-- public 
|            `-- index.php
|-- redis  
|   `-- mount  
|-- web  
|   |-- logs  
|   `-- settings
|       |-- default.conf
|       `-- nginx.conf
`-- docker-compose.yml

docker-compose.yaml 的原生中文描述可以是:儲存 Docker Compose 的配置文件。

PHP可以使用Dockerfile自己创建镜像,而其他则使用官方镜像。

一旦全体 (yī tǐ) – 一旦全體 (yī tǐ)

version: '3'
services:
  web:
    image: nginx:alpine
    volumes:
      - "./web/settings/default.conf:/etc/nginx/conf.d/default.conf"
      - "./web/settings/nginx.conf:/etc/nginx/nginx.conf"
      - "./project/html:/var/www/html"
      - "./web/logs:/var/log/nginx"
    ports:
      - "8080:80"
    restart: always
    depends_on:
      - php
      - mysql
      - redis
  php:
    build: ./php
    volumes:
      - "./project/html:/var/www/html"
    restart: always
  mysql:
    image: mysql:8.0
    ports:
      - "13306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: p@ssw0rd
      MYSQL_DATABASE: test
      MYSQL_USER: dev
      MYSQL_PASSWORD: dev
      TZ: Asia/Tokyo
    volumes:
      - "./mysql/mount:/var/lib/mysql"
      - "./mysql/settings/my.cnf:/etc/mysql/conf.d/my.cnf"
      - "./mysql/dump/setup.sql:/docker-entrypoint-initdb.d/dump.sql"
      - "./mysql/logs:/var/log/mysql"
    restart: always
  redis:
    image: redis:alpine
    ports:
      - "16379:6379"
    volumes:
      - "./redis/mount:/data"

项目介绍

nginx是一个开源的高性能HTTP和反向代理服务器。

    1. 为外部访问,将8080端口开放。

 

    使用volumes来同步配置文件、项目和日志。

※ 设置文件将在后半部分介绍。

  web:
    image: nginx:alpine
    volumes:
      - "./web/settings/default.conf:/etc/nginx/conf.d/default.conf"
      - "./web/settings/nginx.conf:/etc/nginx/nginx.conf"
      - "./project/html:/var/www/html"
      - "./web/logs:/var/log/nginx"
    ports:
      - "8080:80"
    restart: always
    depends_on:
      - php
      - mysql
      - redis

PHP是一种流行的服务器端脚本语言,用于开发动态网站和Web应用程序。

项目使用卷同步。

  php:
    build: ./php
    volumes:
      - "./project/html:/var/www/html"

Dockerfile – 文件

    1. 使用PHP镜像

 

    1. 使用docker-php-ext-install命令安装PHP扩展,以便使用Redis和MySQL

 

    使用COPY命令将配置文件复制并应用。

※设置文件将在后半部分介绍

FROM php:8.0-fpm

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

RUN git clone https://github.com/phpredis/phpredis.git /usr/src/php/ext/redis
RUN docker-php-ext-install mysqli redis

COPY settings/php.dev.ini /usr/local/etc/php/conf.d/php.ini
COPY settings/www.dev.conf /usr/local/etc/php-fpm.d/www.conf

MySQL是一种关系型数据库管理系统。

    1. 为了外部访问,公开13306端口。

 

    1. 在配置环境时,自动执行密码创建、数据库创建等操作(本次设置了根密码、数据库、用户和时区)。

 

    1. 使用volumes将资源同步到以下目录以保留数据(即使停止Docker)。

 

    1. 配置文件和日志使用volumes进行同步。

 

    要在创建时自动执行的SQL文件,使用volumes同步到/docker-entrypoint-initdb.d/dump.sql,以实现自动执行。
  mysql:
    image: mysql:8.0
    ports:
      - "13306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: p@ssw0rd
      MYSQL_DATABASE: test
      MYSQL_USER: dev
      MYSQL_PASSWORD: dev
      TZ: Asia/Tokyo
    volumes:
      - "./mysql/mount:/var/lib/mysql"
      - "./mysql/settings/my.cnf:/etc/mysql/conf.d/my.cnf"
      - "./mysql/dump/setup.sql:/docker-entrypoint-initdb.d/dump.sql"
      - "./mysql/logs:/var/log/mysql"
    restart: always

Redis

    1. 为了外部访问,请公开16379端口。

 

    使用volumes将资源同步到mount下方(即使停止Docker,数据仍然保留)。
  redis:
    image: redis:alpine
    ports:
      - "16379:6379"
    volumes:
      - "./redis/mount:/data"

配置文件

虽然可以使用默认设置运行,但也应考虑到ECS的操作,因此需要准备配置文件。

Nginx (简称阿•吉恩•农夫•吉•耶_simplified)

默认配置文件

考虑到在构建时使用Codeigniter和FuelPHP环境,所以采用了这种形式。重点是将fastcgi_pass php:9000; 中的主机改为docker-compose服务名称(php)。

server {
    listen  80 default;
    server_name  localhost;

    charset utf-8;

    root /var/www/html/public;
    index index.php index.html index.htm;

    location / {
        index index.php index.html index.htm;
        try_files $uri $uri/ /index.php$is_args$args;
    }

    location /admin {
        auth_basic "Restricted";
        auth_basic_user_file /etc/nginx/.htpasswd;
        index index.php index.html index.htm;
        try_files $uri $uri/ /index.php$is_args$args;
    }

    location /reploxy {
        internal;
        resolver 8.8.8.8;
        set $reproxy $upstream_http_x_reproxy_url;
        proxy_pass $reproxy;
        proxy_set_header Authorization "";
    }

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

nginx配置文件

指定日志的位置

user  nginx nginx;
worker_processes  2;
pid  /var/run/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;
    error_log  /var/log/nginx/error.log warn;

    sendfile off;
    tcp_nopush on;
    tcp_nodelay  off;
    keepalive_timeout  30;
    send_timeout 60;

    gzip  on;
    gzip_http_version 1.0;
    gzip_comp_level 6;
    gzip_proxied any;
    gzip_min_length 10000;
    gzip_types  text/plain text/css application/x-javascript text/xml application/xml application/xml+rss text/javascript;
    gzip_disable "MSIE [1-6] \.";

    include /etc/nginx/conf.d/*.conf;
}

PHP可以被用来创建动态和互动的网站。

我参考了以下网站来设置php.ini和www.conf配置文件。

MySQL是一种关系型数据库管理系统。

我的.cnf

指定文字编码、指定日志位置等。

[mysqld]
# 文字コード/照合順序の設定
character-set-server = utf8mb4
collation-server = utf8mb4_bin

# タイムゾーンの設定
default-time-zone = SYSTEM
log_timestamps = SYSTEM

# デフォルト認証プラグインの設定
default-authentication-plugin = mysql_native_password

# エラーログの設定
log-error = /var/log/mysql/mysql-error.log

# スロークエリログの設定
slow_query_log = 1
slow_query_log_file = /var/log/mysql/mysql-slow.log
long_query_time = 5.0
log_queries_not_using_indexes = 0

# 実行ログの設定
general_log = 1
general_log_file = /var/log/mysql/mysql-query.log

[mysql]
default-character-set = utf8mb4

[client]
default-character-set = utf8mb4

执行文件

PHP (Hypertext Preprocessor)是一种开源的服务器端脚本语言,可以用于网页开发。

index.php 可以用来引导网站访问不同的网页。

サンプルでMySQLとRedisを使う
ポイントは接続ホストにDockerのサービス名を使うmysql redis

<?php

// MySQLテスト
echo "MySQLテスト<br />";
$mysqli = mysqli_connect("mysql", "dev", "dev", "test");
$query = "SELECT * FROM `user`";
$result = $mysqli->query($query);
$rows = array();
while ($row = $result->fetch_assoc()) {
    $rows[] = $row;
}
var_dump($rows);

echo "<hr />";

// Redisテスト
echo "Redisテスト<br />";
$redis = new Redis();
$redis->connect("redis", 6379);
$redis->set('key', 'value');
echo $redis->get('key');

MySQL是一种开源的关系型数据库管理系统。

设置.sql

创建容器时使用以下SQL设置执行查询: “./mysql/dump/setup.sql:/docker-entrypoint-initdb.d/dump.sql” 用于样本的设置。

use test;

DROP TABLE IF EXISTS `test`;

CREATE TABLE `user` (
  `name` VARCHAR(255) NOT NULL COMMENT 'Name',
  `age` INT(10) unsigned NOT NULL COMMENT 'Age',
  `updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='テスト用';

INSERT INTO `user` VALUES ("TAKASHI", 34, "0000-01-01", "9999-12-31");

运行docker-compose

ビルドして実行

$ docker-compose up --build

确认

请访问 http://127.0.0.1:8080/,并确认显示。

スクリーンショット 2021-05-11 9.25.47.png

下次,我們將在這個環境下逐步實現使用Composer、Xdebug、PHP框架(預計為Codeigniter)、UnitTest等工具。如果你認為這不錯的話,請關注(follow)我,點讚(LGTM)。

【PR】我們發布了編程報紙新聞!→ https://pronichi.com
【PR】我們正在舉辦一個叫做週末黑客馬拉松的活動!→ https://weekend-hackathon.toyscreation.jp/about/

广告
将在 10 秒后关闭
bannerAds