我来详细介绍Docker Compose安装和使用Nginx的方法。

一、安装Docker和Docker Compose

1. 安装Docker

# Ubuntu/Debian
sudo apt update
sudo apt install docker.io

# CentOS/RHEL
sudo yum install docker
sudo systemctl start docker
sudo systemctl enable docker

# 验证安装
docker --version

2. 安装Docker Compose

# 下载最新版本(当前v2.x)
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

# 赋予执行权限
sudo chmod +x /usr/local/bin/docker-compose

# 验证安装
docker-compose --version

# 或者使用新版命令
docker compose version

二、基本Nginx配置

1. 创建项目目录

mkdir nginx-docker && cd nginx-docker

2. 创建docker-compose.yml文件

version: '3.8'

services:
  nginx:
    image: nginx:latest
    container_name: my-nginx
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
      - ./html:/usr/share/nginx/html
      - ./logs:/var/log/nginx
      - ./ssl:/etc/nginx/ssl
    restart: unless-stopped
    networks:
      - nginx-network

networks:
  nginx-network:
    driver: bridge

3. 创建Nginx配置文件

创建 nginx.conf:

user nginx;
worker_processes auto;
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;
    tcp_nodelay on;
    keepalive_timeout 65;
    types_hash_max_size 2048;

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

    # 默认服务器配置
    server {
        listen 80;
        server_name localhost;

        location / {
            root /usr/share/nginx/html;
            index index.html index.htm;
        }

        location /status {
            stub_status on;
            access_log off;
            allow 127.0.0.1;
            deny all;
        }
    }
}

4. 创建示例HTML页面

mkdir html
echo "<h1>Welcome to Nginx Docker!</h1>" > html/index.html

5. 启动Nginx容器

# 启动服务
docker-compose up -d

# 查看运行状态
docker-compose ps

# 查看日志
docker-compose logs -f nginx

# 停止服务
docker-compose down

三、高级配置示例

1. 多站点配置

创建 docker-compose.yml:

version: '3.8'

services:
  nginx:
    image: nginx:latest
    container_name: nginx-proxy
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
      - ./conf.d:/etc/nginx/conf.d
      - ./sites:/var/www/html
      - ./ssl:/etc/nginx/ssl
      - ./logs:/var/log/nginx
    restart: unless-stopped
    networks:
      - web-network

networks:
  web-network:
    driver: bridge

创建站点配置文件 conf.d/site1.conf:

server {
    listen 80;
    server_name site1.example.com;

    location / {
        root /var/www/html/site1;
        index index.html;
    }
}

server {
    listen 80;
    server_name site2.example.com;

    location / {
        root /var/www/html/site2;
        index index.html;
    }
}

2. SSL证书配置

server {
    listen 443 ssl http2;
    server_name example.com;

    ssl_certificate /etc/nginx/ssl/example.com.crt;
    ssl_certificate_key /etc/nginx/ssl/example.com.key;

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;

    location / {
        root /var/www/html/secure-site;
        index index.html;
    }
}

3. 反向代理配置

version: '3.8'

services:
  nginx:
    image: nginx:latest
    ports:
      - "80:80"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
      - ./proxy.conf:/etc/nginx/conf.d/proxy.conf
    depends_on:
      - webapp1
      - webapp2
    networks:
      - app-network

  webapp1:
    image: my-webapp:latest
    networks:
      - app-network

  webapp2:
    image: another-webapp:latest
    networks:
      - app-network

networks:
  app-network:
    driver: bridge

创建 proxy.conf:

upstream backend {
    server webapp1:3000;
    server webapp2:3000;
}

server {
    listen 80;

    location / {
        proxy_pass http://backend;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

四、常用管理命令

# 启动服务
docker-compose up -d

# 停止服务
docker-compose down

# 重启服务
docker-compose restart

# 查看日志
docker-compose logs
docker-compose logs -f nginx  # 实时查看

# 查看状态
docker-compose ps
docker stats

# 进入容器
docker-compose exec nginx bash
docker-compose exec nginx nginx -t  # 测试配置

# 重新加载配置(不重启容器)
docker-compose exec nginx nginx -s reload

# 停止并删除所有资源
docker-compose down -v

# 构建镜像(如果有自定义Dockerfile)
docker-compose build

# 查看服务日志
docker-compose logs --tail=100 nginx

# 查看资源使用
docker-compose top

五、性能优化配置

Docker Compose资源限制:

services:
  nginx:
    image: nginx:alpine  # 使用更小的Alpine版本
    deploy:
      resources:
        limits:
          memory: 512M
          cpus: '1'
        reservations:
          memory: 256M
          cpus: '0.5'

优化的Nginx配置:

events {
    worker_connections 4096;
    multi_accept on;
    use epoll;
}

http {
    # 启用gzip压缩
    gzip on;
    gzip_vary on;
    gzip_min_length 1024;
    gzip_types text/plain text/css text/xml text/javascript application/javascript application/json application/xml+rss;

    # 缓存配置
    open_file_cache max=1000 inactive=20s;
    open_file_cache_valid 30s;
    open_file_cache_min_uses 2;
}

六、完整示例项目结构

nginx-docker/
├── docker-compose.yml
├── nginx.conf
├── conf.d/
│   ├── default.conf
│   ├── site1.conf
│   └── site2.conf
├── html/
│   ├── index.html
│   ├── site1/
│   └── site2/
├── ssl/
│   ├── cert.pem
│   └── key.pem
└── logs/
    ├── access.log
    └── error.log

这样你就有了一个完整的Nginx Docker环境,可以根据需要调整配置。