docker分布式应用部署方案
目录
一. 简单的IDEA打包部署docker
二. docker Compose
1. 官网介绍
2. compose的安装以及测试
3. compose配置文件yml编写
4. 编写服务,测试compose
三. docker Swarm
1. 运行swarm集群
1.1 初始化init
1.2 加入节点join
1.3 查看测试以及raft一致性算法
2. swarm部署应用
2.1 创建一个swarm集群服务
一. 简单的IDEA打包部署docker
将我们写好的java项目,通过dockerfile打包部署在docker中运行
①在IDEA中编写dockerFile文件(最好下载docker的IDEA插件)
FROM java:8
#把当前路径下的jar文件,copy到指定目录中
COPY *.jar /opt/jar/app.jar
CMD ["--server.port=8090"]
EXPOSE 8090
#docker run 后指定命令: java -jar /opt/jar/app.jar
ENTRYPOINT ["java", "-jar", "/opt/jar/app.jar"]#docker run 最终指定命令: java -jar /opt/jar/app.jar --server.port=8090
②将jar包和Dockerfile文件上传至服务器,然后通过docker build命令打包成镜像,然后直接run运行即可完成发布部署
二. docker Compose
通过docker进行部署,可以通通过dockerFile文件---build---run手动完成单个容器的部署运行
如果通过compose来部署的话,可以做到多个应用添加依赖关系,高效的实现管理容器
1. 官网介绍
- compose是一个用来定义和运行容器的应用(docker的开源项目)
- 通过yaml文件配置应用服务
- 通过命令,docker-compose-up,创建并启动一个compose
- 通过配置文件,自动启动服务,并设置依赖关系。实现容器的批量编排。一键统一部署
2. compose的安装以及测试
①下载compose:
官方下载(速度较慢):
sudo curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
国内镜像下载:
curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.5/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
②设置权限
sudo chmod +x /usr/local/bin/docker-compose
③测试
#查看版本
docker-compose version
3. compose配置文件yml编写
docker compose的配置文件主要用来配置容器以及容器的规则。可以理解为一共有三层
参考官方文档:https://docs.docker.com/compose/compose-file/
#①compose的版本,需要与docker的引擎兼容
version: 3.8 #②配置的服务,就相当于配置了哪些容器
service:服务1:#可以配置该容器的内容,例如images/build/network/ports等服务2:...#③其他配置,例如可以添加一个网络、添加挂载设置等等
networks:....
volumes:....
命令:官方文档给出了所有命令的使用规则,下面列举常用的命令示例
- build:构建,可以用来指定构建路径 .表示当前路径,下面表示在当前路径的dir文件中通过Dockerfile-alternate文件为进行进行构建镜像,dockerfile如果不写,默认就是找路径下Dockerfile文件
- network:指定使用的网络
- command:编写命令
container_name:指定容器的名字
depends_on:指定启动依赖关系
deploy:集群相关
environment:环境变量,例如设置mysql的密码
4. 编写服务,测试compose
测试一个springboot和Redis集合使用的web应用
- 创建一个新的springboot项目,设置Redis配置,创建一个controller测试接口:
- 将该springboot项目打包,并编写Dockerfile文件:
- 将jar包和dockerfile上传至服务器,编写docker-compose.yml文件,
将springboot应用按照我们编写的dockerfile构建,将Redis按照镜像构建,并通过该配置文件编排后一起启动。
version: "3.8"
services:web:#寻找当前路径下的默认Dockerfile文件构建镜像build: .ports:- "8090:8090"#启动依赖Redisdepends_on:- redisredis:#通过该镜像构建容器image: "redis:alpine"
- 启动: docker-compse up 访问8090端口进行测试完成。redis 也可以成功连接
- docker-compose down可以停掉compose服务
官方提供的一键安装wordpress博客案例:
https://docs.docker.com/compose/wordpress/
三. docker Swarm
swarm是一个集群部署模式,分为manager主节点和work工作节点。
操作都是manager上进行。无需安装,docker引擎自带swarm。具有一致性的特性
- 至少需要保证三个manager节点,当swarm只有一个主节点时,是不会工作的
- swarm搭建成功后,会创建一个默认的网络。集群都在该网络工作。docker swarm --help查看帮助命令
swarm是集群部署,应用通过swarm进行部署后,可以方便的进行管理、负载均衡、扩容缩容等
利用swarm,可以将应用部署在一台服务器,然后通过swarm一键横向扩展
例:
部署一个PMS-web应用,部署在某台服务器上作为service,然后横向扩展分别部署在4台机器上。通过nginx负载均衡完成访问。实现服务的高可用。
提供了集群的加入、离开命令
1. 运行swarm集群
1.1 初始化init
首先在某台服务器初始化swarm,通过init命令
docker swarm init --advertise-addr 47.111.111.11
然后会返回一个带有token的join连接:并显示了当前node的信息,是作为一个manager。
1.2 加入节点join
生成加入命令的命令:
- docker swarm join-token worker : 加入一个worker节点
- docker swarm join-token manager : 加入一个manager节点
初始化一台manager服务器后,在另外一台服务器中作为work/manager节点,加入该swarm中(用init后的提示语、或者通过声明命令)
注:init的manger节点IP的端口,需要开放
docker swarm join --token SWMTKN-1-1fpo5ovbg8imf3vkaedqswlku3andjqf2ekps224r0hlvq8uvx-2ouvlo5e42hux9v48py56b0im 124.70.111.112:2377
1.3 查看测试以及raft一致性算法
通过docker node ls 查看所有的节点信息(只能在manager节点操作)
通过docker swarm leave 离开当前集群
raft一致性算法:
如果swarm中只剩了一个manager节点,则swarm不可用。所以,我们在部署swarm的时候,至少需要部署三个manager节点,才能保证高可用。假设三台中有一台宕机,那还有两台可以使用,如果两台中再有一台宕机,则整个swarm不可用。
2. swarm部署应用
对于docker来说,我们可以通过docker run运行一个容器、可以通过docker-compose 一键启动容器
但是这都是相对于单机服务来说的,如果针对于集群服务,就需要一台服务器一台服务器的运行命令,并且也不好管理
所以,对于集群docker容器服务的使用,swarm提供了方便的管理功能
swarm是应用集群部署的解决方案,也就意味着通过swarm部署的应用,是一个集群环境。通过swarm部署应用可以实现:
- 搭建应用的集群环境
- 动态的扩缩容服务
- 实现灰色(金丝雀)更新(不停机更新)
- ......
2.1 创建一个swarm集群服务
docker service --help 查看帮助文档
首先在某台服务器上初始化swarm : docker swarm init
docker service create -p 8090:80 --name my_service nginx #通过swarm创建一个nginx的docker服务(二主二从的docker swarm)
创建完成后,会在这四台docker服务器中随机一台上,运行一个nginx的docker容器,可通过docker ps查看
扩容:update、scale
“docker swarm集群中的service启动后,在该集群中的任意节点ip都可以访问该服务(会自动进行负载均衡,随机访问任意一个容器),前提是docker swarm的服务端口(2377)、应用端口(8090自定义)、通讯端口(7946)、网络端口(4789)都开启”
此时nginx只在一台服务器上运行吗,如果需要扩容,直接运行update指令即可:
eg:创建10个nginx服务(随机分配在不同的服务器上):
docker service update --replicas 10 my-nginx 或者
docker service scale my-nginx=10
eg:缩容为2个:
docker service update --replicas 2 my-nginx 或者
docker service scale my-nginx=2
通过docker service ls 查看所有的服务
service的操作:
可以通过rm移除、rollback回滚、logs查看日志、inspect查看元数据
+
docker分布式应用部署方案相关推荐
- 1离线 TiDB Ansible 部署方案-详解
一: 环境要求 Linux 操作系统版本要求 Linux 操作系统平台 版本 Red Hat Enterprise Linux 7.3 及以上 CentOS 7.3 及以上 Oracle Enterp ...
- Docker+K8S 集群环境搭建及分布式应用部署
互联网正在飞速发展,早已由最初的单体架构演变为如今的分布式架构,而分布式架构也为系统运维带来了挑战.架构在发展,系统运维技术也在不断升级.而伴随着系统运维的是如今炒的火热的容器技术,Docker 就是 ...
- Docker持续部署图文详解
2019独角兽企业重金招聘Python工程师标准>>> Docker持续部署图文详解 博客分类: docker 架构 JAVA项目如何通过Docker实现持续部署(只需简单四步),即 ...
- 部署node_如何使用 docker 高效部署 Node 应用
作者:山月行 转发链接:https://mp.weixin.qq.com/s/-wnkIeBjsLCQNfx0FJdD3A 前言 ❝ 如何在生产环境部署一个 Node 应用?[1] ❞ 一个合理并且高 ...
- 不建议在Docker中部署数据库
近 2 年 Docker 非常的火热,各位开发者恨不得把所有的应用.软件都部署在 Docker 容器中,但是您确定也要把数据库也部署的容器中吗? 这个问题不是子虚乌有,因为在网上能够找到很多各种操作手 ...
- 聊聊 Docker Swarm 部署 gRPC 服务的坑
gRPC 是一个高性能.开源和通用的 RPC 框架,面向移动和 HTTP/2 设计,也是目前流行的微服务架构中比较突出的跨语言 RPC 框架. 一直以来,我们的微服务都是基于 gRPC 来开发,使用的 ...
- IDEA配置Docker一键部署SpringBoot项目(企业级做法)
Docker一键部署SpringBoot项目 前言 一.开启Linux的Docker远程访问 1.1 安装vim工具: 1.2 修改`daemon.json`的配置: 1.3 加入配置: 1.4 重新 ...
- oracle容器部署,Linux docker oracle 部署
此刻,oracle的数据正在一条条地插入数据库.虽然命令行的表名还是乱码,但是oracle 客户端已经能查出数据了.反观这次 Linux docker oracle之旅.充满了艰辛,我像一个盲人一样 ...
- 基于华为云的一个典型的持续部署方案
云社区 博客 博客详情 基于华为云的一个典型的持续部署方案 [摘要] 华为云迄今为止已经有14大类超过100种服务了,可以做很多有用和好玩的方案. 基于华为云的一个典型的持续部署方案:Function ...
最新文章
- C#+AE 调整TOCControl控件中图层的显示顺序
- 踩到一个Emit的坑,留个纪念
- 数据结构特性解析 (二) ArrayList
- shell调用各种sqlplus用法
- 手把手教你用CAB发布OCX的简单办法
- 清华大学梁宸计算机系,2015年广东高考高等学校自主招生录取考生名单公示(2)...
- JAVA中的onkey_onKeyListener无法在虚拟键盘上工作
- 带音乐动态手机壁纸小程序源码-带自动采集-更新功能
- 无传感FOC控制中的转子位置和速度确定方法一
- 转载:VirtualizingStackPanel
- 高等数学问题的符号解
- Threejs实现天空盒,全景场景,地面草地
- 差分进化算法_差分进化算法入门及实例应用
- ps把图片无损放大的方法
- Android 获取手机存储空间
- shell脚本编程之awk入门
- 【XSY2515】管道(pipe)(最小生成树+倍增lca)
- 微信 图片二维码识别不了的问题
- 通州新城规划图 - 新通网http://www.xintongwang.com
- 生活实用之清洗小龙虾
热门文章
- Educoder/头歌JAVA——JavaWeb:JSP入门
- WOF鲸鱼优化算法学习总结
- 洗碗机品牌十大排行榜,火星人洗碗机怎么样?对比过后我选“它”
- react--(查询、重置)按钮封装
- Python frozenset() 函数的使用与作用
- Filezilla搭建FTP服务器及Linux连接
- 【踩坑】mirai挂机运行经常自动退出怎么办?
- 左移寄存器vhdl_双向移位寄存器VHDL设计.doc
- 解决Django: [TypeError: __init__() missing 1 required positional argument: 'on_delete']
- Potplayer提升画质攻略