docker分布式应用部署方案

经验分享 (225) 2023-09-16 10:57:09

目录

一. 简单的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
  • 通过配置文件,自动启动服务,并设置依赖关系。实现容器的批量编排。一键统一部署

 docker分布式应用部署方案 (https://mushiming.com/) 经验分享 第1张

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文件

docker分布式应用部署方案 (https://mushiming.com/) 经验分享 第2张

  • network:指定使用的网络

docker分布式应用部署方案 (https://mushiming.com/) 经验分享 第3张

  • command:编写命令

docker分布式应用部署方案 (https://mushiming.com/) 经验分享 第4张

  • container_name:指定容器的名字

docker分布式应用部署方案 (https://mushiming.com/) 经验分享 第5张

  • depends_on:指定启动依赖关系

docker分布式应用部署方案 (https://mushiming.com/) 经验分享 第6张

  • deploy:集群相关

  • environment:环境变量,例如设置mysql的密码

docker分布式应用部署方案 (https://mushiming.com/) 经验分享 第7张

4. 编写服务,测试compose

测试一个springboot和Redis集合使用的web应用

  • 创建一个新的springboot项目,设置Redis配置,创建一个controller测试接口:

docker分布式应用部署方案 (https://mushiming.com/) 经验分享 第8张

docker分布式应用部署方案 (https://mushiming.com/) 经验分享 第9张

  • 将该springboot项目打包,并编写Dockerfile文件:

docker分布式应用部署方案 (https://mushiming.com/) 经验分享 第10张

  • 将jar包和dockerfile上传至服务器,编写docker-compose.yml文件,

将springboot应用按照我们编写的dockerfile构建,将Redis按照镜像构建,并通过该配置文件编排后一起启动。

version: "3.8"
services:
  web:
    #寻找当前路径下的默认Dockerfile文件构建镜像
    build: .
    ports:
      - "8090:8090"
    #启动依赖Redis
    depends_on:
      - redis
  redis:
    #通过该镜像构建容器
    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负载均衡完成访问。实现服务的高可用。

 提供了集群的加入、离开命令

docker分布式应用部署方案 (https://mushiming.com/) 经验分享 第11张

1. 运行swarm集群

1.1 初始化init

首先在某台服务器初始化swarm,通过init命令

docker swarm init --advertise-addr 47.111.111.11

然后会返回一个带有token的join连接:并显示了当前node的信息,是作为一个manager。

docker分布式应用部署方案 (https://mushiming.com/) 经验分享 第12张

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 查看所有的服务

docker分布式应用部署方案 (https://mushiming.com/) 经验分享 第13张

service的操作:

可以通过rm移除、rollback回滚、logs查看日志、inspect查看元数据

 

 

 

+

 

 

 

 

 

THE END

上一篇

已是最后文章

发表回复