docker-swarm----多機容器管理


Docker Swarm:

  准備三台機器,都裝上 Docker

  docker swarm是docker官方提供的一套容器編排系統。它的架構如下:

 

 

swarm是一系列節點的集合,而節點可以是一台裸機或者一台虛擬機。一個節點能扮演一個或者兩個角色,manager或者worker。

  1. manager節點:Docker Swarm集群需要至少一個manager節點,節點之間使用Raft consensus protocol進行協同工作。通常,第一個啟用docker swarm的節點將成為leader,后來加入的都是follower。當前的leader如果掛掉,剩余的節點將重新選舉出一個新的leader。每一個manager都有一個完整的當前集群狀態的副本,可以保證manager的高可用。
  2. worker節點:worker節點是運行實際應用服務的容器所在的地方。理論上,一個manager節點也能同時成為worker節點,但在生產環境中,我們不建議這樣做。worker節點之間,通過control plane進行通信,這種通信使用gossip協議,並且是異步的。

搭建Swarm集群:

1.設置 manager

docker swarm init --advertise-addr=192.168.0.11

  這個時候需要注意觀察日志。拿到worker node加入manager node的信息

docker swarm join --token SWMTKN-1-0a5ph4nehwdm9wzcmlbj2ckqqso38pkd238rprzwcoawabxtdq-arcpra6yzltedpafk3qyvv0y3 192.168.0.11:2377

2.切換機器,分別執行上面的命令加入 swarm 集群。

3.進入到manager node查看集群狀態 docker node ls

4.node類型的轉換:

#可以將worker提升成manager,從而保證manager的高可用
docker node promote worker01-node
docker node promote worker02-node

#降級可以用demote
docker node demote worker01-node

   Swarm基本操作:

復制代碼
docker service create --name my-tomcat tomcat   --創建一個tomcat的service

docker service ls  --查看當前swarm的service

docker service logs my-tomcat  --查看service的啟動日志

docker service inspect my-tomcat    --查看service的詳情

docker service ps my-tomcat   --查看my-tomcat運行在哪個node上

docker service scale my-tomcat=3    --水平擴展service 可以發現 其他node上都運行了一個my-tomcat的service
docker service ls
docker service ps my-tomcat

docker service rm my-tomcat -- 刪除service
復制代碼

   如果某個node上的my-tomcat掛掉了,這時候會自動擴展

 多機通信overlay網絡:

  業務場景:workpress+mysql實現個人博客搭建

傳統手動方式實現:

01-創建mysql容器[創建完成等待一會,注意mysql的版本]

docker run -d --name mysql -v v1:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=examplepass -e MYSQL_DATABASE=db_wordpress mysql:5.6

02-創建wordpress容器[將wordpress的80端口映射到centos的8080端口]

docker run -d --name wordpress --link mysql -e WORDPRESS_DB_HOST=mysql:3306 -e WORDPRESS_DB_USER=root -e WORDPRESS_DB_PASSWORD=examplepass -e WORDPRESS_DB_NAME=db_wordpress -p 8080:80 wordpress

03-查看默認bridge的網絡,可以發現兩個容器都在其中

docker network inspect bridge

04-訪問測試:瀏覽器中輸入:ip[centos]:8080,一直下一步

使用docker compose創建:

  docker-compose的方式還是在一台機器中,網絡這塊很清晰

01-創建wordpress-mysql文件夾

mkdir -p /tmp/wordpress-mysql
cd /tmp/wordpress-mysql

02-創建docker-compose.yml。文件內容 yml :

復制代碼
version: '3.1'

services:

  wordpress:
    image: wordpress
    restart: always
    ports:
      - 8080:80
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_USER: exampleuser
      WORDPRESS_DB_PASSWORD: examplepass
      WORDPRESS_DB_NAME: exampledb
    volumes:
      - wordpress:/var/www/html

  db:
    image: mysql:5.7
    restart: always
    environment:
      MYSQL_DATABASE: exampledb
      MYSQL_USER: exampleuser
      MYSQL_PASSWORD: examplepass
      MYSQL_RANDOM_ROOT_PASSWORD: '1'
    volumes:
      - db:/var/lib/mysql

volumes:
  wordpress:
  db:
復制代碼

03-根據docker-compose.yml文件創建service

docker-compose up -d

04-訪問測試:win10瀏覽器ip[centos]:8080,一直下一步

05-值得關注的點是網絡

docker network ls
docker network inspect wordpress-mysql_default

Swarm中實現:

  還是wordpress+mysql的案例,在docker swarm集群中怎么玩呢?

(1)創建一個overlay網絡,用於docker swarm中多機通信 , 在 manager-node中執行:

docker network create -d overlay my-overlay-net
docker network ls[此時worker node查看不到]

(2)創建mysql的service,在manager-node節點上執行:

docker service create --name mysql --mount type=volume,source=v1,destination=/var/lib/mysql --env MYSQL_ROOT_PASSWORD=examplepass --env MYSQL_DATABASE=db_wordpress --network my-overlay-net mysql:5.6
#查看service
docker service ls
docker service ps mysql

(3)創建wordpress的service,在manager-node節點上執行:

復制代碼
#創建service  [注意之所以下面可以通過mysql名字訪問,也是因為有DNS解析]
docker service create --name wordpress --env WORDPRESS_DB_USER=root --env WORDPRESS_DB_PASSWORD=examplepass --env WORDPRESS_DB_HOST=mysql:3306 --env WORDPRESS_DB_NAME=db_wordpress -p 8080:80 --network my-overlay-net wordpress
#查看service
    docker service ls
    docker service ps mysql
#此時mysql和wordpress的service運行在哪個node上,這時候就能看到my-overlay-net的網絡
復制代碼

(4)測試 :瀏覽器訪問ip[manager/worker01/worker02]:8080都能訪問成功

(5)查看my-overlay-net

docker network inspect my-overlay-net

Routing Mesh:

  通過前面的案例我們發現,部署一個wordpress的service,映射到主機的8080端口,這時候通過swarm集群中的任意主機ip:8080都能成功訪問,這是因為什么?docker swarm中有自己的分布式存儲機制.把問題簡化:

docker service create --name tomcat -p 8080:8080 --network my-overlay-net tomcat

(1)記得使用一個自定義的overlay類型的網絡

network my-overlay-net

(2)查看service情況

docker service ls
docker service ps tomcat

(3)訪問3台機器的ip:8080測試 :發現都能夠訪問到tomcat的歡迎頁

Internal:

  在實戰wordpress+mysql的時候,發現wordpress中可以直接通過mysql名稱訪問,這樣可以說明兩點,第一是其中一定有dns解析,第二是兩個service的ip是能夠ping通的,不妨再創建一個service,也同樣使用上述tomcat的overlay網絡,然后來實驗

docker service create --name whoami -p 8000:8000 --network my-overlay-net -d  jwilder/whoami

(1)查看whoami的情況

docker service ps whoami

(2)在各自容器中互相ping一下彼此,也就是容器間的通信,tomcat容器中ping whoami

docker exec -it 9d7d4c2b1b80 ping whoami
64 bytes from bogon (10.0.0.8): icmp_seq=1 ttl=64 time=0.050 ms
64 bytes from bogon (10.0.0.8): icmp_seq=2 ttl=64 time=0.080 ms

whoami容器中ping tomcat

docker exec -it 5c4fe39e7f60 ping tomcat
64 bytes from bogon (10.0.0.18): icmp_seq=1 ttl=64 time=0.050 ms
64 bytes from bogon (10.0.0.18): icmp_seq=2 ttl=64 time=0.080 ms

(3)將whoami進行擴容

docker service scale whoami=3
docker service ps whoami #manager,worker01,worker02

(4)此時再ping whoami service,並且訪問whoami服務

復制代碼
#ping
docker exec -it 9d7d4c2b1b80 ping whoami
64 bytes from bogon (10.0.0.8): icmp_seq=1 ttl=64 time=0.055 ms
64 bytes from bogon (10.0.0.8): icmp_seq=2 ttl=64 time=0.084 ms

#訪問
docker exec -it 9d7d4c2b1b80 curl whoami:8000 [多訪問幾次]
I'm 09f4158c81ae
I'm aebc574dc990
I'm 7755bc7da921
復制代碼

  通過上述的實驗可以發現什么?whoami服務對其他服務暴露的ip是不變的,但是通過whoami名稱訪問8000端口,確實訪問到的是不同的service,也就是說whoami service對其他服務提供了一個統一的VIP入口,別的服務訪問時會做負載均衡。

Stack:

  有沒有發現上述部署service很麻煩?要是能夠類似於docker-compose.yml文件那種方式一起管理該多少?這就要涉及到docker swarm中的Stack,我們直接通過前面的wordpress+mysql案例看看怎么使用咯。

(1)新建service.yml文件

復制代碼
version: '3'

services:

wordpress:
image: wordpress
ports:
- 8080:80
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: exampleuser
WORDPRESS_DB_PASSWORD: examplepass
WORDPRESS_DB_NAME: exampledb
networks:
- ol-net
volumes:
- wordpress:/var/www/html
deploy:
mode: replicated
replicas: 3
restart_policy:
condition: on-failure
delay: 5s
max_attempts: 3
update_config:
parallelism: 1
delay: 10s

db:
image: mysql:5.7
environment:
MYSQL_DATABASE: exampledb
MYSQL_USER: exampleuser
MYSQL_PASSWORD: examplepass
MYSQL_RANDOM_ROOT_PASSWORD: '1'
volumes:
- db:/var/lib/mysql
networks:
- ol-net
deploy:
mode: global
placement:
constraints:
- node.role == manager

volumes:
wordpress:
db:

networks:
ol-net:
driver: overlay
復制代碼

(2)根據service.yml創建service

docker statck deploy -c service.yml my-service

(3)常見操作

docker stack ls   --查看stack具體信息

docker stack services my-service  --查看具體的service

docker service inspect my-service-db   --查看某個service

(4)訪問測試:瀏覽器ip[manager,worker01,worker02]:8080


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM