Docker swarm 容器编排工具。
下面说的是怎么启动work和manager节点,并在节点上运行服务,并停止服务
启动manager和work节点
ip a # 查看本机的ip地址,看veth·的IP地址
docker swarm init --advertise-addr=上面的IP地址 # 成为manager节点
# 会返回执行work的命令
# 进入另一台主机, 执行上面返回的work命令
# 再进入另一台主机,执行上面返回的work命令
# 这样就启动了2个work节点。和一个manager节点
运行service和停止service
# 在节点运行service
# manager节点
docker service create --name demo busybox sh -c "while true; do sleep 3600; done;"
docker service ls # 查看有几个服务
docker service ps demo # 查看服务的具体情况,看到这个服务运行在manager上,不一定非得是manager上吧,多分と思います。
docker service scale demo=5 # 开启5个demo服务,水平扩展,将5个服务自动分给上面的3个节点(2个work,1个manager)
# 进入work一个主机
docker rm -f 容器ID # 删掉一个容器
# 在进入manager主机
docker service ls # 发现REPLICAS 4/5, 再执行一次变成5/5, 大概就是这个意思
# 就是说swarm,会检测停掉的容器,发现容器停掉,还会自己重新启动
docekr service rm demo # 删除demo服务,5个容器都停掉了
各个节点的相互访问
通过overlay
docker network create -d overlay demo-net
docker network ls
docker service create --name mysql --env MYSQL_ROOT_PASSWORD=root --env MYSQL_DATABASE=wordpress ---network demo-net --mount type=volume, source=mysql-data,destination=/var/xxx
docker service create --name wordpress -p 80:80 --env WORDPRESS_DB_PASSWORD=root --env WORDPRESS_DB_HOST=mysql --network demo-net wordpress
docker service ps wordpress
# 查看wordpress, 发现运行在work2上, 运行在哪,不重要,而且不能确定,说这句话就是说要记住这个命令
# 进入work2节点
ip a
# 找到verh2显示的ip
# 通过这个ip, 用worlk1和manager也能访问到,, (可能有问题,我再看看)
利用docker-compose.yml文件部署swarm
上面全是手动,可以通过docker-compose文件部署,就像前面docker-compose 使用那样
version:: '3'
service:
web:
image: wordpress # 镜像只能拉取,不能自己建立
ports:
- 8080:8080
secrets: # 指定密码
- my-pw
environment:
WOEDPRESS_DB_HOST: mysql
WORDPPEDD_DB_PASSWORD: /run/secrets/my-pw # 使用密码
networks:
- my-network
depend_on:
- mysql
deploy:
mode: replicated
replicas: 3 # 一下启动3个wordpress服务
restart_policy: # 下面是重启策略
condition: on-failure
delay: 5s
max_attempts: 3
update_config: # 更新策略
parallelism: 1
delay: 10s
mysql:
image: mysql
secrets:
- my-pw
environment:
MYSQL_ROOT_PASSWORD: /run/secrets/my-pw
MYSQL_DATABASSE: wordpress
volumes:
- mysql-data:/var/lib/mysql
networks:
- my-network
deploy:
mode: global # 不能启动多个
placement:
constraints:bu
- node.role == manager # mysql只能部署到manager节点
volumes:
mysql-data:
networks:
my-network:
driver: overlay
secrets: # 事先没创建secret,要在这指定,相当于创建了secrets.如果提前创建了,就不需要在制定了
my-pw:
file: ./password # password是个文件
# 这种方式不推荐,因为存在了文件里。不安全,尽量提前创建secrets
swarm运行这个文件需要下面这个命令
docker stack
- deploy Deploy a new stack update an existing stack
- ls List stacks
- ps List the stacks in the stacks
- rm Remove one or more stacks
- services List the services in the stack (yml中定义的service)
docker stack deploy wordpress --compose-file=docker-compose.yml
# swarm 通过--compose-file 指定yml文件来启动, wordpress 是自己起stack的名
docker stack ls
docker stack ps wordpress
docker stack services wordpress
docker service scale stack名字_service名字=3
# 如 docker service scale wordpress_web=3
# 把stack里面的service启动成几个,
select Management
密码管理
- 存在Swarm Manager 节点,Rafc database里
- 在container内部secret看起来像文件,实际是内存
- secrect 可以assign给service,这个service就能看到这个secret
基本命令:
- docker secret create
- docker secret inspect
- docker ls
- docker rm
可以通过两种方法创建select
① 通过文件
vim password
# 随便输入一个密码
docker secret create my_password password
# 创建一个密码,my_password是自己起的名字, password是个文件
rm -rm passwpord # 出于安全考略,密码用完就删
docker secret ls
②通过标准输出
echo "要使用的密码" | docekr secret create my-password2 -
# 别忘了加这个-, 这个-是啥意思了?以前记得用过,,
检验一下,
docker service create --name client --secret xx busybox sh -c "while true; do sleep 3600; done"
docker exec -it ccee sh # 进入到busybox
cd /run/secrets/ # 密码放在这个文件里
ls
cat xxx # 能看到密码
使用:
docker service create --name db --secret xx -e MYSQL_ROOT_PASSWORD_FILE=/run/secrets/xx
或者通过上面的docker-compose来指定,注意,如果没有最后名于service选项相同的选项,就要提前创建密码。