docker番外篇-最詳細的安裝及部署專案教程(net framework,netcore,java,nodejs,靜態html,mysql,redis,私有倉庫,https免費證書等)

wuyubing發表於2024-11-22

目錄
  • 本地widows(win11)docker環境安裝
    • 安裝Docker Desktop
  • 伺服器liunx(ubuntu)docker環境安裝
    • 安裝nginx
    • 安裝docker環境
    • 安裝docker compose
    • docker私有倉庫部署
    • docker部署mysql5.7
    • docker部署Redis
  • 各專案的釋出及執行
    • 舊的NET Framework專案
    • netcore專案-有原始碼
    • netcore專案-無原始碼
    • java專案
    • nodejs專案
    • 靜態專案
    • https免費證書配置
  • 最後

本地widows(win11)docker環境安裝

安裝Docker Desktop

Windows只需要安裝Docker Desktop就可以完成docker和docker-compose的環境;系統要求至少win10版本號19041 以上

  1. 檢查是否啟動了虛擬平臺;控制皮膚》程式》程式和功能》啟動或關閉Windows功能
  • win10
    在這裡插入圖片描述
    在這裡插入圖片描述

  • win11
    在這裡插入圖片描述

  1. 安裝之前先檢查系統是否已經有wsl2
  • 開啟cmd命令視窗執行wsl --version,出現類似下圖表示已經有
    在這裡插入圖片描述
  • 如果沒有wsl2就得先安裝,開啟PowerShell(管理員)執行wsl --install
  • 如果有存在了需要升級到最新版本wsl --update
  • 執行命令設定wsl版本wsl --set-default-version 2
  1. 下載Docker Desktop根據自己系統選擇下載版本一般情況下應該是AMD64
    在這裡插入圖片描述
  2. 修改配置
    在這裡插入圖片描述
  • 完整的配置內容
{
  "builder": {
    "gc": {
      "defaultKeepStorage": "20GB",
      "enabled": true
    }
  },
  "experimental": false,
  "insecure-registries": [
    "http://47.xx.xx.46:2201",
    "http://xx.106.79.1xx:8080",
    "http://39.xx.170.xxx:6633",
    "http://127.0.0.1:6633"
  ],
  "registry-mirrors": [
    "https://mirrors.cloud.tencent.com",
    "https://registry.docker-cn.com",
    "https://docker.mirrors.ustc.edu.cn",
    "https://hub-mirror.c.163.com",
    "https://mirror.baidubce.com",
    "https://ccr.ccs.tencentyun.com"
  ]
}
  • nsecure-registries上面配置裡這個是配置非安全連結的私有倉庫,就是私有倉庫部署的時候沒有用https直接是http的需要加在這裡面跟白名單一個意思。
  • registry-mirrors這個是映象源配置,下面伺服器配置的時候也是一樣。

伺服器liunx(ubuntu)docker環境安裝

安裝nginx

  1. 執行安裝apt-install nginx 安裝過程遇到提示直接選y
  2. 驗證是否安裝成功nginx -v

安裝docker環境

  1. 執行安裝apt-install docker.io
  2. 驗證安裝是否成功docker -v
  3. 配置映象源和私有倉庫編輯檔案vim /etc/docker/daemon.json內容改為如下

{
  "registry-mirrors": [
     "https://l0xxxx85.mirror.aliyuncs.com",
     "https://mirrors.cloud.tencent.com",
     "https://registry.docker-cn.com",
     "https://docker.mirrors.ustc.edu.cn",
     "https://hub-mirror.c.163.com",
     "https://mirror.baidubce.com",
     "https://ccr.ccs.tencentyun.com"
     ],
  "insecure-registries": ["http://47.1xx.xx.xxx:6633"]
}

  • registry-mirrors這個是配置映象源的,https://l0xxxx85.mirror.aliyuncs.com這個是阿里映象源可以去阿里雲獲取獲取映象加速器
    還有一些其他國內的可以都新增上
  • insecure-registries這個是配置私有倉庫,如果私有倉庫沒有啟用https那就得在這邊新增一下,表示允許獲取非安全地址的映象,下面步驟配置完私有倉庫後可以回來修改這個地方。
  1. 載入配置sudo systemctl daemon-reload然後重啟dockersudo systemctl restart docker

