使用Docker進行分散式部署(概念篇)
使用Docker進行分散式部署(概念篇)
到現在(2017年)docker的部署 方式有了很大的改變, 常見的教材已經嚴重過時,推薦多看看官方文檔, 這篇文章,是對官方文檔的呢歐蓉 的一個總結.
主要變化
在docker 17++ 版本, docker三劍客中 docker-compose 變成了 docker 的 stack,service 命令, docker-swarm 變成了 docker的 swarm, service命令 , 他們和docker合二為一,集群的部署大大簡化.
除此之外 docker 單獨有了管理容器的container 命令 管理網路的networks命令 和 管理 數據卷的 volumes 命令
docker集群的基本概念
- Image: docker的基本概念, 用於描述一個容器
- Container: 一個容器
- Node: 一個分散式系統中的節點,一般為一台電腦或者一個虛擬機. 有manger 和 slave操作, docker 的swarm,node,stack,service命令只能運行 在 manger node 上
- Services: 一項服務, 由多個容器在 swarm 的調度下 進行處理, 一項服務包含多個相同image 構成的container
- Stack: 一系列service構成一個stack
- docker-machine: 每個machine是一個虛擬機
根據以上概念,我們可推出docker容器集群的開發流程, 先編寫dockerfile文件, 定義好一個一個的鏡像, 然後使用docker-compose 文件編排這些鏡像成services,在一個manger的node上 用stack部署這些services. docker-swarm會自動對服務的容器 編排.
簡單的例子
比如我有一個app 使用了 nsq 消息隊列, 編寫以下文件
docker-compose.yml
networks:n webnet:nn app:n image: golangn command: ping pgmastern networks:n - webnetnn nsqlookupdAnchor:n image: nsqio/nsqn ports:n - 4160:4160n - 4161:4161n command: /nsqlookupdn networks:n webnet:n aliases:n - loopkupnn nsqd:n image: nsqio/nsqn ports:n - 4150:4150n - 4151:4151n depends_on:n - nsqlookupdAnchorn command: /nsqd --broadcast-address=loopkup --lookupd-tcp-address=loopkup:4160n networks:n - webnetnn nsqadmin:n image: nsqio/nsqn command: /nsqadmin --lookupd-http-address=loopkup:4161n depends_on:n - nsqlookupdAnchorn ports:n - 4171:4171n networks:n - webnetn
值得注意的是,compose-file 在使用docker-swarm的時候, 和普通的compose-file不一樣. 比如link命令就被 廢除了.詳情參考官方文檔
這個文件定義了一張網卡,所有的services通過這張網卡給的別名交流.
運行
docker stack deploy -c docker-compose.yml appn
一個名為app的stack就部署成功了,裡面有app和nsq的services.
運行
docker container lsn
查看當前node上的容器,
docker container logs [id]n
查看當前容器的log
docker service scale [service_id]=3n
進行擴容
docker stack rm appn
刪除app stack
這些命令多使用 --help 查看, 可以了解更多使用方法參考資料
[1]. 官方文檔 : https://docs.docker.com/get-started/
推薦閱讀:
※google的material-ui為什麼沒有柵格系統?
※看某前端設計書上說,在 base.css 里先定義一些基礎樣式然後在 html 裡面加上相應的 class,這樣是否和語義化相矛盾?
※如何看待從Django 2.0開始不再提供對Python2的支持?
※樹莓派做web伺服器的話,性能怎麼樣?