在網站開發到一定程度,準備正式部署網站時,環境設定通常會與開發階段不同。因此會建議區分開發環境及正式環境,並各有自己的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
開發環境與正式環境的詳細差異點,需要進一步查看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;"]
npm run build
。在啟動容器時,因為有區分不同檔名,部署的指令有所不同,且正式環境下,可採用重新部署的指令,以確保環境是乾淨的,且不會殘留舊的容器、資料、網路或快取資料,參考如下:
# 停止並清理容器
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的快取,強制從零開始建置,以確保用到的是最新版本的套件與程式碼。