iT邦幫忙

2025 iThome 鐵人賽

DAY 28
1

在網站開發到一定程度,準備正式部署網站時,環境設定通常會與開發階段不同。因此會建議區分開發環境及正式環境,並各有自己的docker-compose.yml檔案,參考如下:

# docker-compose.prod.yml
version: '3.0'

services:
  # MSSQL資料庫服務
  database:
    image: mcr.microsoft.com/mssql/server:2019-latest
    container_name: database
    user: root
    ports:
      - "1433:1433"
    volumes:
      - ./database/mssql_data:/var/opt/mssql/data
      - ./database/mssql_backup:/backup
    env_file: 
      - ./server/envs/prod.env           # 匯入環境變數及位置(正式部屬環境檔)
    networks:
      - global-net

  # 後端服務
  backend:
    build:
      context: ./server
      dockerfile: server.Dockerfile
    command: gunicorn apps.wsgi:application --bind 0.0.0.0:8000 --workers 4
    volumes:
      - ./server:/usr/src/app/
    ports:
      - "8000:8000"
    env_file: './server/envs/prod.env'   # 匯入環境變數及位置(正式部屬環境檔)
    restart: always
    networks:
      - global-net

  # nginx服務(直接在client目錄build)
  nginx:
    build:
      context: ./client
      dockerfile: client.prod.Dockerfile  # 使用Dokcerfile(正式部屬用)
    ports:
      - "80:80"
    volumes:
      - ./nginx/prod.conf:/etc/nginx/conf.d/default.conf
    depends_on:
      - backend
    networks:
      - global-net

# 使用共用網路,以讓各容器互通
networks:
  global-net:
    driver: bridge
  • 其中Dockerfile也有區分出開發環境與正式環境,各有自己的環境設定。並且未來針對正式環境,若想要修改設定,也可直接針對正式環境相關檔案修改,而不會影響到開發環境的設定。
  • 另外,在服務方面,正式環境採用nginx服務,直接在client目錄build,以節省資源。

開發環境與正式環境的詳細差異點,需要進一步查看client.prod.Dockerfile檔,參考如下:

# client/client.prod.Dockerfile
# 第一階段:建置Vue應用
FROM node:14 as build
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build

# 第二階段:用Nginx服務Vue app
FROM nginx:alpine
COPY --from=build /app/dist /usr/share/nginx/html
COPY ./prod.conf /etc/nginx/conf.d/default.conf
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
  • 可以明顯看到區分二階段部署,第一階段針對前端,僅部署dist靜態檔,即npm run build
  • 因此在第二階段部署時,最終的映像檔只有Nginx,及已編譯好的dist靜態檔,可達到節省資源,且較快啟動的功效。

在啟動容器時,因為有區分不同檔名,部署的指令有所不同,且正式環境下,可採用重新部署的指令,以確保環境是乾淨的,且不會殘留舊的容器、資料、網路或快取資料,參考如下:

# 停止並清理容器
docker-compose -f .\docker-compose.prod.yml down --volumes --remove-orphans

# 重新建立映像檔
docker-compose -f .\docker-compose.prod.yml build --no-cache

# 啟動服務,背景執行
docker-compose -f .\docker-compose.prod.yml up -d
  • -f .\docker-compose.prod.yml指定使用正式部署的yml檔案,而非預設的docker-compose.yml檔案。
  • -volumes ,代表於移除容器時,連同資料(volumes),如資料庫的持久化資料,也一起刪掉。
  • -remove-orphans,代表移除已不在yml檔案中定義,但還留在系統的孤兒容器。
  • --no-cache,代表不使用Docker的快取,強制從零開始建置,以確保用到的是最新版本的套件與程式碼。

上一篇
Day 27: Docker編排檔(.yml)介紹及容器啟動
下一篇
Day 29: Nginx反向代理(reverse proxy) & Ngrok對外公開網址
系列文
從零打造網頁系統:非資訊人也能完成的全端專題實作29
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言