使用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和反向代理服务器。
-
- 为外部访问,将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 – 文件
-
- 使用PHP镜像
-
- 使用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是一种关系型数据库管理系统。
-
- 为了外部访问,公开13306端口。
-
- 在配置环境时,自动执行密码创建、数据库创建等操作(本次设置了根密码、数据库、用户和时区)。
-
- 使用volumes将资源同步到以下目录以保留数据(即使停止Docker)。
-
- 配置文件和日志使用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
-
- 为了外部访问,请公开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/,并确认显示。
下次,我們將在這個環境下逐步實現使用Composer、Xdebug、PHP框架(預計為Codeigniter)、UnitTest等工具。如果你認為這不錯的話,請關注(follow)我,點讚(LGTM)。
【PR】我們發布了編程報紙新聞!→ https://pronichi.com
【PR】我們正在舉辦一個叫做週末黑客馬拉松的活動!→ https://weekend-hackathon.toyscreation.jp/about/