【Docker 实践】Nginx

2025-12-07 17:22:48

目录:

一、Dockerfile

1.1 本地测试

创建目录结构如下:

|-- myapp
    |-- html/               # 静态资源文件
        |-- index.html
    |-- nginx.conf          # nginx 配置文件
    |-- Dockerfile          # Dockerfile

html/index.html 内容如下:

<h1 style="color: red;">docker nginx demo</h1>

nginx.conf 内容如下:

server {
    listen       80;
    server_name  localhost;     # 可替换为您的域名

    # 访问日志和错误日志路径,将写入挂载的logs目录
    access_log  /var/log/nginx/access.log;
    error_log   /var/log/nginx/error.log;

    location / {
        # 网站根目录,对应挂载的html目录
        root   /usr/share/nginx/html; 
        index  index.html index.htm;
        # 以下一行对于 Vue、React 等单页应用 (SPA) 的路由模式至关重要
        try_files $uri $uri/ /index.html;
    }

    # 可选的错误页面配置
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

Dockerfile 内容如下:

FROM nginx:alpine

# 复制 nginx 配置文件
COPY nginx.conf /etc/nginx/conf.d/default.conf
# 复制静态资源文件
COPY html /usr/share/nginx/html

# 对外暴漏端口
EXPOSE 80

CMD ["nginx", "-g", "daemon off;"]

构建镜像:

$ docker build -t my-nginx-website .

运行容器:

$ docker run -d \
--name my-website \
-p 80:80 \
my-nginx-website

运行容器后,在浏览器中访问 http://localhost 就可以看到效果了。

如果是开发环境,在运行容器时可以添加 -v 参数挂载配置文件和静态资源文件。

$ docker run -d \
--name my-website \
-p 80:80 \
-v ./nginx.conf:/etc/nginx/conf.d/default.conf \
-v ./html:/usr/share/nginx/html \
-v ./logs:/var/log/nginx \
my-nginx-website

修改 html/index.html 文件,刷新浏览器,看到页面已经更新了。

修改 nginx.conf,配置不会立即生效,其实 Nginx 容器内配置文件内容已改变,但还需要执行一条命令让配置生效。

$ docker exec <nginx-container-id> nginx -s reload

1.2 生产环境

使用域名和 HTTPS 访问网站。

创建目录结构如下:

|-- myapp
    |-- ssl/
        |-- yourdomain.crt  # 证书
        |-- yourdomain.key  # 私钥
    |-- html/               # 静态资源文件
        |-- index.html
    |-- nginx.conf          # nginx 配置文件
    |-- Dockerfile          # Dockerfile

HTTPS 需要证书,将申请好的证书和私钥放在 ssl 目录下。

html/index.html 内容如下:

<h1 style="color: red;">docker nginx https demo</h1>

nginx.conf 内容如下:

server {
    listen       443 ssl;
    server_name  www.yourdomain.com; # 替换为您的域名

    # SSL证书和私钥的路径(与Dockerfile中COPY的路径一致)
    ssl_certificate      /etc/nginx/ssl/yourdomain.crt;
    ssl_certificate_key  /etc/nginx/ssl/yourdomain.key;
    # 增强SSL安全性的配置
    ssl_session_timeout  5m;
    ssl_protocols        TLSv1.2 TLSv1.3; # 推荐使用较新的安全协议
    ssl_ciphers          ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
    ssl_prefer_server_ciphers on;

    # 访问日志和错误日志路径,将写入挂载的logs目录
    access_log  /var/log/nginx/access.log;
    error_log   /var/log/nginx/error.log;

    location / {
        # 网站根目录,对应挂载的html目录
        root   /usr/share/nginx/html; 
        index  index.html index.htm;
        # 以下一行对于 Vue、React 等单页面应用 (SPA) 的路由模式至关重要
        try_files $uri $uri/ /index.html;
    }

    # 可选的错误页面配置
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

# 配置 HTTP 到 HTTPS 的重定向
server {
    listen       80;
    server_name  www.yourdomain.com; # 替换为您的域名
    # 将所有 HTTP 请求永久重定向到 HTTPS
    return 301 https://$server_name$request_uri;
}

Dockerfile 内容如下:

FROM nginx:alpine

# 将宿主机上的SSL证书和私钥复制到镜像内的指定目录
RUN mkdir -p /etc/nginx/ssl
COPY ssl/yourdomain.crt /etc/nginx/ssl/
COPY ssl/yourdomain.key /etc/nginx/ssl/
# 复制 nginx 配置文件
COPY nginx.conf /etc/nginx/conf.d/default.conf
# 复制静态资源文件
COPY html /usr/share/nginx/html

# https 默认端口是 443,因此容器内需要对外暴露 443 端口
EXPOSE 80 443

CMD ["nginx", "-g", "daemon off;"]

构建镜像:

$ docker build -t my-https-website .

运行容器:

$ docker run -d \
  --name my-website \
  -p 80:80 \
  -p 443:443 \
  my-https-website

运行容器后,在浏览器中访问 http://www.yourdomian.com 就可以看到效果了。

二、docker-compose.yml

2.1 本地测试

创建目录结构如下:

|-- myapp
    |-- html/               # 静态资源文件
        |-- index.html
    |-- nginx.conf          # nginx 配置文件
    |-- docker-compose.yml  

html/index.html 内容如下:

<h1 style="color: red;">docker nginx demo</h1>

nginx.conf 内容如下:

server {
    listen       80;
    server_name  localhost;     # 可替换为您的域名

    # 访问日志和错误日志路径,将写入挂载的logs目录
    access_log  /var/log/nginx/access.log;
    error_log   /var/log/nginx/error.log;

    location / {
        # 网站根目录,对应挂载的html目录
        root   /usr/share/nginx/html; 
        index  index.html index.htm;
        # 以下一行对于 Vue、React 等单页应用 (SPA) 的路由模式至关重要
        try_files $uri $uri/ /index.html;
    }

    # 可选的错误页面配置
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

docekr-compose.yml 文件如下:

services:
  web:
    image: my-nginx-website # 或直接使用 nginx:alpine,通过挂载提供所有配置
    container_name: my-website
    ports:
      - "80:80"
    volumes:
      - ./nginx.conf:/etc/nginx/conf.d/default.conf  # 挂载配置
      - ./html:/usr/share/nginx/html                 # 挂载网站文件
      - ./logs:/var/log/nginx                        # 挂载日志
    restart: always # 设置容器总是自动重启

使用以下命令启动和管理:

# 启动服务
$ docker-compose up -d

# 停止服务
$ docker-compose down

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

2.2 生产环境

使用域名和 HTTPS 访问网站。

创建目录结构如下:

|-- myapp
    |-- ssl/
        |-- yourdomain.crt  # 证书
        |-- yourdomain.key  # 私钥
    |-- html/               # 静态资源文件
        |-- index.html
    |-- nginx.conf          # nginx 配置文件
    |-- docker-compose.yml

HTTPS 需要证书,将申请好的证书和私钥放在 ssl 目录下。

html/index.html 内容如下:

<h1 style="color: red;">docker nginx https demo</h1>

nginx.conf 内容如下:

server {
    listen       443 ssl;
    server_name  www.yourdomain.com; # 替换为您的域名

    # SSL证书和私钥的路径(与Dockerfile中COPY的路径一致)
    ssl_certificate      /etc/nginx/ssl/yourdomain.crt;
    ssl_certificate_key  /etc/nginx/ssl/yourdomain.key;
    # 增强SSL安全性的配置
    ssl_session_timeout  5m;
    ssl_protocols        TLSv1.2 TLSv1.3; # 推荐使用较新的安全协议
    ssl_ciphers          ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
    ssl_prefer_server_ciphers on;

    # 访问日志和错误日志路径,将写入挂载的logs目录
    access_log  /var/log/nginx/access.log;
    error_log   /var/log/nginx/error.log;

    location / {
        # 网站根目录,对应挂载的html目录
        root   /usr/share/nginx/html; 
        index  index.html index.htm;
        # 以下一行对于 Vue、React 等单页面应用 (SPA) 的路由模式至关重要
        try_files $uri $uri/ /index.html;
    }

    # 可选的错误页面配置
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

# 配置 HTTP 到 HTTPS 的重定向
server {
    listen       80;
    server_name  www.yourdomain.com; # 替换为您的域名
    # 将所有 HTTP 请求永久重定向到 HTTPS
    return 301 https://$server_name$request_uri;
}

docekr-compose.yml 文件如下:

services:
  web:
    image: my-nginx-website # 或直接使用 nginx:alpine,通过挂载提供所有配置
    container_name: my-website
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx.conf:/etc/nginx/conf.d/default.conf  # 挂载配置
      - ./html:/usr/share/nginx/html                 # 挂载网站文件
      - ./ssl:/etc/nginx/ssl:ro                      # 挂载 SSL 证书
      - ./logs:/var/log/nginx                        # 挂载日志
    restart: always # 设置容器总是自动重启

使用以下命令启动和管理:

# 启动服务
$ docker-compose up -d

# 停止服务
$ docker-compose down

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

运行容器后,在浏览器中访问 http://www.yourdomian.com 就可以看到效果了。

返回首页

本文总阅读量  次
皖ICP备17026209号-3
总访问量: 
总访客量: