04 Python Flask 教學10 所有文章

Flask 實作 Docker-compose (Flask+Nginx+PostgreSQL)

flask_docker_compose_Max行銷誌

ㄧ. 首先安裝 Docker 教學

▍Mac 的朋友

Docker 官網下載 Docker Desktop on Mac

▍Windows 的朋友

Docker 官網下載 Docker Desktop on Windows

▍Linux 的朋友

Linux 安裝 Docker 指令

$ sudo apt-get install -y curl

$ curl -s https://get.docker.com | sudo sh 

Linux 安裝 Docker Compose 指令

sudo curl -L "https://github.com/docker/compose/releases/download/1.26.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

sudo chmod +x /usr/local/bin/docker-compose

以上安裝 docker 指令參考於 Docker 官網 install 頁

二. 進入 Flask 實作 docker-compose 教學

在前面兩篇我們介紹了使用 Dockerfile 來建立 Flask Server 和 Nginx,並使用指令 docker run 來運行,但會需要輸入很多次指令才能讓一個完整的 Project 啟動。所以我們今天要介紹的就是 Docker Compose 。

只需要將要設定寫在 docker-compose.yml ,就可以一次運行多個 Dockerfile,並且協調 Service 之間的相依性和調度安排,這就是 Docker Compose 的功用。

而關於 Dockerfile 的實作可以參考前面介紹的兩篇文章:
1. 實作 Dockerfile + flask 教學 (附GitHub完整程式)
2. 實作 Dockerfile + nginx + ssl + flask 教學 (附GitHub完整程式)

三. 首先了解專案資料夾結構

此次 Demo 的範例 code 都放在這邊,歡迎 git clone 使用~
flask-template GitHub

完整的資料夾結構如下:

template
├── docker-compose.yml
├── flask
│   ├── Dockerfile
│   ├── app
│   ├── app.ini
│   ├── main.py
│   ├── requirements.txt
│   └── venv
└── nginx
    ├── Dockerfile
    ├── nginx.conf
    ├── ssl.csr
    └── ssl.key

其中這部分如同之前有介紹過的 Dockerfile + Flask 結構

├── flask
   ├── Dockerfile
   ├── app
   ├── app.ini
   ├── main.py
   ├── requirements.txt
   └── venv

而這部份如同之前有介紹的 Dockerfile + Nginx 結構

└── nginx
    ├── Dockerfile
    ├── nginx.conf
    ├── ssl.csr
    └── ssl.key

最後再加上 docker-compose.yml

template
├── docker-compose.yml

四. 啟動 Project

1.首先 Git Clone flask-template GitHub

2.輸入啟動指令

$ docker-compose up 

3.運行起來後
* 進入 http://127.0.0.1/ 會返回 hello world
* 進入 http://127.0.0.1/create 會在 postgreSQL 資料庫裡建立起 person 的 Table
* 進入 http://127.0.0.1/max 會將 ‘Max’ 輸入進 postgreSQL 資料庫

4.如果都運行正常,那就恭喜你啦~可以改成用這個模板改成自己的 Flask Sever 囉!

五. 解析 docker-compose.yml

此次完整範例如下:

version: "3.7"

services:

  flask:
    build: ./flask
    container_name: template_flask
    # restart: always
    environment:
      - APP_NAME=FlaskApp
    expose:
      - 8080
    depends_on:
      - db

  db:
    image: postgres
    container_name: postgres
    volumes:
      - ./postgres-data:/var/lib/postgresql/data
    environment:
      POSTGRES_DB: db_name
      POSTGRES_USER: postgres_n
      POSTGRES_PASSWORD: postgres_p
    ports:
      - 5432:5432


  nginx:
    build: ./nginx
    container_name: template_nginx
    # restart: always
    ports:
      - "80:80"
      - "443:443"

    depends_on:
      - flask

version
這邊定義 Compose 的版本,目前 Version 3 以上是比較常見和官方較推薦使用的版本,而此次使用的是 version: “3.7”,想知道目前最新的版本資訊可以看這邊 Compose file versions and upgrading | Docker Documentation

version: "3.7"

build
取得 DockerFile 的位置

flask:
    build: ./flask

depends_on

像是以下範例代表,必須先啟動 db 後,才會運行 Flask 的部分

flask:
    build: ./flask
    container_name: template_flask
    # restart: always
    environment:
      - APP_NAME=FlaskApp
    expose:
      - 8080
    depends_on:
      - db

port vs expose

眼尖的朋友們一定有留意到,Flask 使用的是 expose,而 Nginx 使用的是 ports,這兩個到底有什麼差別呢?

當使用 expose 時,只有暴露給其他 container 可以使用,而從外部主機連線時是無法連線的。所以 Nginx 使用的是 ports 方法,可以讓外部主機從 80 或 443 port 連線。

flask:
    build: ./flask
    container_name: template_flask
    # restart: always
    environment:
      - APP_NAME=FlaskApp
    expose:
      - 8080
    depends_on:
      - db

  nginx:
    build: ./nginx
    container_name: template_nginx
    # restart: always
    ports:
      - "80:80"
      - "443:443"

volumes

從本地資料夾掛載進 container 的資料,這樣可以直接在本地端專案資料夾改動檔案,container 裡面的檔案也會更動也不用重新 build image!

volumes:
    # 使用絕對路徑
  - /opt/cache:/tmp/cache

    # 以 Compose 配置文件為中心的相對路徑
  - ./cache:/tmp/cache

    # ~/ 表示的是目錄
  - ~/cache://tmp/cache

最後~

此篇的完整程式碼放置於 ,歡迎 git clone 使用。 flask-template GitHub

▍回顧本篇的 Flask 實作 docker-compose 教學容:

  • 安裝 Docker 教學
  • 進入 Flask 實作 docker-compose 教學
    1. 了解專案資料夾結構
    2. 啟動 Project
    3. 解析 docker-compose.yml

更多 Flask 教學相關閱讀:

▍關於 Flask教學系列目錄:

▍關於 Flask 使用 Docker 相關文章:

▍其他 Flask 相關教學:

有關 Max行銷誌的最新文章,都會發佈在 Max 的 Facebook 粉絲專頁,如果想看最新更新,還請您按讚或是追蹤唷!

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *