docker swarm overlay stack 服务部署记录
项目xxx(后端),xxx-ui前端(前后端分离的项目)
依赖mysql,elasticsearch.
分别制作了四个镜像来做这件事。
希望可以制作跨主机的部署,使用了swarm,以下是学习记录。
参考 https://www.cnblogs.com/xishuai/p/docker-swarm.html
docker-machine create -d virtualbox manager1 &&
docker-machine create -d virtualbox manager2 &&
docker-machine create -d virtualbox worker1 &&
docker-machine create -d virtualbox worker2
#docker-machine ssh manager1 "docker swarm leave --force"
alias dm=docker-machine
docker-machine ssh manager1 "docker swarm init --advertise-addr 192.168.99.100"
export TOKEN=SWMTKN-1-67oknnrzlnt62wp5xecpz8nvodizd3mdtpvb2thsk6ldvolqx5-4srdcvj0vehcoc6gs8nhcp6lh
docker-machine ssh worker1 docker swarm join --token $TOKEN 192.168.99.100:2377
docker-machine ssh worker2 docker swarm join --token $TOKEN 192.168.99.100:2377
dm ssh manager1 docker swarm join-token manager
dm ssh manager2 docker swarm join --token SWMTKN-1-67oknnrzlnt62wp5xecpz8nvodizd3mdtpvb2thsk6ldvolqx5-6f3po7z2ih2n06qztl2fnj1wb 192.168.99.100:2377
#create a overlay network
当初始化 swarm 集群或将一个 Docker 主机加入已经存在的 swarm 集群时,Docker 主机上会创建两个新网络:
一个称为 ingress 的 overlay 网络,用来处理与 swarm 服务相关的控制和数据流。
当创建的 swarm 服务没有连接到用户自定义的 overlay 网络时,这个服务会默认连接到 ingress 网络。
一个称为 docker_gwbridge 的bridge 网络,用来将单个的 Docker 守护进程连接到 swarm 中的其他守护进程。
可以使用 docker network create 命令创建用户定义的 overlay 网络,就像可以创建用户定义的 bridge 网络一样。
服务或容器一次可以连接到多个网络。服务或容器只能通过它们各自连接的网络进行通信。
TCP 端口 2377:用于集群管理通信
TCP 和 UDP 端口 7946:用于节点之间通信
UDP 端口 4789:overlay 网络流量
要创建可以用于 swarm 服务和独立容器跟其他 Docker 守护进程中运行的独立容器通信的 overlay 网络,添加 --attachable 标志:
docker network create -d overlay --attachable my-overlay
连接到同一 overlay 网络的 swarm 服务可以有效地将所有端口暴露给对方
默认情况下,发布端口的 swarm 服务使用路由网格(routing mesh)来完成。
当连接到任何 swarm 节点上的已发布端口(无论是否运行给定服务)时,都会透明地将连接重定向到正在运行该服务的 worker 节点。
实际上,Docker 充当了 swarm 服务的负载平衡器。基于路由网格的服务以虚拟 IP(VIP)模式运行。
可以将 Docker 配置为使用单独的网络接口来处理两种不同类型的流量
初始化或加入 swarm 时,分别指定 --advertise-addr 和 --datapath-addr。
一开始在manager1上创建的这个overlay网络,只会同步到同为manager角色的机器上去,而worker节点,只会在分配到任务时才会创建刚才的网络。
#简单构建docker的私有他库
docker run -d -v /home/student/docker_registry:/var/lib/registry -p 5000:5000 --restart=always --name registry registry
默认拉取推送操作都是使用https协议来做的,做完这个之后,需要修改/etc/docker/daemon.json
以下是我本机的,主要是第一行,下面两行是配置拉取镜像时默认的地址,我使用的是阿里云的,阿里云加速,拉取镜像会快些。
我们需要在上面的四个虚机中执行
{
"insecure-registries":["192.168.99.1:5000"],
"registry-mirrors": ["https://85qcsfak.mirror.aliyuncs.com"],
"graph": "/home/student/docker_data"
}
在创建的所有虚机中执行如下命令:
sudo touch /etc/docker/daemon.json &&
sudo chmod 777 /etc/docker/daemon.json &&
sudo echo '{ "insecure-registries": ["192.168.99.1:5000"] }' > /etc/docker/daemon.json
#如何把从公有库中拉取的镜像推送到私有仓库
docker tag nginx 192.168.99.1:5000/nginx:latest
docker push 192.168.99.1:5000/nginx:latest
如上示例,需要先对镜像打个标签,然后就可以push到私服上去。
#删除某些名字相似的容器
docker rm --force $(docker ps -q -f name=abc*)
#查看私有仓库内容
curl http://192.168.99.1:5000/v2/_catalog
#经过测试,通过swarm集群建好后,可以直接使用standalone的docker run 的方式部署各自的服务,没有问题。
唯一的一个问题是,在docker-machine创立的虚机中开启es的时候,因为XMS过大,没法分配内存导致失败,
把es迁移到宿主机后开启成功,整个测试也成功了。
1.直接使用standalone的方式,使用docker run -itd --net my-overlay 的方式直接部署,也没有问题,可以跨主机互访,服务部署成功。
2.使用docker service的方式部署,这样可以使用--replicas 同时在多台主机上部署服务,可以解决单点故障问题。测试成功。
3.使用docker stack deploy的方式部署,暂时还有些问题,服务部署基本成功,没有测试通过。
docker run -itd --name mysql --net my-overlay \
-e MYSQL_ROOT_PASSWORD=xxx \
-e MYSQL_PASSWORD=xxx \
-e MYSQL_USER=xxx \
-e MYSQL_DATABASE=xxx\
-p 3306:3306 \
192.168.99.1:5000/mysql:5.7
#elastic
docker run -itd --name elastic --net my-overlay -p 9200:9200 -p 9300:9300 elastic
#server backend
docker run -itd --name xxx-server --net my-overlay -p 8080:8080 192.168.99.1:5000/xxx
#ui front end
docker run -itd --name xxx-ui --net my-overlay -p 80:80 192.168.99.1:5000/xxx-ui
下面测试使用docker service ,这样可以自带负载均衡和多副本,提高了高可用和高吞吐量。
docker service create --name mysql \
--network my-overlay --hostname mysql \
--replicas 2 \
-e MYSQL_ROOT_PASSWORD=xxx \
-e MYSQL_PASSWORD=xxx \
-e MYSQL_USER=xxx \
-e MYSQL_DATABASE=tss_log_insight_new_new \
192.168.99.1:5000/mysql:5.7
docker service create --name xxx-server --network my-overlay \
--replicas 2 --hostname xxx-server \
-p 8080:8080 192.168.99.1:5000/xxx
docker service create --name xxx-ui --network my-overlay \
--replicas 4 --hostname xxx-ui \
-p 80:80 192.168.99.1:5000/xxx-ui
docker-compose.yaml内容:
version: '3'
services:
tssxxx-ui:
image: 192.168.99.1:5000/xxx-ui
ports:
- 80:80
deploy:
replicas: 5
tssxxx-server:
image: 192.168.99.1:5000/xxx
environment:
- SPRING_PROFILES_ACTIVE=dev,swagger
- SPRING_DATASOURCE_URL=jdbc:mysql://mysql:3306/tssxxx?useUnicode=true&characterEncoding=utf8&useSSL=false
- SPRING_DATASOURCE_USERNAME=xxx
- SPRING_DATASOURCE_PASSWORD=xxx
- JHIPSTER_SLEEP=10 # gives time for the database to boot before the application
# - SPRING_DATA_ELASTICSEARCH_CLUSTER_NODES=tssxxx-elasticsearch:9300
# - SPRING_DATA_ELASTICSEARCH_CLUSTER_NAME=elastic
ports:
- 8080:8080
container_name: xxx-server
hostname: xxx-server
tssxxx-mysql:
image: 192.168.99.1:5000/mysql:5.7
container_name: mysql
hostname: mysql
# volumes:
# - ~/volumes/jhipster/tssxxx/mysql/:/var/lib/mysql/
environment:
- MYSQL_USER=tss
- MYSQL_PASSWORD=tss
- MYSQL_DATABASE=tssxxx
- MYSQL_ROOT_PASSWORD=root
ports:
- 3306:3306
command: mysqld --lower_case_table_names=1 --skip-ssl --character_set_server=utf8mb4 --explicit_defaults_for_timestamp
networks:
default:
external:
name: my-overlay
my-overlay:
driver: overlay
docker stack deploy -c docker-compose.yaml xxx
docker stack ls
docker stack rm xxx
docker stack ps
下面是一个集群管理服务,可以尝试。
portainer:
image: 192.168.99.1:5000/portainer/portainer:latest
ports:
- "9000:9000"
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
deploy:
replicas: 1
placement:
constraints: [node.role == manager]
总结:
1.制作服务镜像,如mysql,es,后端和前端的应用
2.docker在各主机上的安装(本机使用最新的docker-ce 18.06),docker-compose单独安装
3.构建swarm集群,通过docker swarm init /docker swarm join 搭建集群
4.在manager角色的节点上创建overlay驱动的网卡
5.使用docker run -t --net 或docker service 或docker stack deploy来部署自己的服务
docker swarm overlay stack 服务部署记录的更多相关文章
- Docker Swarm集群中部署Traefik负载均衡器
一.创建单节点的Docker Swarm集群 docker swarm init 二.在Swarm集群中创建一个网络 docker network create --driver=overlay tr ...
- linux下syslog-ng日志集中管理服务部署记录
syslog是Linux系统默认的日志守护进程,默认的syslog配置文件是/etc/syslog.conf文件.syslog守护进程是可配置的,它允许人们为每一种类型的系统信息精确地指定一个存放地点 ...
- docker容器化python服务部署(supervisor-gunicorn-flask)
docker容器化python服务部署(supervisor-gunicorn-flask) 本文系作者原创,转载请注明出处: https://www.cnblogs.com/further-furt ...
- 云计算之路-阿里云上-容器难容:优化自建 docker swarm 集群的部署
在上周六遭遇阿里云容器服务 swarm 版的故障之后,我们决定还是走自建 docker swarm 之路,只要不是阿里云底层的问题,我们相信会找到办法解决或避开自建 docker swarm 不稳定的 ...
- docker swarm 搭建与服务更新
一,docker swarm 是什么 Docker Swarm.Docker Machine与Docker Compose号称Docker三剑客Docker Swarm 和 Docker Compos ...
- 记一次 Docker swarm - overlay network access error
背景 之前使用Docker swam 在不同的服务器 (docker host) 上面创建了service,他们之间的container通过overlay的网络通信. 昨天由于公司网络维护,其中一台服 ...
- 33. docker swarm 集群服务通信 之 RoutingMesh - Ingress 网络
1.作用 当在 任何 一个 swarm 节点去访问 端口服务的时候 会通过 本节点 的 IPVS ( ip virtual service ) 到 真正的 swarm 节点上 当访问 docker h ...
- 32. docker swarm 集群服务通信 之 RoutingMesh - internal 网络
1. 两个 service 是如何通信的 通过内置的 DNS 服务发现的功能 相互通信的 2. 创建一个 overlay 的 网络 docker network create -d overlay ...
- nfs服务部署记录
一.概念介绍NFS 是Network File System的缩写,即网络文件系统.一种使用于分散式文件系统的协定,由Sun公司开发,于1984年向外公布.功能是通过网络让不同的机器.不同的操作系统能 ...
随机推荐
- selenium基础框架的封装(Python版)这篇帖子在百度关键词搜索的第一位了,有图为证,开心!
百度搜索结果页地址:https://www.baidu.com/s?ie=utf-8&f=3&rsv_bp=1&rsv_idx=1&tn=baidu&wd=se ...
- 编程之美 set 2 精确表达浮点数
有限小数和无限循环小数转化成分数 比如 0.9 -> 9/10 0.333(3) -> 1/3 解法 1. 主要涉及到一个数学公式的计算. 2. 对于有限小数, 分子分母求最大公约数即可 ...
- ArcGIS GP应用-GP模型服务发布
1.双击模型名称打开运行窗体 2.在图上交互和窗体中输入数据后,点击确定运行模型,查看运行结果 3.在当前模型“缓冲区分析”的目录树上,右击含有图形(点.线.面)的节点,点击添加至显示,显示图片 4. ...
- spring基础---->spring自定义标签(一)
Spring具有一个基于架构的扩展机制,可以使用xml文件定义和配置bean.本博客将介绍如何编写自定义XML bean的解析器,并用实例来加以说明.其实我一直相信 等你出现的时候我就知道是你. Sp ...
- Codevs 5914 [SXOI2016]最大值
70分算法+30分打表 #include<ctime> #include<cstdio> #include<cstdlib> #include<algorit ...
- Fragment,仿QQ空间
转载请注明出处:http://blog.csdn.net/yangyu20121224/article/details/9023451 在今天的这篇文章当中,我依然会以实战加理论结合 ...
- Android开源项目分类汇总【畜生级别】
From :http://blog.csdn.net/forlong401/article/details/25459403?c=6c4cd677a617db4655988e41ee081691#t7 ...
- axios post传参后台无法接收问题
起因是在angular项目中使用axios发送post请求,向后台传参后台一直无法接收,网上查了有说是请求头设置不对,需要把Content-Type:application/x-www-form-ur ...
- angular中的子路由用法
Angular ui-route的用法 引入angular和使用angular子路由时需要的依赖模块angular-ui-route.js.并且在html中将路由要插入的位置写上.而在js部分中和an ...
- wxshop_my移动端前端开发项目
**************************************************************************************************** ...