我計劃將 docker-compose 遷移到 docker-swarm 以實現多節點。
我已經docker-compose
像下面這樣使用了
version: '3'
services:
python:
container_name: python
build: ./python
command: uwsgi --socket :8001 --module myapp.wsgi --py-autoreload 1 --logto /tmp/mylog.log
volumes:
- ./src:/code
- ./src/static:/static
ports:
- "8082:8082"
expose:
- "8001"
nginx:
image: nginx:1.13
container_name: nginx
ports:
- "8000:8000"
volumes:
- ./nginx/conf:/etc/nginx/conf.d
- ./nginx/uwsgi_params:/etc/nginx/uwsgi_params
- ./static:/static
depends_on:
- python
它適用於 django 主機。
那麼現在我正在嘗試使用docker-swarm
.
docker-compose
看起來docker-swarm
很像,但有一個問題。
我像這樣安裝了本機驅動器
- ./src:/code
- ./src/static:/static
or here
- ./nginx/conf:/etc/nginx/conf.d
- ./nginx/uwsgi_params:/etc/nginx/uwsgi_params
- ./static:/static
然而,在 中docker-swarm
,volumes
這樣是行不通的,服務永遠不會啟動。
(我明白了......這是可以理解的,因為可能有很多節點......)
我想我應該做一些改變。
我用谷歌搜尋了一下,發現有一些這樣的設定。
services:
python:
volumes:
- src:/code
volumes:
src:
driver: local
不過我不明白如何使用這個...
我應該把我的原始碼或一些設定檔放在哪裡?
docker-swarm 常用檔案的最佳實務是什麼?
答案1
如果您要在叢集模式下跨多個節點部署映像,則原始程式碼應位於映像內部,並且該映像應推送至註冊表。將原始程式碼掛載為磁碟區是一種加快開發過程的方法,但正在測試的映像應使用COPY
Dockerfile 中的命令中包含的原始程式碼構建,以便無需掛載磁碟區即可使用。
因此,對撰寫文件的更改是添加指向您自己的存儲庫的圖像名稱,最好帶有版本化標籤。然後每個映像都會有一個 Dockerfile,並在部署堆疊之前建置並推送到註冊表。
請注意,container_name、depends_on 和 build 在 Swarm 模式下無效。您需要刪除對硬編碼容器名稱的任何相依性(使用基於 DNS 的發現的服務名稱)。理想情況下,應用程式應該透過某種指數回退測試連接性來處理依賴關係,直到達到最大限制,或者透過將wait-for-it.sh
腳本之類的內容添加到入口點來驗證依賴關係在啟動應用程式之前是否可用。建置通常從撰寫檔案移出並移至 CI/CD 系統中。然後,撰寫檔案從 CI/CD 工具接收目前標籤名稱作為變數。
對於持久性數據,您可以使用卷,但如果您希望容器在節點之間遷移時資料保持持久性,則該卷應該位於 NFS 等網路檔案系統上,而不是預設的本機檔案系統上。這方面的一個例子是我的回答在這裡。
為了在 swarm 叢集中的容器之間共享數據,理想情況下是透過網路 API(例如所有基於 REST 的微服務)來完成的。您也可以將其外部化到在 swarm 外部運行或為容器環境設計的資料庫(CNCF 有一些)。您可以使用相同的 NFS 解決方案和磁碟區安裝來執行此操作,但請意識到您可能正在處理檔案鎖定和更高的延遲。