常用环境命令
bash
docker pull debian:latest
docker pull ubuntu:latest
docker pull nginx:latestbash
docker pull php:5.6-cli
docker pull php:5.6-fpm
docker pull php:7.4-cli
docker pull php:7.4-fpm
docker pull php:8.5-cli
docker pull php:8.5-fpm
docker pull composer:latest
docker pull golang:latest
docker pull node:latest
docker pull python:latestbash
docker pull phpmyadmin:latest
docker pull mysql:latest
docker pull mysql/mysql-server:5.7
docker pull postgres:latest
docker pull fudaoyuanicu/mycat2:latest
docker pull redis:latest
docker pull memcached:latest
docker pull mongodb/mongodb-community-server:latestbash
# 搜索引擎
docker pull elasticsearch:9.2.3
# 消息队列
docker pull rabbitmq:latest
# 版本控制工具
docker pull bitnami/git:latest
# 代码托管平台
docker pull gitea/gitea:latestdnmp 环境
dnmp 环境是一个基于 Docker 容器的开发环境,包含了 PHP、MySQL、Nginx 等常用的开发工具和服务。
创建目录结构
bash
# 创建 www 根目录
mkdir -p dnmp/{www,www/default}
# 创建 Nginx 配置目录
mkdir -p dnmp/{nginx,nginx/conf.d,nginx/logs}
# 创建 php 相关目录
mkdir -p dnmp/{php/85,php/85-cli,php/74,php/74-cli,php/56,php/56-cli}
# 创建 MySQL 相关目录
mkdir -p dnmp/{mysql/data,mysql/57/conf,mysql/57/data,mysql/latest/conf,mysql/latest/data}
# 创建 Redis 相关目录
mkdir -p dnmp/{redis/data,redis/conf}bash
# 创建 docker-compose.yml 文件
touch dnmp/docker-compose.yml
# 创建 MySQL 配置文件
touch dnmp/mysql/latest/conf/custom.cnf
touch dnmp/mysql/57/conf/custom.cnf
# 创建 Nginx 配置文件
touch dnmp/nginx/nginx.conf
touch dnmp/nginx/conf.d/default.conf
# 创建 PHP 配置文件
touch dnmp/php/85/php.ini
touch dnmp/php/85-cli/php.ini
touch dnmp/php/74/php.ini
touch dnmp/php/74-cli/php.ini
touch dnmp/php/56/php.ini
touch dnmp/php/56-cli/php.ini
# 创建 Redis 配置文件
touch dnmp/redis/conf/redis.confdocker 配置
yaml
version: '3'
services:
# Nginx
nginx:
container_name: dnmp-nginx
image: ${NGINX_IMAGE}
ports:
- "${NGINX_HTTP_PORT}:80"
- "${NGINX_HTTPS_PORT}:443"
volumes:
- ./www:/www
- ./nginx/conf.d:/etc/nginx/conf.d
- ./nginx/nginx.conf:/etc/nginx/nginx.conf
depends_on:
- php85
- php74
- php56
networks:
- dnmp
# PHP 8.5 FPM
php85:
container_name: dnmp-php85
build:
context: ./php/85
volumes:
- ./www:/www
networks:
- dnmp
# PHP 8.5 CLI
# php85-cli:
# container_name: dnmp-php85-cli
# build:
# context: ./php/85-cli
# volumes:
# - ./www:/www
# working_dir: /www/webman
# command: php start.php start
# networks:
# - dnmp
# PHP 8.5 CLI - 第二个项目
# php85-cli-project2:
# container_name: dnmp-php85-cli-project2
# build:
# context: ./php/85-cli
# volumes:
# - ./www:/www
# working_dir: /www/project2
# command: php start.php start
# networks:
# - dnmp
# PHP 7.4
php74:
container_name: dnmp-php74
build:
context: ./php/74
volumes:
- ./www:/www
networks:
- dnmp
# PHP 5.6
php56:
container_name: dnmp-php56
build:
context: ./php/56
volumes:
- ./www:/www
networks:
- dnmp
# MySQL (latest)
mysql:
container_name: dnmp-mysql
image: ${MYSQL_IMAGE}
ports:
- "${MYSQL_PORT}:3306"
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MYSQL_DATABASE: ${MYSQL_DATABASE}
MYSQL_USER: ${MYSQL_USER}
MYSQL_PASSWORD: ${MYSQL_PASSWORD}
volumes:
- ./mysql/latest/data:/var/lib/mysql
- ./mysql/latest/conf:/etc/mysql/conf.d
networks:
- ${NETWORK_NAME}
# MySQL 5.7
mysql57:
container_name: dnmp-mysql57
image: ${MYSQL57_IMAGE}
platform: linux/amd64
ports:
- "${MYSQL57_PORT}:3306"
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL57_ROOT_PASSWORD}
MYSQL_DATABASE: ${MYSQL57_DATABASE}
MYSQL_USER: ${MYSQL57_USER}
MYSQL_PASSWORD: ${MYSQL57_PASSWORD}
volumes:
- ./mysql/57/data:/var/lib/mysql
- ./mysql/57/conf:/etc/mysql/conf.d
networks:
- ${NETWORK_NAME}
# Redis
redis:
container_name: dnmp-redis
image: ${REDIS_IMAGE}
ports:
- "${REDIS_PORT}:6379"
volumes:
- ./redis/data:/data
- ./redis/conf/redis.conf:/etc/redis/redis.conf
networks:
- ${NETWORK_NAME}
# Composer
composer:
container_name: dnmp-composer
image: ${COMPOSER_IMAGE}
volumes:
- ./www:/app
networks:
- ${NETWORK_NAME}
# Git
git:
container_name: dnmp-git
image: ${GIT_IMAGE}
volumes:
- ./www:/app
networks:
- ${NETWORK_NAME}
# phpMyAdmin
phpmyadmin:
container_name: dnmp-phpmyadmin
image: ${PHPMYADMIN_IMAGE}
environment:
PMA_ARBITRARY: ${PMA_ARBITRARY}
PMA_HOST: ${PMA_HOST}
PMA_USER: ${PMA_USER}
PMA_PASSWORD: ${PMA_PASSWORD}
depends_on:
- mysql
- mysql57
networks:
- dnmp
networks:
dnmp:
driver: bridge
volumes:
mysql_data:
mysql57_data:
redis_data:Nginx 配置
nginx
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
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;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
}nginx
# 默认服务器块,处理所有未绑定的域名
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
root /www/default;
index index.html index.htm index.php;
location / {
try_files $uri $uri/ =404;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
# 使用 php 8.5 FPM 处理 PHP 请求
location ~ \.php$ {
fastcgi_pass php85:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}nginx
# 为 db.xmn.com 配置 HTTPS 访问 phpmyadmin
server {
listen 80;
server_name db.xmn.com;
# 禁用 IP 直接访问
if ($host !~ ^db\.xmn\.com$) {
return 403;
}
# 反向代理到 phpmyadmin 服务
location / {
proxy_pass http://phpmyadmin;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}nginx
# 为 api.xmn.com 配置反向代理到 webman
server {
listen 80;
server_name api.xmn.com;
# 禁用 IP 直接访问
if ($host !~ ^api\.xmn\.com$) {
return 403;
}
# 反向代理到 webman 服务
location / {
proxy_pass http://dnmp-php85-cli:8787;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}MySQL 配置
ini
[mysqld]
# 字符集设置
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
# 性能优化设置
innodb_buffer_pool_size = 256M
key_buffer_size = 64M
max_connections = 200
wait_timeout = 600
interactive_timeout = 600
# 查询缓存(MySQL 8.0+ 已移除,此处仅作为示例)
# query_cache_type=1
# query_cache_size=32M
# 日志设置
log_error = /var/log/mysql/error.log
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow-query.log
long_query_time = 2
# 其他设置
max_allowed_packet = 16M
tmp_table_size = 64M
max_heap_table_size = 64M
[client]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4ini
[mysqld]
# 字符集设置
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
# 性能优化设置
innodb_buffer_pool_size = 256M
key_buffer_size = 64M
max_connections = 200
wait_timeout = 600
interactive_timeout = 600
# 查询缓存(MySQL 5.7 支持)
query_cache_type = 1
query_cache_size = 32M
query_cache_limit = 2M
# 日志设置
log_error = /var/log/mysql/error.log
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow-query.log
long_query_time = 2
# 其他设置
max_allowed_packet = 16M
tmp_table_size = 64M
max_heap_table_size = 64M
[client]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4Php 配置
ini
; 错误处理
display_errors = On
display_startup_errors = On
error_reporting = E_ALL
log_errors = On
error_log = /var/log/php/error.log
; 时区设置
date.timezone = Asia/Shanghai
; 内存限制
memory_limit = 512M
; 上传设置
upload_max_filesize = 100M
post_max_size = 100MRedis 配置
ini
# 网络相关配置
# 绑定地址,0.0.0.0 表示允许所有网络访问
bind 0.0.0.0
# 端口号
port 6379
# 连接超时时间(秒)
timeout 0
# TCP 保持连接
tcp-keepalive 300
# 安全相关配置
# 保护模式,no 表示关闭,允许外部访问
protected-mode no
# 密码认证,默认无密码
# requirepass your_password_here
# 内存管理
# 最大内存限制,根据实际服务器内存调整
maxmemory 256mb
# 内存达到上限后的处理策略:volatile-lru(移除过期键)
maxmemory-policy volatile-lru
# 内存清理的采样数量
maxmemory-samples 5
# 持久化配置
# RDB 持久化
# 900秒内至少1个键被修改则触发持久化
save 900 1
# 300秒内至少10个键被修改则触发持久化
save 300 10
# 60秒内至少10000个键被修改则触发持久化
save 60 10000
# RDB 文件名
dbfilename dump.rdb
# RDB 文件存储目录
dir /data
# 当持久化出错时是否停止写入
stop-writes-on-bgsave-error yes
# RDB 文件压缩
rdbcompression yes
# RDB 文件校验
rdbchecksum yes
# AOF 持久化
# 是否开启 AOF 持久化,默认 no
aof-use-rdb-preamble yes
# AOF 文件名
appendfilename "appendonly.aof"
# AOF 持久化策略:everysec(每秒同步一次)
appendfsync everysec
# 在 AOF 重写期间是否不进行 fsync
no-appendfsync-on-rewrite no
# AOF 文件重写触发条件:当前 AOF 文件大小是上次重写时的100%且大于64MB
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
# 性能优化
# 最大客户端连接数
maxclients 10000
# 慢查询日志阈值(微秒)
slowlog-log-slower-than 10000
# 慢查询日志长度
slowlog-max-len 128
# 哈希表最大负载因子
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
# 列表压缩阈值
list-max-ziplist-size -2
# 集合压缩阈值
set-max-intset-entries 512
# 有序集合压缩阈值
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
# 其他配置
# 日志级别:debug, verbose, notice, warning
loglevel notice
# 日志文件,默认标准输出
# logfile "/var/log/redis/redis.log"
# 数据库数量
databases 16
# 客户端输出缓冲区限制
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
# 复制相关配置
# replicaof <masterip> <masterport>
# masterauth <master-password>
# 集群配置
# cluster-enabled yes
# cluster-config-file nodes.conf
# cluster-node-timeout 15000
# cluster-replica-validity-factor 10
# cluster-migration-barrier 1
# cluster-require-full-coverage yes
# cluster-replica-no-failover nophp 测试脚本
php
<?php
// 测试 MySQL 连接
echo "<h1>MySQL 连接测试</h1>";
try {
// 连接到最新版本的 MySQL
$mysql_conn = new PDO('mysql:host=mysql;dbname=test;charset=utf8mb4', 'test', 'test');
$mysql_conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
echo "<p style='color: green;'>✅ 成功连接到 MySQL (latest)</p>";
// 测试查询
$stmt = $mysql_conn->query("SELECT VERSION()");
$version = $stmt->fetchColumn();
echo "<p>MySQL 版本: $version</p>";
$mysql_conn = null;
} catch (PDOException $e) {
echo "<p style='color: red;'>❌ 无法连接到 MySQL (latest): " . $e->getMessage() . "</p>";
}
try {
// 连接到 MySQL 5.7
$mysql57_conn = new PDO('mysql:host=mysql57;dbname=test;charset=utf8mb4', 'test', 'test');
$mysql57_conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
echo "<p style='color: green;'>✅ 成功连接到 MySQL 5.7</p>";
// 测试查询
$stmt = $mysql57_conn->query("SELECT VERSION()");
$version = $stmt->fetchColumn();
echo "<p>MySQL 5.7 版本: $version</p>";
$mysql57_conn = null;
} catch (PDOException $e) {
echo "<p style='color: red;'>❌ 无法连接到 MySQL 5.7: " . $e->getMessage() . "</p>";
}
// 测试 Redis 连接
echo "<h1>Redis 连接测试</h1>";
try {
// 连接到 Redis
$redis = new Redis();
$redis->connect('redis', 6379);
echo "<p style='color: green;'>✅ 成功连接到 Redis</p>";
// 测试设置和获取数据
$redis->set('test_key', 'Hello Redis!');
$value = $redis->get('test_key');
echo "<p>Redis 测试值: $value</p>";
$redis->close();
} catch (Exception $e) {
echo "<p style='color: red;'>❌ 无法连接到 Redis: " . $e->getMessage() . "</p>";
}
// 测试 PHP 版本
echo "<h1>PHP 信息</h1>";
echo "<p>PHP 版本: " . PHP_VERSION . "</p>";
// 遍历已安装的扩展
$extensions = get_loaded_extensions();
echo "<h2>已安装的扩展</h2>";
foreach ($extensions as $ext) {
echo "<p style='color: green;font-size: 12px;'>✅ $ext 扩展已安装</p>";
}php
<?php
phpinfo();