Skip to content

常用环境命令

bash
docker pull debian:latest
docker pull ubuntu:latest
docker pull nginx:latest
bash
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:latest
bash
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:latest
bash
# 搜索引擎
docker pull elasticsearch:9.2.3
# 消息队列
docker pull rabbitmq:latest
# 版本控制工具
docker pull bitnami/git:latest
# 代码托管平台
docker pull gitea/gitea:latest

dnmp 环境

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.conf

docker 配置

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 = utf8mb4
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 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 = utf8mb4

Php 配置

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 = 100M

Redis 配置

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 no

php 测试脚本

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();