#IT明星不是梦#【1键部署神功】docker-compos
更新:HHH   时间:2023-1-7


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代码托管云服务的选择


一,系统架构

代码下载

https://github.com/jextop/StarterDeploy

https://github.com/jextop/StarterApi/

Https://github.com/jextop/StarterAdmin

功能模块

Web服务脚手架基于SpringBoot开发,前后端动静分离架构,提供REST接口和WebAdmin管理后台,分布式异步任务调度,集成缓存、消息队列、ELK日志处理和服务监控系统,采用Docker容器部署,支持集群扩展,可满足多种业务场景的扩展定制开发。

WebAdmin管理后台

技术栈:JavaScript, Umi, React, AntDesign Pro

API接口服务

技术栈:Java, SpringBoot, Flyway, MySQL, MyBatis, Redis, ActiveMQ, Quartz

业务处理服务

从中台接收业务请求,异步处理业务逻辑,处理结束后发送通知消息。

技术栈:Python,Django,Celery, Redis, ActiveMQ

时序图

二,docker-compose一键部署开发环境

开发运行环境

配置文件和辅助脚本:StarterApi

├── docker-compose.yml

├── pull.sh

├── up.sh

├── logs.sh

├── down.sh


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

运行./pull.sh拉取镜像

可直接运行docker pull mysql:5拉取镜像,运行docker images查看已下载镜像:

运行./up.sh启动容器

脚本中封装了docker-compose up -d命令,启动后运行docker ps查看容器实例:

运行./logs.sh查看日志

定制命令突出显示重要信息:

docker-compose logs -ft | grep --color -i -e error -e warn -e version -e exception

运行./down.sh停止服务

docker-compose down --remove-orphans停止并删除容器:

查看服务

使用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全量构建。


问答:

Dockerfile_ce和Dockerfile有什么区别?

构建镜像使用的项目运行文件来源不同。Dockerfile_ce多用于开发测试,打包使用本地开发环境编译生成的运行文件。Dockerfile从源代码编译出项目运行文件,不依赖本地环境,往往构建速度较慢,用于发布部署。


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

docker-compose.yml增加deploy属性,replicas指定副本数量,placement指定docker节点:

deploy:
    replicas: 1
     placement:
         constraints: [node.labels.group == api]

启动Swarm加入节点构建集群,首个节点自动成为管理员:docker swarm init

部署Web服务:执行脚本./deploy.sh或命令:docker stack deploy -c docker-compose.yml starter

查看Stack和服务:docker stack ls && docker service ls

停止删除服务:执行脚本./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


返回云计算教程...