浅谈微服务的自动化部署

一、常用部署工具

jenkins,docker生态是比较常用的工具,本文也主要是聊这几个。其他如Kubernetes (K8s),Ansible,GitLab CI/CD等工具本文只是暂时提一下,不展开讨论。

二、比较jenkins和docker生态

1、jenkins

优点

jenkins功能丰富,而且配置比较灵活。比如支持git,maven,gitee或github库,SSH。对于普通的javaweb项目的部署还是很方便的。

缺点

但是对于初学者来说,要学习的不少,配置的东西不少。

如果在服务器比较多的情况下,配置还是比较繁琐的。

适用场景

比较适合在联调或测试环境去用。

2、docker生态

注意,我这里用的是生态二字。docker生态的工具还是比较丰富的,比如docker, harbor,portainer, docker-compose,docker-swarm。

docker

docker优点:跨平台部署:屏蔽底层操作系统;提高部署效率和极大降低出错率:环境也能保存和复用,生产环境和测试环境镜像完全一样;为后续云部署提供了基础。

docker对于自动化部署的意义:有个好东西叫镜像,它可以把环境、安装程序、配置、文件资源都打包存储起来,放到镜像仓库,如私服harbor。那这样镜像就可以在多台节点的集群中复用,快速部署。而且镜像是分层继承的,这使得容器部署对于环境的复用和扩展就更加灵活。

可以通过dockerfile来制作镜像,示例如下。也可以基于容器制作镜像。

# 基于 openjdk:8-jre 为基础镜像进行构建
FROM java:8   
# 指定进入这个容器的目录。一般可放到公共的有权限的目录,比如/usr/local。看镜像的目录结构可以进入创建的容器之后去看。
WORKDIR /usr/local/demo3
# 将jar包放入/app目录下,并重新命名为app.jar
ADD demo-0.0.1-SNAPSHOT.jar app.jar
# 该项目使用的是8081端口,所有需要向外暴漏8081端口,日后才能通过映射的端口去访问这个暴漏的端口
EXPOSE 8081
# ENTRYPOINT 和 CMD 结合使用,ENTRYPOINT固定命令,CMD根据参数的不同 运行不同的jar包(动态参数)
ENTRYPOINT ["java","-jar"] 
CMD ["app.jar"]
# 相当于 java -jar xxx.jar

不建议频繁使用容器提交方式创建镜像,因为通过提交容器的方式,我们无法追溯详细的变更操作,这会导致镜像构建过程缺乏透明度和可重复性。

docker-compose

很适合中小型公司在单台机器上部署服务。配置灵活方便。配合portainer页面使用很好用,它在docker的镜像名是portainer/portainer,可用于管理docker栈、容器、镜像,还可以用于连接容器与容器进行交互,输入命令行。

docker-compose.yml示例如下

#compose版本
version: "3"  
 
#微服务项目	
services:
  portainer:
    #docker可视化界面  
    image: portainer/portainer:1.24.2
    container_name: portainer
    ports:
      - "9000:9000"
    #数据卷
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /docker/data/portainer:/data
    networks: 
      - network_test
  demo01:
    #微服务镜像  
    image: demo:1
    container_name: demo01
    ports:
      - "9080:9080"
    #数据卷
    # volumes:
    #   - /app/microService:/data
    networks: 
      - network_test 
    depends_on: 
      - nginx01
      - redis
      - mysql
  #redis服务
  nginx01:
    image: nginx:1.21.5
    container_name: nginx01
    ports:
      - "80:80"
    volumes:
      - /docker/data/nginx/conf/nginx.conf:/etc/nginx/nginx.conf
      - /docker/data/nginx/conf/conf.d:/etc/nginx/conf.d
      - /docker/data/nginx/log:/var/log/nginx
      - /docker/data/nginx/html:/etc/nginx/html
    networks: 
      - network_test
    restart: always
      
#redis服务
  redis:
    image: redis:6.0.8
    ports:
      - "6379:6379"
    volumes:
      - /docker/data/redis/redis.conf:/etc/redis/redis.conf
      - /docker/data/redis/data:/data
    networks: 
      - network_test
    command: redis-server /etc/redis/redis.conf
 
 #mysql服务
  mysql:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: '123456'
      MYSQL_ALLOW_EMPTY_PASSWORD: 'no'
      MYSQL_DATABASE: 'db2024'
      MYSQL_USER: 'test'
      MYSQL_PASSWORD: 'test1234'
    ports:
       - "3306:3306"
    volumes:
       - /docker/data/mysql/db:/var/lib/mysql
       - /docker/data/mysql/conf/my.cnf:/etc/my.cnf
       - /docker/data/mysql/init:/docker-entrypoint-initdb.d
    networks:
      - network_test
    command: --default-authentication-plugin=mysql_native_password #解决外部无法访问
 
#创建自定义网络
networks: 
   network_test: 

docker-swarm

一个类似于k8s的云原生集群部署工具。支持容器编排、自动扩缩容、自我故障恢复等等,相当强大,虽然支持的节点有上限,但除了一线互联网公司的业务规模,需求上中小型公司基本都能满足了。

优点

尤其docker-compose和docker-swarm很适合服务多的时候使用,部署效率高。

缺点

镜像的制作比较麻烦,比如编写dockerfile制作,很容易语法出错,学习成本较高。

镜像库需要额外配置,通过harbor搭建私库,或者通过国内公共镜像库。但是公共镜像库要么有网速问题,要么有镜像版本比较老的问题。

镜像中不适合放太多东西,不然镜像就会很大。比如把git拉取代码,maven构筑放进去,那么代码和依赖的仓库都很大,所以只适合放环境、环境参数、安装程序和其他比较轻量的东西。

docker-compose使用比较局限,只能单机。集群架构要配合docker-swarm一起用。

适用场景

可能比较适合服务节点比较多的生产环境

三、使用感想

总结,jenkins用war包形式运行很方便,而且使用jenkins通过git拉取代码和maven打包springboot微服务也很方便。

docker生态在集群管理,自动化扩容缩容,交付物和环境的复用等方面很牛。

我在想如果两者结合一下应该有不错的使用体验,比如通过jenkins打包,发布到其中一台或多台服务器,然后通过docker来发布镜像,容器的部署。还有,maven有集成docker镜像制作和发布的插件,可以通过maven命令进行镜像的发布,所以完全能这么干,我猜想很多公司也这么干了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值