在完成前端網頁開發後,一個完整的網站專案通常還包含後端程式碼、資料庫檔案,以及各種環境設定檔案。若要將這些檔案移轉到其他電腦或伺服器進行測試,可能會因作業系統、軟體版本或系統環境不同,而造成相容性問題與部署困難。
Docker則是為了解決跨平台部署與環境一致性問題而誕生的應用程式。Docker採用容器(container)的技術,將前端、後端、資料庫以及所需的環境與設定,一併打包到容器中,讓專案能在不同環境中快速、穩定地運行,提升可攜性與部署效率。
在啟動Docker容器前,可以利用事先撰寫的Dockerfile來定義專案的建置流程與依賴環境,確保在任何地方部署時都能保持一致,進一步提升專案的可攜性與展示的便利性,相關Dockerfile的內容撰寫,參考如下:
# docker-compose.yml
version: '3.0'
services:
# MSSQL資料庫服務
database:
image: mcr.microsoft.com/mssql/server:2019-latest
container_name: database
user: root
ports:
- "1433:1433" # 由主機(左)1433,連到容器(右)1433
volumes:
- ./database/mssql_data:/var/opt/mssql/data # 永久儲存資料庫檔案
- ./database/mssql_backup:/backup # 儲存備份檔
env_file:
- ./server/envs/dev.env # 匯入環境變數及位置
networks:
- global-net
# 後端服務
backend:
build:
context: ./server # 建立映像檔的位置
dockerfile: server.Dockerfile # 使用server.Dockerfile作為建置檔
command: python manage.py runserver 0.0.0.0:8000
volumes:
- ./server:/usr/src/app/
ports:
- "8002:8000" # 外部訪問網址(localhost:8002),於容器中被訪問的網址(localhost:8000)
env_file: './server/envs/dev.env' # 匯入環境變數及位置
restart: "always"
networks:
- global-net
# 前端服務
frontend:
build:
context: ./client # 建立映像檔的位置
dockerfile: client.Dockerfile # 使用client.Dockerfile作為建置檔
ports:
- "8080:8080" # 外部訪問網址(localhost:8080),於容器中被訪問的網址(localhost:8080)
stdin_open: true
tty: true
networks:
- global-net
# 使用共用網路,以讓各容器互通
networks:
global-net:
driver: bridge
(左邊):(右邊)
的配對,代表的是本機(左邊)的資料夾檔案,放置於容器(右邊)的資料夾位置。環境變數的設定檔案server/envs/dev.env
,可於外部資料夾另外放置,避免機敏性的資料寫於Dockerfile,並因Dockerfile移轉而造成的資料外洩風險,參考如下:
# SQL Server啟動時,讀取
SA_PASSWORD=sa管理員帳號密碼
ACCEPT_EULA=Y
# Django啟動時,讀取開發用環境變數
SECRET_KEY=Django後端密碼
DEBUG=True
# Django啟動時,讀取資料庫設定
DB_NAME=資料庫名稱
DB_USER=資料庫帳號
MSSQL_SA_PASSWORD=資料庫密碼
DB_HOST=資料庫網址,連接埠
要啟動Docker之前,需先安裝Docker Desktop應用程式,且啟動時需開啟所安裝的Docker Desktop應用程式軟體。
將Dockerfile,即docker-compose.yml
放置於專案根目錄,並輸入啟動指令。
docker-compose up --build -d
--build
,代表啟動前先重新建置(build)映像檔-d
,代表背景執行成功啟動後,可以查看所啟動的容器狀態,檢查各服務有沒有順利運行中。
docker-compose ps
啟動容器後,即可訪問容器所提供的本機網址,以查看網站有無正常顯示,及API請求有無順利完成。
若要停止容器,可區分是否移除容器、網路,而有不同指令,但皆會保留映像檔與資料(volumes),參考如下。
# 移除容器、刪除網路,但保留映像檔與資料(volumes)
docker-compose down
# 保留容器、保留網路,並保留映像檔與資料(volumes)
docker-compose stop