安裝docker compose

  1. 執行下載安裝命令sudo curl -L "https://github.com/docker/compose/releases/download/v2.21.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
  2. 賦予執行許可權sudo chmod +x /usr/local/bin/docker-compose
  3. 驗證是否安裝成功docker-compose --version
  4. 找個目錄建立通用執行指令碼,此指令碼為了根據配置自動拉取映象更新後續會常用,如在/home下建立一個資料夾dockersh,然後建立指令碼檔名為update_docker_compose3.0.sh內容如下:
#!/bin/bash

# 檢查是否提供了引數
if [ -z "$1" ] || [ -z "$2" ]; then
  echo "Usage: $0 <docker-compose-file> <image-version>"
  exit 1
fi

# 使用傳入的引數作為 docker-compose 檔案和映象版本號
COMPOSE_FILE=$1
IMAGE_VERSION=$2

# 提取專案名稱(從檔名中提取或根據檔名設定)
PROJECT_NAME=$(basename "$COMPOSE_FILE" .yml)

# 更新映象
echo "Pulling the latest images using ${COMPOSE_FILE} and image version ${IMAGE_VERSION}..."
if ! IMAGE_VERSION=$IMAGE_VERSION docker-compose -f $COMPOSE_FILE -p $PROJECT_NAME pull; then
  echo "Failed to pull the latest images. Exiting..."
  exit 1
fi

# 停止並刪除當前的容器
echo "Stopping and removing current containers for project ${PROJECT_NAME}..."
if ! IMAGE_VERSION=$IMAGE_VERSION docker-compose -f $COMPOSE_FILE -p $PROJECT_NAME down --remove-orphans; then
  echo "Failed to stop and remove current containers. Exiting..."
  exit 1
fi

# 重新建立並啟動服務
echo "Starting containers with the latest images and image version ${IMAGE_VERSION} for project ${PROJECT_NAME}..."
if ! IMAGE_VERSION=$IMAGE_VERSION docker-compose -f $COMPOSE_FILE -p $PROJECT_NAME up -d; then
  echo "Failed to start containers with the latest images. Exiting..."
  exit 1
fi

# 清理舊映象
echo "Cleaning up old images..."
if ! docker image prune -f; then
  echo "Failed to clean up old images. Exiting..."
  exit 1
fi

echo "Update complete!"

  1. 給指令碼執行許可權chmod +x update_docker_compose3.0.sh

docker私有倉庫部署

  1. 安裝htpasswd-tool來生成密碼檔案
# Ubuntu 或 Debian
sudo apt-get update
sudo apt-get install apache2-utils

# CentOS 或 Red Hat
sudo yum install httpd-tools

  1. 建立存放密碼檔案的目錄mkdir /var/auth
  2. 建立使用者名稱和密碼
htpasswd -Bc /var/auth/registry.password admin
  • -B 表示使用 bcrypt 演算法加密密碼(推薦使用)。
  • -c 表示建立新的 .htpasswd 檔案。如果你要為其他使用者新增密碼,可以去掉 -c,這樣可以避免覆蓋檔案。
  • 上面的命令執行之後會讓你輸入密碼錶示設定這個賬號的密碼
  1. 檢視是否建立成功cat /var/auth/registry.password
  2. 編寫一個容器編排指令碼比如放在/home目錄下名稱叫docker-compose-rep.yml內容如下
version: '3'

services:
  registry:
    image: registry:2
    ports:
      - "6633:5000"
    environment:
      REGISTRY_AUTH: "htpasswd"
      REGISTRY_AUTH_HTPASSWD_REALM: "Registry Realm"
      REGISTRY_AUTH_HTPASSWD_PATH: "/auth/registry.password" #容器密碼檔案路徑下面做對映
    volumes:
      - /var/auth:/auth  # 掛載存放密碼檔案的目錄
      - /var/docker/registry/data:/var/lib/registry  # 存放映象資料的目錄

  1. 啟動私有倉庫docker-compose -f docker-compose-rep.yml up -d
  2. 登入私有倉庫docker login http://47.xxx.xx.xx:6633,執行之後根據提示輸入賬號和密碼,看到提示如果顯示成功就可以。
  • 特別說明如果沒有配置https那docker請求的時候會報錯這時候應該

