Table
ㄧ. 首先安裝 Docker 教學
▍Mac 的朋友
Docker 官網下載 Docker Desktop on Mac
▍Windows 的朋友
Docker 官網下載 Docker Desktop on Windows
▍Linux 的朋友
Linux 安裝 Docker 指令
1 2 3 |
$ sudo apt-get install -y curl $ curl -s https://get.docker.com | sudo sh |
Linux 安裝 Docker Compose 指令
1 2 3 |
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
完整的資料夾結構如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
template ├── docker-compose.yml ├── flask │ ├── Dockerfile │ ├── app │ ├── app.ini │ ├── main.py │ ├── requirements.txt │ └── venv └── nginx ├── Dockerfile ├── nginx.conf ├── ssl.csr └── ssl.key |
其中這部分如同之前有介紹過的 Dockerfile + Flask 結構
1 2 3 4 5 6 7 |
├── flask ├── Dockerfile ├── app ├── app.ini ├── main.py ├── requirements.txt └── venv |
而這部份如同之前有介紹的 Dockerfile + Nginx 結構
1 2 3 4 5 |
└── nginx ├── Dockerfile ├── nginx.conf ├── ssl.csr └── ssl.key |
最後再加上 docker-compose.yml
1 2 |
template ├── docker-compose.yml |
四. 啟動 Project
1.首先 Git Clone flask-template GitHub
2.輸入啟動指令
1 |
$ 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
此次完整範例如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
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
1 |
version: "3.7" |
▍build
取得 DockerFile 的位置
1 2 |
flask: build: ./flask |
像是以下範例代表,必須先啟動 db 後,才會運行 Flask 的部分
1 2 3 4 5 6 7 8 9 10 |
flask: build: ./flask container_name: template_flask # restart: always environment: - APP_NAME=FlaskApp expose: - 8080 depends_on: - db |
眼尖的朋友們一定有留意到,Flask 使用的是 expose,而 Nginx 使用的是 ports,這兩個到底有什麼差別呢?
當使用 expose 時,只有暴露給其他 container 可以使用,而從外部主機連線時是無法連線的。所以 Nginx 使用的是 ports 方法,可以讓外部主機從 80 或 443 port 連線。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
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" |
從本地資料夾掛載進 container 的資料,這樣可以直接在本地端專案資料夾改動檔案,container 裡面的檔案也會更動也不用重新 build image!
1 2 3 4 5 6 7 8 9 |
volumes: # 使用絕對路徑 - /opt/cache:/tmp/cache # 以 Compose 配置文件為中心的相對路徑 - ./cache:/tmp/cache # ~/ 表示的是目錄 - ~/cache://tmp/cache |
最後~
此篇的完整程式碼放置於 ,歡迎 git clone 使用。 flask-template GitHub
▍回顧本篇的 Flask 實作 docker-compose 教學容:
- 安裝 Docker 教學
- 進入 Flask 實作 docker-compose 教學
- 了解專案資料夾結構
- 啟動 Project
- 解析 docker-compose.yml
更多 Flask 教學相關閱讀:
▍關於 Flask教學系列目錄:
▍關於 Flask 使用 Docker 相關文章:
- 第一集:實作 Dockerfile + flask 教學 (附GitHub完整程式)
- 第二集:實作 Dockerfile + nginx + ssl + flask 教學 (附GitHub完整程式)
- 第三集:實作 Docker-compose (Flask+Nginx+PostgreSQL)
▍其他 Flask 相關教學:
- 【Flask教學系列】Flask 為甚麼需要 WSGI 與 Nginx
- 【Flask教學系列】Flask-SQLAlchemy 資料庫連線&設定入門 (一)
- 【Flask教學系列】Flask-JWT-Extended 實作
- 【Flask教學系列】實作 Flask CORS
- 【Flask教學系列】實作 Flask CSRF Protection
有關 Max行銷誌的最新文章,都會發佈在 Max 的 Facebook 粉絲專頁,如果想看最新更新,還請您按讚或是追蹤唷!
在〈Flask 實作 Docker-compose (Flask+Nginx+PostgreSQL)〉中有 3 則留言
Hi Max,
感謝本篇的教學,有一個問題想請問一下。如果想要使用Flask-Migration,讓docker-compose up啟動的時候,能夠按照models去建立db table,請問要怎麼做呢?Flask-Migration有提到flask db init的指令,但目前沒有找到如何整合Dockerfile, uWSGI, Flask-Migration的教學。
Hi Jordon,
可以參考在 pycon 的這份 dockerfile,裡面有 `migrate ` 的部分
https://github.com/pycontw/pycon.tw/blob/master/docker-com pose.yml
Hi Max,
https://github.com/pycontw/pycon.tw/blob/master/docker-compose.yml
這個連結中的yaml檔案使用的是Django。我看了一下,覺得Django和Flask-Migration的migrate用法好像不太一樣。
留言功能已關閉。