前面我们对docker compose进行了介绍和使用,然而docker compose比较适用于单机的环境下,对于多机的环境下docker也提供了对应的能力,首先我们得准备三台服务器,任意三台可以互相访问的服务器都行。
搭建swarm集群选择一台服务器为manger。
manager node也可以作为worker node提供服务
查看ip 执行:
docker swarm init --advertise-addr=你的ip
此处注意控制台的打印信息
进入另外两个worker服务器,分别执行
docker swarm join --token SWMTKN-1-5id7urk9xw4az24taxiqhipjz5s9rbwgiblgpl6qmnu3frqt5k-1ycqd8krdfqz2m4mciunzvpow ip:2377
看看控制台打印 完成之后在manager查看节点信息,发现集群node正常创建
docker node ls
可以将worker提升成manager,从而保证manager的高可用,当manger不可用时,设置的节点可以竞选leader
docker node promote tmtlpvxrt6dldkv8r96v5iaur
#降级可以用
docker node demote tmtlpvxrt6dldkv8r96v5iaur
至此swarm搭建的就完成了,我们在来看看swarm的使用
创建一个service
docker service create --name my-tomcat tomcat
查看当前swarm的service
docker service ls
查看service的启动日志
docker service logs my-tomcat
查看service详情
docker service inspect my-tomcat
查看my-tomcat运行在哪个node上
docker service ps my-tomcat
水平扩展service
docker service scale my-tomcat=3
docker service ls
docker service ps my-tomcat
注意:这里如果某个节点的container挂掉了他会自动扩展。
删除service
docker service rm my-tomcat
多机通信overlay网络
场景:使用workpress+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
#创建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
#查看默认bridge的网络,可以发现两个容器都在其中
docker network inspect bridge
#访问测试
ip[centos]:8080
使用docker compose创建
#创建wordpress-mysql文件夹
mkdir -p /tmp/wordpress-mysql
cd /tmp/wordpress-mysql
#创建docker-compose.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:
#根据docker-compose.yml文件创建service
docker-compose up -d
#访问测试
ip[centos]:8080
Swarm中实现
创建一个overlay网络,用于docker swarm中多机通信
docker network create -d overlay my-overlay-net
注意:此时我们是在主节点中创建的这个网络因此我们使用 docker network ls
的时候此时在子节点中是看不到这个网络的。
在主节点创建mysql的service
#创建service
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
运气不是很好,mysql的container部署在了leader节点上,我们来对他进行扩容尝试。
docker service scale mysql=2
在这里我想表达的是,因为刚刚我们创建了my-overlay-net的这个网络,并且在子节点中我们是看不到这个网络,因此,如果我们刚刚创建的service不是部署在leader节点上,而是在worker节点上,那么在worker节点上,其实是可以看到这个my-overlay-net网络的,我们等待扩容结束。
完成之后,我们通过 docker network ls
发现在该机器上运行了一个service也看到了我们自定义的网络。
创建wordpress的service
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
访问 ip:8080
此时你会发现使用 三个节点的任意一个 ip:8080都能够访问。