docker部署mysql5.7

  1. 獲取映象docker pull mysql:5.7;上面已經配置了國內映象源應該是直接執行就可以,如果獲取不了映象需要外網請求那就需要有一個可以獲取映象的環境,獲取之後放到自己的私有倉庫再去拉取。
  2. 建立存放資料的目錄mkdir /var/mysql_data
  3. 執行映象docker run --name=mysql57 --restart=unless-stopped -e MYSQL_ROOT_PASSWORD=123456 -v /var/mysql_data:/var/lib/mysql -p 3306:3306 -d mysql:5.7 --lower-case-table-names=1;關鍵字說明:(MYSQL_ROOT_PASSWORD=密碼,-v 設定持久化對映路徑,-p設定埠號,命令列裡冒號前面的是主機路徑或埠號冒號後面的是容器路徑或埠號,lower-case-table-names=1不區分大小寫)
  • 常用的 --restart策略:
    no:預設值。容器不會在重啟後自動啟動。
    always:無論容器的退出狀態如何,都會在伺服器重啟後自動啟動容器。
    unless-stopped:與 always 類似,但手動停止的容器不會自動重啟。
    on-failure[
    ]:僅在容器因錯誤退出時自動重啟,可以設定最大重啟次數。

docker部署Redis

  1. 拉取Redis映象docker pull redis
  2. 找個目錄建一下配置檔案檔名叫redis.conf內容為
################################ SNAPSHOTTING  ################################
 
# 持久化儲存策略配置
# 在900s內,如果至少有1個key進行了修改,就進行持久化操作
save 900 1
# 在300s內,如果至少有10個key進行了修改,就進行持久化操作
save 300 10
# 在60s內,如果至少有10000個key進行了修改,就進行持久化操作
save 60 10000
# 配置如果持久化出錯,Redis是否禁止寫入命令 yes:禁止寫入命令,no:允許寫入命令(存在資料丟失風險)
stop-writes-on-bgsave-error yes
# 配置是否壓縮rdb檔案。[開啟(yes)的話,會消耗一定的cpu資源]
rdbcompression yes
# 儲存rdb檔案的時候,進行錯誤的檢查校驗
rdbchecksum yes
# 預設持久化儲存後的檔名
dbfilename dump.rdb
# rdb檔案儲存的目錄
dir ./
 
# 設定訪問、登入的密碼,設定requirepass 您的密碼
requirepass wyb123456
 
 
############################## APPEND ONLY MODE ###############################
 
 
# 是否開啟aof持久化模式,預設值:no,不開啟。redis的預設持久化策略是edb模式
appendonly no
 
# 持久化檔名稱
appendfilename "appendonly.aof"
 
# 持久化策略設定
# appendfsync always # 每次修改都進行持久化操作
# 每秒執行一次持久化操作
appendfsync everysec
# appendfsync no     # 不執行持久化操作,相當於未開啟aof持久化策略
 
# 設定為yes表示rewrite期間對新寫操作不fsync,暫時存在記憶體中,等rewrite完成後再寫入,預設為no,建議yes
no-appendfsync-on-rewrite no
 
# AOF自動重寫配置,預設值為100
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
 
# Redis在以AOF方式恢復資料時,對最後一條可能出問題的指令的處理方式,預設值yes
aof-load-truncated yes
 
# 當重寫AOF檔案時,Redis能夠在AOF檔案中使用RDB前導碼,以便更快地重寫和恢復,啟用此選項時,重寫的AOF檔案由兩個不同的節組成:
# [RDB file][AOF tail],當載入AOF檔案時,Redis透過以 “REDIS” 字串開頭的AOF檔案識別出此檔案是由RDB和AOF組合而成的,Redis會先載入RDB部分,然後再載入AOF部分,預設值yes
# aof-use-rdb-preamble yes
 
 
 
################################### CLIENTS ####################################
 
# 設定客戶端最大連線數,該配置一般無需修改,使用預設值即可
# maxclients 10000
 
############################## MEMORY MANAGEMENT ################################
 
# redis配置的最大記憶體容量
# maxmemory <bytes>
 
# 到達記憶體容量限制之後的處理策略
# maxmemory-policy noeviction
  • requirepass 以上配置內容這個是修改密碼的
  1. 執行redis容器 docker run --restart=always -p 6379:6379 --name myredis -v /var/docker/redis/redis.conf:/etc/redis/redis.conf -v /var/docker/redis/data:/data -d redis redis-server /etc/redis/redis.conf
  • -v是目錄對映如果在windows那這個/var應該改為如C:/等其他目錄都行
  1. 檢視是否成功執行docker ps
    在這裡插入圖片描述
  2. 連線redis
  • 下載安裝管理工具AnotherRedisDesktopManager
  • username沒有設定可以放空
    在這裡插入圖片描述

各專案的釋出及執行

舊的NET Framework專案

由於比較舊的非netcore專案沒有辦法直接支援docker釋出需要依賴mono,這邊直接採用比較方便的jexus來部署以下是部署過程的一些記錄:

  1. 在本地建立一個資料夾專門用於這些已經發布好的舊專案把Windows伺服器上的已釋出專案複製下來如下圖所示:
    在這裡插入圖片描述

  2. 在此目錄下建立分別建立dockerfile和default內容如下:
    default

######################
# Web Site: Default 
########################################

port=80
root=/ /var/website/default
hosts=*    #OR your.com,*.your.com


# addr=0.0.0.0
# CheckQuery=false
NoLog=true
# AppHost={CmdLine=/usr/local/x/xx;AppRoot=/usr/local/x;Port=5000}
# NoFile=/index.aspx
# Keep_Alive=false
# UseGZIP=false

# UseHttps=true
# ssl.certificate=/var/mallapi.chunqiulihe.com/1_mallapi.chunqiulihe.com_bundle.crt  #or pem
# ssl.certificatekey=/var/mallapi.chunqiulihe.com/2_mallapi.chunqiulihe.com.key
# ssl.protocol=TLSv1.0,TLSv1.1,TLSv1.2  # TLSv1.1 or  TLSv1.2...
# ssl.ciphers= 

# DenyFrom=192.168.0.233, 192.168.1.*, 192.168.2.0/24
# AllowFrom=192.168.*.*
# DenyDirs=~/cgi, ~/upfiles
# indexes=myindex.aspx
# rewrite=^/.+?\.(asp|php|cgi|pl|sh)$ /index.aspx
# reproxy=/bbs/ http://192.168.1.112/bbs/
# host.Redirect=abc.com www.abc.com  301
# ResponseHandler.Add=myKey:myValue


# Jexus php fastcgi address is '/var/run/jexus/phpsvr'
#######################################################
# fastcgi.add=php|socket:/var/run/jexus/phpsvr

# php-fpm listen address is '127.0.0.1:9000'
############################################
# fastcgi.add=php|tcp:127.0.0.1:9000

dockerfile

FROM ubuntu:latest
LABEL "name"="支付系統管理端" 
LABEL "version"="1.0.0"
LABEL "describe"="初始化部署"

#安裝更新必要的庫
RUN apt-get update; apt-get -y upgrade; apt-get -y install wget curl vim libicu-dev
#設定時區
RUN apt-get install -y tzdata
RUN ln -fs /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && dpkg-reconfigure --frontend noninteractive tzdata
# 安裝字符集
RUN apt-get install -y language-pack-zh-hans;
# 新增中文支援
# zh_CN.UTF-8 等於 zh_CN.utf8
RUN locale-gen zh_CN.UTF-8;
ENV LANG zh_CN.UTF-8
ENV LC_ALL zh_CN.UTF-8
#安裝jexus
RUN wget --no-check-certificate https://linuxdot.net/down/jexus-6.4.x-x64.tar.gz
RUN tar -zxvf jexus-6.4.x-x64.tar.gz
RUN mv -f jexus /usr/
RUN cd /usr/jexus
RUN chmod +x /usr/jexus/jws

