Docker部署镜像的关键知识点:

  1. 镜像的无状态原则:镜像属于只读模版,打包程序、运行环境,本身不存储运行时产生的数据;同一镜像可以启动多个容器(沙箱),相互独立、互不干扰;容器销毁后容器内临时数据直接丢失。
  2. 数据的持久化要求:容器生命周期结束后数据丢失,而磁盘挂载将业务数据、配置文件剥离容器保存,实现数据脱离容器独立留存。

Nginx简介

2002年Igor Sysoev 开发 Nginx,目标用于俄罗斯高流量门户网站,解决大并发、高访问场景下 Apache 性能孱弱的痛点。

出色的核心设计包括:

  1. 多进程+IO多路复用:Master进程处理主线、Worker进程处理连接,单个进程可以维护成千上万个TCP连接。
  2. 事件驱动异步非阻塞:IO读写使用异步处理,静态文件、反向代理等待磁盘/网络期间,处理其他请求,效率拉满。
  3. 模块化架构:内核极简,大多数功能(SSL、gzip、rewrite、限流、缓存)以插件模块实现,按需编译,轻量无冗余。
  4. 经典能力场景:
    • 反向代理:接收请求后转发,隐藏后端真实IP,实现安全隔离。
    • 负载均衡:内置轮询、加权轮询、IP哈希策略,流量分发,分摊压力。
    • 动静分离:静态资源本地读取,动态接口转发给后端服务。
    • 热重载:nginx -s reload,Master生成Worker处理新请求,就Worker处理完后销毁,全程服务不中断。

Docker启动Nginx

磁盘挂载关键目录:

/dev-ops/
├── nginx/          
│   ├── conf/        
│   ├── html/        
│   ├── logs/        
│   └── ssl/         
└── docker-compose.yml

创建对应目录:

sudo mkdir -p /dev-ops/nginx/{conf,html,logs,ssl}

有三个必要的文件:基础配置(/dev-ops/nginx/conf/nginx.conf)、服务配置(/dev-ops/nginx/conf/conf.d/default.conf)和首页(/dev-ops/nginx/html/index.html)

#   /dev-ops/nginx/conf/nginx.conf

user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
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;
}
# /dev-ops/nginx/conf/conf.d/default.conf
server {
    listen       80;
    listen  [::]:80;

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

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

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root /usr/share/nginx/html;
    }

}
# /dev-ops/nginx/html/index.html

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Nginx</title>
</head>
<body>
Hi Boy, Congratulations on your successful deployment!
</body>
</html>

容器编排文件/dev-ops/docker-compose.yml

# 命令执行 docker-compose up -d
# docker-compose -f docker-compose.yml up -d
version: '3.9'
services:
  # yum install -y httpd-tools
  nginx:
    image: registry.cn-hangzhou.aliyuncs.com/xfg-studio/nginx:1.25.1
    container_name: nginx
    restart: always
    ports:
      - '443:443'
      - '80:80'
    volumes:
      - ./nginx/logs:/var/log/nginx
      - ./nginx/html:/usr/share/nginx/html
      - ./nginx/conf/nginx.conf:/etc/nginx/nginx.conf
      - ./nginx/conf/conf.d:/etc/nginx/conf.d
      - ./nginx/ssl:/etc/nginx/ssl/
    privileged: true

容器启动Nginx:

# cd进入到/dev-ops/目录下
docker-compose -f docker-compose.yml up -d

直接访问验证,地址 http://云服务器IP,显示index.html内容:

Hi Boy, Congratulations on your successful deployment!

SSL证书配置

获取免费自动续期的证书

推荐👉 https://httpsok.com/p/5Dq3, 🔐 httpsok|SSL证书自动续期工具

一行命令,完成证书申请、自动续期、自动部署;避免证书过期,适合长期稳定运行的服务。

操作指导:https://httpsok.com/doc/guide/apply.html

然后获取到了证书文件,我选择的tar.gz格式的压缩包:_.qiubuer.cn_nginx_rsa.tar.gz(qiubuer.cn是我的域名)

配置证书

本地打开Git Bash使用scp上传到云服务器:

scp _.qiubuer.cn_nginx_rsa.tar.gz 登录用户名@云服务器IP:/dev-ops/nginx/ssl

云服务器进入指定目录解压后,生成两个文件:xxx.xxxx.keyxxx.xxxx.pem

tar -zxf _.qiubuer.cn_nginx_rsa.tar.gz 

配置证书/dev-ops/nginx/ssl/conf/conf.d/qiubuer.cn.conf,替换对应的域名就ok了。

server {
    listen       80;
    listen  [::]:80;
    server_name  qiubuer.cn;

    rewrite ^(.*) https://$server_name$1 permanent;

}

server {
    listen       443 ssl;
    server_name  qiubuer.cn;

    ssl_certificate      /etc/nginx/ssl/_.qiubuer.cn.pem;
    ssl_certificate_key  /etc/nginx/ssl/_.qiubuer.cn.key;

    ssl_session_cache    shared:SSL:1m;
    ssl_session_timeout  5m;

    ssl_ciphers  HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers  on;

    location / {
        proxy_set_header   X-Real-IP         $remote_addr;
        proxy_set_header   Host              $http_host;
        proxy_set_header   X-Forwarded-For   $proxy_add_x_forwarded_for;
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

重启nginx,还是进入到/dev-ops/目录下

# 停止并删除容器+项目专属网络
docker-compose -f docker-compose.yml down
# 重新创建网络并启动
docker-compose -f docker-compose.yml up -d

这次直接访问https://域名,显示index.html内容就是成功了:

Hi Boy, Congratulations on your successful deployment!

证书配置自动续期

为了避免证书续签的麻烦事, https://httpsok.com/p/5Dq3提供了自动续签脚本。

操作路径:左侧自动部署 —> 选择服务器tab —> 安装脚本选择nginx —> 会自动生成到剪贴板。

自动续签

服务器操作:

# 查看启动的容器名称  有个nginx的容器 
docker ps
# 进入nginx容器内部
docker exec -it nginx /bin/bash

直接执行复制的脚本:

执行脚本

提示success就可以去httpsok控制台查看:下方就会出现自动部署的记录。

证书监控页面也有记录显示,可以点击检测按钮刷新状态和显示有效期。