這一章,我們將介紹如何使用 docker-compose
來同步啟動 odoo 和 PostgreSQL。需要注意的是,這次的 docker-compose.yml
設計主要是用來測試我們的 Dockerfile,並不是真正用於生產環境的部署。實際用於部署的 docker-compose
將會放在 WebApp-Deployment
並且帶有更多安全策略(也代表更麻煩),這裡則是在 odooBundle-Codebase
中進行測試 Dockerfile 或是 module 用的。
本章相關內容可參考 odoo 官方的 Docker 文件: GitHub/docker-library/docs/odoo
PostgreSQL 的環境變數說明也可以參考: Docker/Postgres
手動的方式雖然能夠啟動 Odoo 和 PostgreSQL,但每次都需要手動分開執行,不太方便。接下來,我們將介紹如何使用 docker-compose
來簡化這個流程,讓我們一次啟動 odoo 和 PostgreSQL。
docker-compose.yml
文件services:
postgresql:
image: postgres:16.4 # 使用官方的 PostgreSQL 16.4 Image
restart: always # 如果容器崩潰,自動重啟
networks:
- odoo-net # 使用自訂的 odoo-net 網路進行通訊
environment:
- POSTGRES_DB=postgres # 設定資料庫名稱為 postgres
- POSTGRES_USER=odoo_user # 設定 PostgreSQL 使用者
- POSTGRES_PASSWORD=JXPF9aDZeZWlrDpf # 設定資料庫密碼
volumes:
- db-data:/var/lib/postgresql/data # 將資料庫數據持久化存放在 db-data volume 中
odoo:
build: . # 使用當前目錄下的 Dockerfile 來構建 odoo
restart: always # 如果 odoo 容器崩潰,自動重啟
depends_on:
- postgresql # 確保 PostgreSQL 容器已啟動,才啟動 odoo
networks:
- odoo-net # 使用自訂的 odoo-net 網路進行通訊
ports:
- "8069:8069" # 將 odoo 的 HTTP 服務端口映射到主機的 8069 端口,讓我們可以訪問 odoo 的網頁界面
- "8071:8071" # XML-RPC over HTTPS,後續會再介紹的埠口
- "8072:8072" # long-polling,後續會再介紹的埠口
environment: # 為什麼會是這些變數名稱呢?還記得我們上一篇介紹的 entrypoint.sh 嗎?
- HOST=postgresql # 設定 odoo 連接的資料庫主機名稱
- USER=odoo_user # 設定 odoo 連接資料庫的使用者名稱
- PASSWORD=JXPF9aDZeZWlrDpf # 設定 odoo 連接資料庫的密碼
volumes:
- odoo-data:/var/lib/odoo # 將 odoo 的資料(如檔案儲存、sessions 等)持久化存放
在 odoo-data volume 中
networks:
odoo-net:
driver: bridge # 使用橋接網路,讓 odoo 和 PostgreSQL 容器能互相通訊
volumes:
db-data: # 持久化存放 PostgreSQL 資料
odoo-data: # 持久化存放 odoo 的檔案和 sessions 數據
docker-compose.yml
確保 Docker 和 Docker Compose 已安裝:
docker --version
和 docker-compose --version
來檢查是否已安裝。放置 docker-compose.yml
文件:
docker-compose.yml
的文件,將上述內容複製進去。構建並啟動容器:
在終端中,進入你存放 docker-compose.yml
的目錄,執行以下指令來構建並啟動 odoo 和 PostgreSQL 容器:
docker-compose up --build
這條指令會自動構建 odoo 的 Docker Image 並啟動 PostgreSQL 和 Odoo 容器,--build
確保每次都重新構建。
訪問 Odoo:
http://localhost:8069
訪問 odoo 的網頁界面。停止容器:
要停止容器,執行以下指令:
docker-compose down
這會停止並刪除所有相關的容器,但資料會保留在定義的 volumes
中。
順帶提下,我自己目前用的環境是在 Windows 裝 WSL 的 ubuntu 和 Docker Desktop,從 ubuntu 下 Docker command 會自動透過 API 帶到 Docker Desktop,就會顯示出下圖這樣的 docker-compose 包住 container 的樣子,相當直覺(應該也可以只使用 Docker Desktop)。
因為我的設定應該都是有 Docker 安裝就可跨平台的,目前就沒打算特別提我自己的環境怎麼處理的,若是大家有興趣可以留言,考慮塞一篇進來。
這樣設定後,我們只需要一條指令就能同步啟動 odoo 和 PostgreSQL,資料庫的介面也不會曝露在網路上(會包在 odoo-net 中),增加了一點點安全性。
關於 Dockerfile 基礎的設定到這邊告一段落,未來還會有 Dockerfile 相關的改動,但接下來我們先來思考該怎麼做真正佈署用的 docker-compose。