RUN apt-get -y autoremove; apt-get -y autoclean; apt-get -y clean

COPY . /var/website/default
COPY default /usr/jexus/siteconf
#開放埠
EXPOSE 80 443
WORKDIR /usr/jexus
ENTRYPOINT ["/usr/jexus/jws", "start", "-D"]
  1. 打包docker映象,映象打標籤,映象推送到私有倉庫,此處不懂可以看前面的文章
    docker build -t zetapay-cms:1.0.0 .
    docker tag zetapay-cms:1.0.0 47.01.01.100:8080/zaoxu/zetapay-cms:1.0.0
    docker push 47.01.01.100:8080/zaoxu/zetapay-cms:1.0.0
  2. 在伺服器建立docker映象執行指令碼內容如下:
version: '3'
services:
  zetapay-cms: #服務名稱
    container_name: zetapay-cms
    image: 47.01.01.100:8080/zaoxu/zetapay-cms:${IMAGE_VERSION}
    ports:
      - "2401:80" #埠號2401是對映後主機的埠號nginx配置的時候使用這個
    environment:
      - ENV=production
    volumes: #這邊是目錄對映主機目錄在前:容器目錄在後,根據自己實際專案需要對映的目錄去增減
      - /var/website/activity/cms/view:/var/website/default/view
      - /var/website/activity/cms/attachments:/var/website/default/attachments
      - /var/website/activity/cms/Models:/var/website/default/Models
      - /var/website/activity/cms/log:/var/website/default/log
    restart: unless-stopped #除非使用者手動停止容器,否則始終重啟

  1. 到伺服器放指令碼的目錄下執行指令碼 ./update_docker_compose3.0.sh docker-compose-zetapay-cms.yml 1.0.0
  2. 配置nginx,切換到目錄cd /etc/nginx/conf.d,建立檔案vim test-cms.conf,這裡最好是每個專案一個配置檔案不要混在一起比較方便管理。
    test-cms.conf的內容如下:
server {
   server_name  test.cms.aaa.com.cn;
   #charset koi8-r;

   #access_log  logs/host.access.log  main;
   client_max_body_size    128m;  

   location / {
   	# 這裡的埠號2401就是上面執行映象對映到主機對應的埠號
       proxy_pass http://127.0.0.1:2401;
       proxy_redirect off;
       proxy_set_header Host $host;   
       proxy_set_header X-Real-IP $remote_addr;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
       client_max_body_size 10m; 
       client_body_buffer_size 128k; 
       proxy_connect_timeout 90;
       proxy_read_timeout 90;
       proxy_buffer_size 4k;
       proxy_buffers 6 32k;
       proxy_busy_buffers_size 64k;
       proxy_temp_file_write_size 64k;
   }
   error_page  404              /404.html;
   location = /404.html {
       return 404;
   }

   # redirect server error pages to the static page /50x.html
   #
   error_page   500 502 503 504  /50x.html;
   location = /50x.html {
       return 503;
   }
}
  1. 重啟nginx nginx -s reload

netcore專案-有原始碼

  1. 在用vs在執行專案新增docker支援,右鍵專案》新增》docker支援,容器os為liunx,容器生成型別為dockerfile,發行版本預設就行。

  2. 右鍵專案》釋出》新建配置檔案》docker容器登錄檔》》其他docker容器登錄檔(這裡是本地倉所以選擇這個,如果是其他的按照實際情況選擇)》輸入私有倉庫地址、使用者名稱、密碼》docker desktop
    在這裡插入圖片描述
    在這裡插入圖片描述

  3. 點發布之前先修改一下映象版本號,然後直接點發布
    在這裡插入圖片描述

  4. 釋出成功之後可以在docker映象列表中看到如下圖
    在這裡插入圖片描述

  5. 以上已經完成映象打包上傳到了私有倉庫,接下來就是要在伺服器做釋出操作,按照上面的舊的NET Framework專案遷移的第4-7的步驟。

