Docker是一个开源的应用容器引擎,将应用以及依赖打包到一个可移植的镜像中,部署到服务器并运行在container容器实例中。
资源编排Docker-compose定义和运行多个容器组成的应用系统,通过docker-compose.yml文件声明各个服务,作为一个整体来完成应用的创建和启动。
Swarm是Docker官方提供的集群管理工具,将Docker节点统一管理组织,以service服务为调度单元,支持动态扩容等特性。
阿里云容器镜像服务提供Docker镜像仓库托管,配置项目代码Git仓库和构建规则,轻松实现Docker镜像自动构建系统。
Jext技术社区开源Web服务脚手架,从实际项目中整理升华,针对多种业务场景扩展开发。系统部署流程和自动构建系统如下图:
内容目录:
1. 系统架构
2. docker-compose一键部署开发环境
3. Dockerfile配置
4. 阿里云+Git+Docker镜像自动构建系统
5. docker-compose一键部署Web服务
6. Swarm集群部署Web服务
7. Docker容器编排、镜像服务和Git代码托管云服务的选择
一,系统架构
l 代码下载
https://github.com/jextop/StarterDeploy
https://github.com/jextop/StarterApi/
Https://github.com/jextop/StarterAdmin
l 功能模块
Web服务脚手架基于SpringBoot开发,前后端动静分离架构,提供REST接口和WebAdmin管理后台,分布式异步任务调度,集成缓存、消息队列、ELK日志处理和服务监控系统,采用Docker容器部署,支持集群扩展,可满足多种业务场景的扩展定制开发。
n WebAdmin管理后台
技术栈:JavaScript, Umi, React, AntDesign Pro
n API接口服务
技术栈:Java, SpringBoot, Flyway, MySQL, MyBatis, Redis, ActiveMQ, Quartz
n 业务处理服务
从中台接收业务请求,异步处理业务逻辑,处理结束后发送通知消息。
技术栈:Python,Django,Celery, Redis, ActiveMQ
l 时序图
二,docker-compose一键部署开发环境
l 开发运行环境
l 配置文件和辅助脚本:StarterApi
├── docker-compose.yml
├── pull.sh
├── up.sh
├── logs.sh
├── down.sh
l docker-compose.yml配置开发环境的容器实例:数据库、缓存、消息队列、ELK日志和服务监控系统。
db_admin需要连接MySQL,logstash和kibana需要连接elasticsearch,所以设置了depends_on属性。
logstash和kibana在基础镜像上增加配置文件,生成镜像托管在阿里云:
https://github.com/rickding/HelloDocker/tree/master/logstash
https://github.com/rickding/HelloDocker/tree/master/kibana
version: '3'
services:
db:
hostname: db
image: mysql:5
command: --default-authentication-plugin=mysql_native_password
ports:
- 3306:3306
environment:
MYSQL_DATABASE: starter
MYSQL_ROOT_PASSWORD: root
db_admin:
image: adminer:latest
ports:
- 3006:8080
depends_on:
- db
cache:
hostname: cache
image: redis:4
command: redis-server --appendonly yes
ports:
- 6379:6379
mq:
hostname: mq
image: webcenter/activemq:latest
ports:
- 61616:61616
- 8161:8161
elasticsearch:
hostname: elasticsearch
image: elasticsearch:latest
ports:
- 9200:9200
- 9300:9300
log:
hostname: log
image: registry.cn-shanghai.aliyuncs.com/hellodock/logstash:latest
ports:
- 9600:9600
- 9601:9601
depends_on:
- elasticsearch
kibana:
image: registry.cn-shanghai.aliyuncs.com/hellodock/kibana:latest
ports:
- 5601:5601
depends_on:
- elasticsearch
l 运行./pull.sh拉取镜像
可直接运行docker pull mysql:5拉取镜像,运行docker images查看已下载镜像:
l 运行./up.sh启动容器
脚本中封装了docker-compose up -d命令,启动后运行docker ps查看容器实例:
l 运行./logs.sh查看日志
定制命令突出显示重要信息:
docker-compose logs -ft | grep --color -i -e error -e warn -e version -e exception
l 运行./down.sh停止服务
docker-compose down --remove-orphans停止并删除容器:
l 查看服务
使用docker-compose一键部署开发环境MySQL+Redis+ActiveMQ+ELK,就是这么简单任性。
db_admin | |
ActiveMQ | | elasticsearch | |
logstsh | | kibana | |
三,Dockerfile配置是构建Docker镜像的核心
Dockerfile镜像描述文件,包含了一条条的指令,每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。Dockerfile基本结构:
- 基础镜像
- 维护者信息
- 镜像构建指令
- 容器启动时执行指令
FROM openjdk:8
LABEL maintainer="Jext Community, https://github.com/jextop"
# copy files
COPY ./deploy/ /deploy
WORKDIR /deploy
# do sth
CMD ["sh", "launch.sh"]
EXPOSE 8011
构建API服务Docker镜像:StarterApi
├── Dockerfile
├── Dockerfile_ce
- Dockerfile_ce,称为社区版,依赖本地开发环境,将编译好的项目运行文件打包进Docker镜像,多用于本地开发测试。
- Dockerfile,从拉取源代码开始,编译生成项目运行文件,打包进Docker镜像,然后发布部署。Docker镜像自动构建系统基于Dockerfile全量构建。
问答:
l Dockerfile_ce和Dockerfile有什么区别?
构建镜像使用的项目运行文件来源不同。Dockerfile_ce多用于开发测试,打包使用本地开发环境编译生成的运行文件。Dockerfile从源代码编译出项目运行文件,不依赖本地环境,往往构建速度较慢,用于发布部署。
l Dockerfile中为什么使用RUN sh mvnw package?mvnw和mvn的区别是什么?
解决Maven版本和插件兼容性问题。mvnw全名MavenWrapper,是一个第三方提供的Maven插件,为SpringBoot项目提供一个独立的且指定版本的Maven,不影响全局版本和其他项目,在生成SpringBoot项目时已经自动安装。
SpringBoot项目下有两个文件mvnw和mvnw.cmd,还有一个.mvn目录下面有三个文件。
Spring-boot-project
├── .mvn
│ └── wrapper
│ ├── maven-wrapper.jar
│ └── maven-wrapper.properties
│ ├── MavenWrapperDownloader.java
├── mvnw
├── mvnw.cmd
四,阿里云+Git+Docker镜像自动构建系统
阿里云容器镜像服务提供Docker镜像仓库托管,配置项目代码Git仓库和构建规则,结合Dockerfile实现云端编译打包,不再需要常用的Jenkins构建服务器。
为master分支增加一个latest构建规则,依次配置选项:
- 类型:选择Branch
- 分支:选择master
- Dockerfile目录:/
- Dockerfile文件名:Dockerfile
- 镜像版本:latest
配置完成后,当有代码提交到Git仓库时,将自动触发构建。点击规则的”立即构建“可以手动触发,点击构建列表的”日志“查看过程信息。
五,docker-compose一键部署Web服务
API接口服务Docker镜像成功成功后,配置信息到docker-compose.yml中:
代码库StarterDeploy
├── docker-compose.yml
├── up.sh
├── logs.sh
# 省略文件中运行环境的容器配置,以下是自动构建系统生成的API服务Docker镜像
api:
hostname: api
image: registry.cn-shanghai.aliyuncs.com/jext/starter_api:latest
ports:
- 8011:8011
depends_on:
- db
- cache
- mq
- log
运行./up.sh部署任务,然后运行./logs.sh可看到SpringBoot开发的接口服务启动信息:
访问http://localhost:8011/chk看到服务自检信息:
六,Swarm集群部署Web服务
代码库:StarterDeploy
├── docker-compose.yml
├── deploy.sh
├── rm.sh
l docker-compose.yml增加deploy属性,replicas指定副本数量,placement指定docker节点:
deploy:
replicas: 1
placement:
constraints: [node.labels.group == api]
l 启动Swarm加入节点构建集群,首个节点自动成为管理员:docker swarm init
l 部署Web服务:执行脚本./deploy.sh或命令:docker stack deploy -c docker-compose.yml starter
l 查看Stack和服务:docker stack ls && docker service ls
l 停止删除服务:执行脚本./rm.sh或命令:docker stack rm starter
七,Docker容器编排、镜像服务和Git代码托管云服务的选择
搭建系统选择云服务时,重点关注系统部署运维、自动构建以及代码管理的集成效率和稳定性,比较了几大云服务商,信息整理出来分享,排名不分先后。信息更新日期2020年1月16日。
| 容器服务(资源编排) | 镜像服务 | 代码托管 |
阿里云 | 收取使用的计算资源费用 | 公测,免费,http://cr.console.aliyun.com/ | 每个用户可建立50个代码库,单库容量2G https://code.aliyun.com/ |
华为云 | 收费,购买套餐。 | 免费, https://cn-east-3-console.huaweicloud.com/swr | 0.11元/用户/小时,0.000442元/GB/小时 https://console.huaweicloud.com/devcloud/?region=cn-east-3#/codehub/list |
腾讯云 | 收取使用的计算资源费用 | 内测,需申请, https://cloud.tencent.com/product/tcr/ | 官网:预计20年1月开始收费,1元/人/天 https://console.cloud.tencent.com/coding |