我使用的 windows,前端使用 React 框架,后端使用 Flask 框架。
安裝
官網(wǎng)下載網(wǎng)址,下載 Docker Desktop。
部署 Flask 項目
在 app.py 同級目錄下創(chuàng)建 Dockfile 文件。
FROM python:3.9 as build
WORKDIR /app
COPY . .
RUN pip3 install -r requirements.txt
EXPOSE 5000
CMD [ "python3","app.py" ]
第一行用 FROM 命令制定一個基礎(chǔ)鏡像,省去很多軟件安裝配置。
WORKDIR 指定之后所有 Docker 命令的工作路徑,如果路徑不存在,Docker 會自動幫你創(chuàng)建。
COPY 將所有的程序拷貝到 Docker 鏡像中。COPY <本地路徑> <目標(biāo)路徑>,. 代表程序根目錄下的所有文件;第二個參數(shù)代表 Docker 鏡像中的路徑,這里的 . 代表當(dāng)前的工作路徑,也就是之前指定的 app 目錄。
RUN 允許我們在創(chuàng)建鏡像時運行任意的 shell 命令。
EXPOSE 設(shè)置容器對外暴露的端口號為 5000。
使用 CMD 指定當(dāng) Docker 容器運行起來以后要執(zhí)行的命令。
RUN 是創(chuàng)建鏡像的時候使用的,而 CMD 是運行容器的時候使用的。
接下來在項目終端,使用 docker build 創(chuàng)建一個鏡像。
docker build -t flask-backend .
-t:tag/標(biāo)簽 指定鏡像的名字
. 告訴 docker 應(yīng)該在當(dāng)前目錄下尋找這個 Dockerfile。
第一次調(diào)用 docker build 會比較慢,因為 Docker 會下載必要的鏡像文件,然后一行行運行指令,但是之后就會比較快,因為 Docker 會緩存之前的每個操作。
docker run -p 5000:5000 -d flask-backend
-p 會將容器上的某個端口映射到本地主機(jī)上,前面是主機(jī)端口,后面是容器端口號
-d 讓容器在后臺運行,這樣容器的輸出不會直接顯示在控制臺

刪除 Docker 容器,會連帶著將其中的數(shù)據(jù)也一并刪除。如果想保留數(shù)據(jù),可以使用 Docker 提供的 volume 數(shù)據(jù)卷。可以把它當(dāng)做一個在本地主機(jī)和不同容器中共享的文件夾。
// 創(chuàng)建數(shù)據(jù)卷
docker volume create 數(shù)據(jù)卷名
// 啟動 docker 并把數(shù)據(jù)掛在到指定路徑下
docker run -dp 5000:5000 -v 數(shù)據(jù)卷名:/etc/finance flask-backend
將數(shù)據(jù)卷名掛載到了 /etc/finance 路徑下,向這個路徑寫入的任何數(shù)據(jù)都會被永久地保存在這個數(shù)據(jù)卷中。
前端 Dockerfile 內(nèi)容
# 基于Node
FROM node:14 as build
WORKDIR /app
COPY . .
RUN npm install
RUN npm run build
# 基于nginx
FROM nginx:latest
EXPOSE 80
COPY --from=build /app/build /usr/share/nginx/html
COPY nginx.conf /etc/nginx/conf.d/default.conf
在項目總文件夾下創(chuàng)建 docker.yml 文件
version: "3.8"
services:
frontend:
image: frontend
ports:
- "80:80"
backend:
image: flask-backend
ports:
- "5000:5000"
volumes:
- ./flaskBackend/static:/static
在終端運行 docker compose up 就能把兩個服務(wù)都起來。
簡化版命令合集
就是這幾個文件都放好位置,在終端運行,先創(chuàng)建前后端的鏡像,然后直接使用 docker.yml 一并運行起來。
// 前端項目目錄下
docker build -t frontend .
// 后端項目目錄下
docker build -t flask-backend .
// 總目錄下
docker compose up
最終在網(wǎng)頁中輸入 http//localhost:80/ 就能看到前端頁面了。
如果修改了本地的文件,我目前使用的方法是重新在該項目下 build 一個新的項目,然后修改 docker.yml 中指定的鏡像名,直接在終端 docker compose up。