netcore專案-無原始碼

  1. 在專案目錄下建立一個dockerfile內容如下:
FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base

LABEL "name"="商城API" 
LABEL "version"="1.0.0"
LABEL "describe"="首次初始化"

WORKDIR /app
EXPOSE 80

FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /src
COPY . .
ENV ASPNETCORE_URLS=http://+:80
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
ENTRYPOINT ["dotnet", "Shop.Web.Entry.dll"]
  1. 用命令視窗開啟到目錄下,執行build打包,tag給標籤,push上傳到私有倉庫
  2. 到伺服器部署按照舊的NET Framework專案遷移第4-7步驟執行

java專案

這裡對java的idea工具還不是很熟悉,所以沒有采用像vs那樣直接新增docker支援的方式;使用先打包成jar的方式然後dockerfile映象方式

  1. 打包成jar,idea最右邊點開maven》package等待執行完之後會在target資料夾下生成一個jar檔案
    在這裡插入圖片描述
  2. 這邊我們可以把.jar檔案複製到自己新建立的目錄下,在這個目錄下還可以放專案裡需要讀取的檔案如秘鑰pem或者引用的其他dll檔案,如下圖
    在這裡插入圖片描述
    dockerfile的內容為:
# 使用 JDK 1.8 作為基礎映象
FROM openjdk:8-jdk-alpine

# 設定時區為北京時間
RUN apk add --no-cache tzdata \
    && cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
    && echo "Asia/Shanghai" > /etc/timezone


# 建立應用目錄
WORKDIR /app

# 將打包好的 JAR 檔案複製到容器中
COPY . /app


# 暴露應用所使用的埠
EXPOSE 8080

# 啟動應用
ENTRYPOINT ["java", "-jar", "/app/ca.test.jar"]
  1. 參照上面其他專案的打包映象,標籤映象,上傳映象,部署完成最後的釋出。

nodejs專案

與上面相同在釋出後的目錄下建立dockerfile,然後操作步驟一樣;dockerfile的內如如下:

FROM node:lts-alpine3.17
LABEL "name"="商城服務" 
LABEL "version"="1.0.1"
LABEL "describe"=""
#設定時區
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
RUN npm i pm2 -g

COPY . /var/website/default
#暴露埠號
EXPOSE 80 443
WORKDIR /var/website/default
ENTRYPOINT ["pm2-runtime", "start", "nodeserver.js"]

靜態專案

跟釋出後的部署方式一樣,多了一個nginx的配置檔案,就是在釋出目錄建兩個檔案如下
dockerfile

FROM nginx:latest
COPY . /usr/share/nginx/html
COPY  default.conf /etc/nginx/conf.d/default.conf
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

default.conf

server {
    listen       80;
    listen  [::]:80;
    server_name  localhost;


    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
        try_files $uri $uri/ /index.html;  #解決重新整理出現404問題
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

其他部署執行參考上面的專案。

https免費證書配置

  1. 安裝snapd
    sudo apt update
    sudo apt install snapd
  2. 安裝Certbot
    sudo snap install --classic certbot
  3. 軟連線(環境變數),讓隨意目錄下都能執行certbot
    sudo ln -s /snap/bin/certbot /usr/bin/certbot
  4. 根據域名生成證書
    sudo certbot certonly --nginx -d test.cms.wyb.com.cn
  • 如果多個域名就-d 域名 -d 域名
  • 成功之後會出現存放證書的路徑大概如下
    Successfully received certificate.
    Certificate is saved at: /etc/letsencrypt/live/test.cms.wyb.com.cn/fullchain.pem
    Key is saved at: /etc/letsencrypt/live/test.cms.wyb.com.cn/privkey.pem
  1. 配置nginx使用這個證書
  • 開啟上面nginx的配置檔案在net framework部署的第6步 新增433埠的監聽並且配置證書內容如下
server {
    server_name  test.cms.wyb.com.cn;
    #charset koi8-r;

    #access_log  logs/host.access.log  main;
    client_max_body_size    128m;  

    location / {
        proxy_pass http://127.0.0.1:2410;
        proxy_redirect off;
        proxy_set_header Host $host;   
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        client_max_body_size 10m; 
        client_body_buffer_size 128k; 
        proxy_connect_timeout 90;
        proxy_read_timeout 90;
        proxy_buffer_size 4k;
        proxy_buffers 6 32k;
        proxy_busy_buffers_size 64k;
        proxy_temp_file_write_size 64k;
    }
    error_page  404              /404.html;
    location = /404.html {
        return 404;
    }

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        return 503;
    }
}
server {
		listen 443 ssl; 
		server_name test.cms.wyb.com.cn;
    ssl_certificate /etc/letsencrypt/live/test.cms.wyb.com.cn/fullchain.pem; # Certbot生成的證書
    ssl_certificate_key /etc/letsencrypt/live/test.cms.wyb.com.cn/privkey.pem; # Certbot生成的證書      
		ssl_session_timeout 5m;
		ssl_protocols TLSv1 TLSv1.1 TLSv1.2; 
		ssl_ciphers AESGCM:ALL:!DH:!EXPORT:!RC4:+HIGH:!MEDIUM:!LOW:!aNULL:!eNULL;
		ssl_prefer_server_ciphers   on;
		client_max_body_size    128m;  
		 location / {
        proxy_pass http://127.0.0.1:2410;
        proxy_redirect off;
        proxy_set_header Host $host;   
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        client_max_body_size 10m; 
        client_body_buffer_size 128k; 
        proxy_connect_timeout 90;
        proxy_read_timeout 90;
        proxy_buffer_size 4k;
        proxy_buffers 6 32k;
        proxy_busy_buffers_size 64k;
        proxy_temp_file_write_size 64k;
    }

    error_page  404              /404.html;
    location = /404.html {
        return 404;
    }

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        return 503;
    }
}
  1. 重啟nginxnginx -s reload,然後就可以訪問https了。
  2. 設定證書到期自動更新(以下二選一即可)
    7.1 第一種方式使用Cron
    開啟檔案crontab -e,如果是第一次開啟會讓你選擇編輯器這邊熟悉vim所以選擇vim.basic
    新增自動續簽任務0 3 * * * certbot renew --quiet && systemctl reload nginx;儲存並退出編輯之後cron會自動載入
  • 含義:

    • 0 3 * * *: 每天凌晨 3 點執行一次。
    • certbot renew --quiet: 檢查是否需要續訂證書並自動續訂。
    • && systemctl reload nginx: 在續訂成功後,重新載入 Nginx 配置以應用新證書。

    7.2 第二種方式使用certbot.timer定時器
    建立/etc/systemd/system/certbot.timer內容如下:

[Unit]
Description=Run certbot twice daily

[Timer]
OnCalendar=*-*-* 03:00:00  # 定義觸發時間:每天的 03:00:00
Persistent=true               # 在重啟後繼續保持計時

[Install]
WantedBy=timers.target         # 定時器作為 systemd 的計時目標啟動

建立/etc/systemd/system/certbot.service內容如下:

[Unit]
Description=Certbot renewal
Documentation=https://eff-certbot.readthedocs.io/en/stable/

[Service]
Type=oneshot            # 服務執行一次就退出
ExecStart=/usr/bin/certbot renew --quiet --renew-hook "systemctl reload nginx" # 具體執行 Certbot 的續簽命令重啟nginx

建立定時器和服務之後執行下面命令啟動定時器

sudo systemctl daemon-reload
sudo systemctl enable certbot.timer
sudo systemctl start certbot.timer

驗證是否成功啟動systemctl list-timers | grep certbot

最後

如果上面的步驟忘了設定容器的重啟策略可以執行以下命令一次性全部設定
docker ps -q | xargs -n 1 docker update --restart=unless-stopped

  • 常用的 --restart策略:
    no:預設值。容器不會在重啟後自動啟動。
    always:無論容器的退出狀態如何,都會在伺服器重啟後自動啟動容器。
    unless-stopped:與 always 類似,但手動停止的容器不會自動重啟。
    on-failure[
    ]:僅在容器因錯誤退出時自動重啟,可以設定最大重啟次數。

相關文章