一,docker swarm 是什麼html
Docker Swarm、Docker Machine與Docker Compose號稱Docker三劍客
Docker Swarm 和 Docker Compose 同樣,都是 Docker 官方容器編排項目,但不一樣的是,Docker Compose 是一個在單個服務器或主機上建立多個容器的工具,能夠將組成某個應該的多個docker容器編排在一塊兒,同時管理。
而 Docker Swarm 則能夠在多個服務器或主機上建立容器集羣服務,其主要做用是把若干臺Docker主機抽象爲一個總體,而且經過一個入口(docker stack)統一管理這些Docker主機上的各類Docker資源。前端
Swarm的基本架構以下圖所示,node
docker swarm init --advertise-addr 192.168.100.129
此時將本機ip「192.168.100.126」,會默認當前節點爲 Leader,執行 docker info 查看linux
經過下面命令獲取加入token,其餘節點能夠用 manager 或者 worker 的身份加入到當前集羣web
docker swarm join-token [worker|manager]
須要加入的節點無需再執行「docker swarm init」初始化,直接加入節點便可spring
出錯了,須要在管理管設置防火牆docker
firewall-cmd --permanent --add-port=2377/tcp # 容許某端口放行
而後執行防火牆從新加載tomcat
firewall-cmd --reload
再次在須要加入的節點上執行加入服務器
這裏咱們加入2個節點,執行 docker info 查看微信
在管理端執行「docker info」 查看, 顯示工3個節點
脫離集羣
docker swarm leave
結果以下:
三,docker-stack.yml文件編排
Docker stack 也是一個yaml文件,和一份docker-compose.yml文件差很少,指令也基本一致。可是與compose相比其不支持build、links和network_mode。Docker stack有一個新的指令deploy。
注:stack不支持的指令
Deploy是用來指定swarm服務部署和運行時的相關配置,而且只有使用docker stack deploy 部署swarm集羣時纔會生效。若是使用docker-compose up 或者docker-compose run時,該選項會被忽略。要使用deploy選項,compose-file中version版本要在3或3+。
下面經過一個demo說明 deploy關鍵選項version: "3.4"
version: "3.4" services: demo-docker: image: ejiyuan/demo-docker ports: - 8081:8081 environment: - DF_NOTIFY_CREATE_SERVICE_URL=http://proxy:8080/v1/docker-flow-proxy/reconfigure deploy: mode: replicated replicas: 2 endpoint_mode: vip labels: com.example.description: "This label will appear on the web service" resources: limits: cpus: '0.50' memory: 50M reservations: cpus: '0.25' memory: 20M restart_policy: condition: on-failure delay: 5s max_attempts: 3 window: 120s update_config: parallelism: 1 delay: 10s order: start-first visualizer: image: dockersamples/visualizer ports: - "9080:8080" volumes: - "/var/run/docker.sock:/var/run/docker.sock" deploy: replicas: 1 placement: constraints: [node.role == manager] portainer: image: portainer/portainer ports: - "9000:9000" volumes: - "/var/run/docker.sock:/var/run/docker.sock" deploy: replicas: 1 placement: constraints: [node.role == manager]
visualizer,portainer 爲服務管理與監聽服務,這裏先不作詳細介紹
1,mode :global 全局(每一個羣集節點只有一個容器)replicated 副本(指定容器的數量)。默認值:replicated。
2,replicas:副本模式下每一個節點啓動副本的數量
3,endpoint_mode:指定swarm服務發現的模式
4,labels:指定服務的標籤。這些標籤僅在服務上設置,而不在服務的任何容器上設置
5,resources:設置服務資源分配
6,restart_policy:配置在容器退出時是否並如何重啓容器。取代docker-compose 中的 restart指令。
7,update_config :配置更新服務,用於無縫更新應用(rolling update)
四,docker stack相關命令
1, docker stack deploy:部署新的堆棧或更新現有堆棧
docker stack deploy [OPTIONS] STACK
參數
私有倉庫須要攜帶"--with-registry-auth"參數,不然提示
image registry.cn-beijing.aliyuncs.com/ejiyuan/app:latest could not be accessed on a registry to record
its digest. Each node will access registry.cn-hangzhou.aliyuncs.com/ejiyuan/app:latest,
possibly leading to different nodes running different
須要先登陸到阿里私有倉
sudo docker login --username=ejiyuan@aliyun.com registry.cn-beijing.aliyuncs.com
內網地址
sudo docker login --username=ejiyuan@aliyun.com registry-vpc.cn-beijing.aliyuncs.com
執行命令開始使用 docker-stack.yml 文件部署服務堆,堆名爲「test」
docker stack deploy -c docker-stack.yml test --with-registry-auth
結果以下:
2,docker stack ls:列出現有堆棧以及堆中的服務數量
docker stack ls [flags]
SERVICES 顯示堆中有多少個服務
3,docker stack ps:列出堆棧中的任務
docker stack ps [OPTIONS] STACK [flags]
對應 docke run爲 上圖中,綠、藍、黃分別表明上面文件中定義的三個服務
4,docker stack services :列出堆棧中的服務
docker stack services [OPTIONS] STACK [flags]
5,docker stack rm :刪除一個或多個堆棧
docker stack rm STACK [STACK...] [flags]
六,服務升級
docker service upadte 命令參數詳解
1,更新鏡像:
docker service update --image ejiyuan/demo-docker:latest test_demo-docker
使用 portainer/portainer:latest鏡像,更新 portainer_portainer服務,此方法執行前,必須將 鏡像文件上傳到遠程倉中,程序會自動拉取遠程倉中鏡像文件與啓動服務的鏡像對比,若是沒有變化不會啓動更新,也不會重啓服務
即便設置了update_config.order: start-first,服務會先啓動在中止,可是tomcat 啓動 spring 項目須要必定時間,這段時間服務是不可用的,可是服務狀態是Runing的,因此,這裏啓用兩個副本,每次更新一個,等待一個服務啓動完成後,在執行另外一個更新,主要目的是爲了,無縫的升級系統,具體update_config.delay設置爲多少能夠參考tomcat的啓動時間
Tomcat started on port(s): 8081 (http) with context path '' Started DemoDockerApplication in 17.292 seconds (JVM running for 18.745)
注意:若是有多個同名images,最後一次編譯的會被加tag :latest,push時 要加上
docker push registry.cn-beijing.aliyuncs.com/ejiyuan/demo-docker:latest
2,更新節點數目
docker service scale test_demo-docker=3
運行結果:
3,添加或者更新一個對外端口
docker service update -–publish-add 8090 test_demo-docker
結果以下
七,更新節點
docker node update [OPTIONS] NODE [flags]
參數:
NODE:節點名稱 可使用 「docker info」 查看獲得
執行下面語句查看節點詳情
docker node inspect atv61b72x9qa5dpbrew2n016g
該命令只會更改角色,部分權限並無當即更新,所以執行服務操做時有可能提示該錯誤Error response from daemon: rpc error: code = DeadlineExceeded desc = context deadline exceeded
當即生效更新節點爲manger 執行
docker node promote NODE [NODE...]
七,經常使用命令
命令 | 描述 |
---|---|
docker swarm init | 初始化一個 swarm 羣集 |
docker swarm join | 加入羣集做爲節點或管理器 |
docker swarm join-token | 管理用於加入羣集的令牌 |
docker swarm leave | 離開 swarm 羣集 |
docker swarm unlock | 解鎖 swarm 羣集 |
docker swarm unlock-key | 管理解鎖鑰匙 |
docker swarm update | 更新 swarm 羣集 |
命令 | 描述 |
---|---|
docker node demote | 從 swarm 羣集管理器中降級一個或多個節點 |
docker node inspect | 顯示一個或多個節點的詳細信息 |
docker node ls | 列出 swarm 羣集中的節點 |
docker node promote | 將一個或多個節點推入到羣集管理器中 |
docker node ps | 列出在一個或多個節點上運行的任務,默認爲當前節點 |
docker node rm | 從 swarm 羣集刪除一個或多個節點 |
docker node update | 更新一個節點 |
命令 | 描述 |
---|---|
docker service create | 建立服務 |
docker service inspect | 顯示一個或多個服務的詳細信息 |
docker service logs | 獲取服務的日誌 |
docker service ls | 列出服務 |
docker service rm | 刪除一個或多個服務 |
docker service scale | 設置服務的實例數量 |
docker service update | 更新服務 |
docker service rollback | 恢復服務至update以前的配置 |
如何滾動更新 Service?- 天天5分鐘玩轉 Docker 容器技術(102)
Docker 小記 — 微信鬥牛棋牌源碼搭建Compose & Swarm