06Docker-Compose和微服务部署

Docker-Compose

概述

Docker Compose通过一个单独的docker-compose.yml模板文件来定义一组相关联的应用容器,帮助我们实现多个相互关联的Docker容器的快速部署

  • 一般一个docker-compose.yml对应完整的项目,项目中的服务和中间件对应不同的容器
    在这里插入图片描述

Compose文件实质就是集成了多个docker run命令,只是语法变成通过指令定义集群中的每个容器运行时的参数信息

docker run 参数docker compose 指令说明
–namecontainer_name容器名称
-pports端口映射
-eenvironment环境变量
-vvolumes数据卷配置
–networknetworks网络
-d不需要指定, 默认就是后台运行运行方式
EXPOSE在微服务集群部署中,像MySQL和Reids等中间件仅仅是供给给集群内的服务使用的,所以不需要对外暴露端口暴露端口
在这里插入图片描述

安装DockerCompose

在Linux中使用命令去github下载DockerCompose安装包并修改文件权限(下载速度可能较慢),可以自己在浏览器中下载安装包上传到/usr/local/bin目录

# 安装
curl -L https://github.com/docker/compose/releases/download/1.23.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
# 修改文件权限
chmod +x /usr/local/bin/docker-compose
# 检测docker-compose是否安装成功
docker-compose

设置DockerCompose自动补全功能,如果出现错误Failed connect to raw.githubusercontent.com:443; Connection refused就修改hosts文件

# 自动补全的命令
curl -L https://raw.githubusercontent.com/docker/compose/1.29.1/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose
# 出现错误后需要修改自己的hosts文件(重启一下网络systemctl start network),再配置自动补全的命令
echo "199.232.68.133 raw.githubusercontent.com" >> /etc/hosts
# 如出现TCP connection reset by peer错误需要重复发起命令多试几次

DockerCompose命令

docker compose [OPTIONS] [COMMAND]: OPTIONS和COMMAND都是可选参数,常见命令参考官方文档

类型参数或指令说明
Options-f指定compose文件的路径和名称,如果文件在当前目录且名称为docker-compose.yml则不用指定
-p指定project名称, project就是当前compose文件中设置的多个service的集合
Commandsup创建并启动所有service容器
down停止并移除所有容器、网络
ps列出所有启动的容器
logs查看指定容器的日志
stop停止容器
start启动容器
restart重启容器
top查看运行的进程
exec在指定的运行中容器中执行命令

部署微服务集群

单体项目部署

基于docker-compose.yml文件一键部署项目

# 1.进入root目录
cd /root

# 2.删除旧容器
docker rm -f $(docker ps -qa)

# 3.删除hmall镜像
docker rmi hmall

# 4.清空MySQL数据
rm -rf mysql/data

# 5.启动所有, -d参数是后台启动
docker compose up -d
# 结果:
[+] Building 15.5s (8/8) FINISHED
 => [internal] load build definition from Dockerfile                                    0.0s
 => => transferring dockerfile: 358B                                                    0.0s
 => [internal] load .dockerignore                                                       0.0s
 => => transferring context: 2B                                                         0.0s
 => [internal] load metadata for docker.io/library/openjdk:11.0-jre-buster             15.4s
 => [1/3] FROM docker.io/library/openjdk:11.0-jre-buster@sha256:3546a17e6fb4ff4fa681c3  0.0s
 => [internal] load build context                                                       0.0s
 => => transferring context: 98B                                                        0.0s
 => CACHED [2/3] RUN ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo   0.0s
 => CACHED [3/3] COPY hm-service.jar /app.jar                                           0.0s
 => exporting to image                                                                  0.0s
 => => exporting layers                                                                 0.0s
 => => writing image sha256:32eebee16acde22550232f2eb80c69d2ce813ed099640e4cfed2193f71  0.0s
 => => naming to docker.io/library/root-hmall                                           0.0s
[+] Running 4/4
 ✔ Network hmall    Created                                                             0.2s
 ✔ Container mysql  Started                                                             0.5s
 ✔ Container hmall  Started                                                             0.9s
 ✔ Container nginx  Started                                                             1.5s

# 6.查看镜像
docker compose images
# 结果
CONTAINER           REPOSITORY          TAG                 IMAGE ID            SIZE
hmall               root-hmall          latest              32eebee16acd        362MB
mysql               mysql               latest              3218b38490ce        516MB
nginx               nginx               latest              605c77e624dd        141MB

# 7.查看容器
docker compose ps
# 结果
NAME                IMAGE               COMMAND                  SERVICE             CREATED             STATUS              PORTS
hmall               root-hmall          "java -jar /app.jar"     hmall               54 seconds ago      Up 52 seconds       0.0.0.0:8080->8080/tcp, :::8080->8080/tcp
mysql               mysql               "docker-entrypoint.s…"   mysql               54 seconds ago      Up 53 seconds       0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp
nginx               nginx               "/docker-entrypoint.…"   nginx               54 seconds ago      Up 52 seconds       80/tcp, 0.0.0.0:18080-18081->18080-18081/tcp, :::18080-18081->18080-18081/tcp

定义docker-compose.yml文件指定要创建的容器

version: "3.8"

services:
  mysql: # 创建mysql容器的参数信息
    image: mysql# 镜像名称
    container_name: mysql# 容器名称
    ports:# 端口映射
      - "3306:3306"
    environment:# 环境变量
      TZ: Asia/Shanghai
      MYSQL_ROOT_PASSWORD: 123
    volumes:# 数据卷挂载
      - "./mysql/conf:/etc/mysql/conf.d"
      - "./mysql/data:/var/lib/mysql"
      - "./mysql/init:/docker-entrypoint-initdb.d"
    networks:
      - hm-net
  hmall: # 创建Java应用容器的参数信息
    build: # 基于Dockerfile文件构建自定义镜像
       context: .
       dockerfile: Dockerfile
    container_name: hmall
    ports:
      - "8080:8080"
    networks:
      - hm-net
    depends_on: # 依赖容器,创建容器时会先创建依赖的容器
      - mysql
  nginx:
    image: nginx
    container_name: nginx
    ports:
      - "18080:18080"
      - "18081:18081"
    volumes:
      - "./nginx/nginx.conf:/etc/nginx/nginx.conf"
      - "./nginx/html:/etc/nginx/html"
    depends_on:
      - hmall # 前端依赖后端
    networks:
      - hm-net
networks: # 需要创建的网络
  hm-net:
    name: hmall

微服务部署步骤

第一步: 在cloud-demo项目中编写docker-compose文件构建镜像并运行容器

version: "3.2"
services:
  nacos: # 注册中心和配置中心
    image: nacos/nacos-server # 基于nacos/nacos-server镜像构建
    environment: # 环境变量
      MDOE: standalone # 单点模式启动
    ports: # 端口映射,暴露了8848端口
      - "8848:8848"
    mysql:
      image: mysql:5.7.25 # 基于5.7.25版本的MySQL镜像构建
      environment:
        MYSQL_ROOT_PASSWORD: 123456 # 设置数据库root账户的密码
      volumes: # 数据卷挂载,这里挂载了mysql的data和conf目录
        - "$PWD/mysql/data:/var/lib/mysql"  # $PWD用于获取当前文件所在的目录
        - "$PWD/mysql/conf:/etc/mysql/conf.d"
    # 微服务不需要暴露端口,如果暴露了端口网关的身份认证和权限校验就形同虚设了
    userservice: # 基于Dockerfile文件临时构建
      build: ./user-service 
    orderservice: # 基于Dockerfile文件临时构建
      build: ./order-service
    # 网关需要暴露端口,它是其他微服务的入口
    gateway: # 基于Dockerfile文件临时构建
      build: ./gateway
      ports:
        - "10010:10010"

第二步: 使用Docker Compose部署时, 所有的服务之间都可以用服务名互相访问,那么就可以修改cloud-demo项目中所有服务的yml配置文件

  • 将数据库,nacos地址URL中的localhost重命名为docker-compose中的服务名
spring:
  cloud:
    nacos:
      # server-addr: localhost:80 #Nacos地址
      server-addr: nacos:8848 # 使用compose中的服务名来互相访问,用nacos替换localhost
      config:
        file-extension: yaml # 文件后缀名

第三步: 使用maven打包工具, 在每一个服务的pom.xml文件指定将微服务打包为app.jar(打包名需要与Dockerfile文件中一致)

<build>
    <!--指定服务打包的最终名称-->
    <finalName>app</finalName>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

第四步: 将打包好的app.jar和Dockerfile构建镜像文件拷贝到cloud-demo目录中对应的gateway, order-service, user-service子目录中

FROM openjdk:8
COPY ./app.jar /tmp/app.jar
ENTERPOINT java -jar /tmp/app.jar

第五步: 将cloud-demo项目文件夹上传至虚拟机得到最终的目录结构

cloud-demo
- gateway
  - app.jar
  - Dockerfile.yml
- order-service
  - app.jar
  - Dockerfile.yml
- user-service
  - app.jar
  - Dockerfile.yml
- mysql
  - data
  - conf
- docker-compose.yml

第六步: 执行docker-compose up -d命令部署项目,docker-compose logs -f查看日志

  • nacos连接失败是由于nacos启动较慢,userservice在nacos之前启动会导致userservice注册失败
# 后台创建镜像部署容器
docker-compose up -d

# 查看日志发现阿里巴巴nacos连接失败
docker-compose logs -f
com.alibaba.nacos.api.exception.NacosException: failed to req API:/nacos/v1/ns/instance/list after all servers([nacos:8848]) tried: java.net.ConnectException: Connection refused (Connection refused)

# 建议nacos单独先启动其他服务后启动,此时可以重启gateway userservice orderservice服务
docker-compose restart gateway userservice orderserivce 

# 再次查看查看userservice启动日志
docker-compose logs -f userservice

第七步: 打开浏览器访问http://虚拟机IP地址/user/1?authorization=admin查看数据
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/683678.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【CMake系列】05-静态库与动态库编译

在各种项目类型中&#xff0c;可能我们的项目就是一个 库 项目&#xff0c;向其他人提供 我们开发好的 库 (windows下的 dll /lib &#xff1b; linux下的 .a / .so)&#xff1b;有时候在一个项目中&#xff0c;我们对部分功能 打包成 库&#xff0c;方便在不同地方进行调用 静…

idea 常用插件推荐

文章目录 1、Lombok2、Convert YAML and Properties File3、Grep Console4、MyBatisX5、Free MyBatis Tool6、MyBatis Log EasyPlus &#xff08;SQL拼接&#xff09;7、MyBatisPlus8、Eclipse theme9、Eclipse Plus Theme10、Rainbow Brackets Lite - Free and OpenSource&…

MongoDB CRUD操作:地理位置应用——通过地理空间查询查找餐厅

MongoDB CRUD操作&#xff1a;地理位置应用——通过地理空间查询查找餐厅 文章目录 MongoDB CRUD操作&#xff1a;地理位置应用——通过地理空间查询查找餐厅地图的扭曲搜索餐厅浏览数据查找当前邻居查找附近所有餐厅查找一定距离内的餐厅使用$geoWithin&#xff0c;不排序使用…

上位机图像处理和嵌入式模块部署(f407 mcu中tf卡模拟u盘)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 在f407开发板上面&#xff0c;本身是有一个usb接口的。这个usb接口也不仅仅是作为电源使用的&#xff0c;它还可以用来做很多的事情。一方面&#…

学Python,看一篇就够

学Python&#xff0c;看一篇就够 python基础注释变量标识符命名规则使用变量认识bugDebug工具打断点 数据类型输出转义字符输入输入语法输入的特点 转换数据类型pycharm交互运算符的分类赋值运算符复合赋值运算符比较运算符逻辑运算符拓展 条件语句单分支语法多分支语法拓展 if…

React中实现大模型的打字机效果

React 想实现一个打字机的效果&#xff0c;类似千问、Kimi 返回的效果。调用大模型时&#xff0c;模型的回答通常是流式输出的&#xff0c;如果等到模型所有的回答全部完成之后再展示给最终用户&#xff0c;交互效果不好&#xff0c;因为模型计算推理时间比较长。本文将采用原生…

Java1.8全套家政上门服务+springboot+ mysql +Thymeleaf 技术架构开发,家政APP系统在线派单,师傅入驻全套商业源码

Java1.8全套家政上门服务springboot mysql Thymeleaf 技术架构开发&#xff0c;家政APP系统在线派单&#xff0c;师傅入驻全套商业源码 家政预约上门小程序的实用性&#xff1f; 家政预约上门小程序的实用性主要体现在以下几个方面&#xff1a; 一、方便快捷的预约体验&#…

运行编译openjdk12-33

编译环境 ubuntu20 Ubuntu里用户可以自行选择安装GCC或CLang来进行编译&#xff0c;但必须确保最低的版本为GCC 4.8或者CLang 3.2以上&#xff0c;官方推荐使用GCC 7.8或者CLang 9.1来完成编译。 源码 https://github.com/openjdk/jdk/tree/jdk-12%2B33 安装gcc sudo apt…

气膜羽毛球馆如何提升运动体验—轻空间

随着人们对健康和运动的关注度日益增加&#xff0c;羽毛球作为一项受欢迎的运动&#xff0c;得到了越来越多人的喜爱。而气膜羽毛球馆&#xff0c;以其独特的优势&#xff0c;正在改变传统羽毛球馆的运动体验。那么&#xff0c;气膜羽毛球馆是如何提升运动体验的呢&#xff1f;…

白酒:全球化背景下产地白酒的国际竞争与合作

在全球化背景下&#xff0c;云仓酒庄豪迈白酒作为中国白酒的品牌之一&#xff0c;面临着国际竞争与合作的机遇与挑战。国际市场竞争的激烈以及消费者需求的多样化&#xff0c;要求云仓酒庄豪迈白酒不断提升品质、拓展市场以及加强国际合作&#xff0c;以提升品牌竞争力和市场份…

深度学习Day-19:DenseNet算法实战与解析

&#x1f368; 本文为&#xff1a;[&#x1f517;365天深度学习训练营] 中的学习记录博客 &#x1f356; 原作者&#xff1a;[K同学啊 | 接辅导、项目定制] 要求&#xff1a; 根据 Pytorch 代码&#xff0c;编写出 TensorFlow 代码研究 DenseNet 与 ResNetV 的区别改进思路是…

SBOM是如何帮助医疗器械制造商提高产品透明度的?

SBOM&#xff08;软件物料清单&#xff09;通过以下方式帮助医疗器械制造商提高产品透明度&#xff1a; 1. 详细记录软件组成 SBOM详细列出了医疗器械所使用的所有软件组件、版本、作者、许可证信息等。这使得制造商能够清晰地了解产品的软件组成&#xff0c;包括每个组件的来…

Plotly的魔力:如何用Python创建令人惊叹的图表?

大家好&#xff0c;在数据分析和可视化领域&#xff0c;图表是不可或缺的工具。它们可以帮助我们更直观地理解数据趋势和模式。今天&#xff0c;我们要介绍的是一个强大的Python库——Plotly&#xff0c;它可以让你轻松创建交互式、漂亮的图表。无论你是数据科学家、分析师&…

C++学习/复习12--vector的实现(三个基本成员函数/迭代器/扩容/插入删除/重载/测试/杨辉三角)

一、构造函数 1.匿名对象与构造函数 在C中&#xff0c;匿名对象是一个临时对象&#xff0c;它没有名称&#xff0c;通常在对象创建后&#xff0c;只使用一次后就被销毁。创建匿名对象的方式是在创建对象时不使用变量名。 下面是创建匿名对象的几种方式&#xff1a; 直接使用…

【Linux】(二)—— 用户和用户组管理

在了解了Linux基础命令格式后&#xff0c;今天我要介绍的是Linux的用户管理 目录 root用户用户管理操作用户ID切换用户查看用户添加用户指定密码修改用户信息删除用户退出登录查看登陆系统的用户 用户组的管理增加新用户组查看用户组删除用户组修改用户组切换用户组 与用户有关…

GAMES101笔记

Games101 文章目录 Games101一、Review of Linear Algebra 线性代数向量向量点乘&#xff1a;判断同向反向、接近程度点乘基本属性点乘坐标系运算向量投影向量叉乘&#xff1a;判定左右、判定内外叉乘基本属性&#xff08;右手坐标系&#xff09;&#xff1a;不满足交换律叉乘坐…

CSS函数:fit-content与matrix的使用

网格函数 fit-content()属于网格函数&#xff0c;除此之外的网格函数还有&#xff1a;CSS函数&#xff1a; 实现数据限阈的数字函数。顾名思义&#xff0c;这三个函数只能在网格布局中使用。fit-content()函数主要是用于给定布局可用大小&#xff0c;适应内容&#xff0c;其功…

【数据结构】排序(直接插入、折半插入、希尔排序、快排、冒泡、选择、堆排序、归并排序、基数排序)

目录 排序一、插入排序1.直接插入排序2.折半插入排序3.希尔排序 二、交换排序1.快速排序2.冒泡排序 三、选择排序1. 简单选择排序2. 堆排序3. 树排序 四、归并排序(2-路归并排序)五、基数排序1. 桶排序&#xff08;适合元素关键字值集合并不大&#xff09;2. 基数排序基数排序的…

十六、【源码】plugins插件

源码地址&#xff1a;https://github.com/mybatis/mybatis-3/ 仓库地址&#xff1a;https://gitcode.net/qq_42665745/mybatis/-/tree/16-plugin plugins插件 plugins功能分为两部分 1.首先是在xml解析时解析出配置的插件类&#xff0c;并实例化放入拦截器链中 2.其次执行…

量化投资分析平台 迅投 QMT(四)获取标的期权的代码

量化投资分析平台 迅投 QMT [迅投 QMT](https://www.xuntou.net/?user_code7NYs7O)我目前在使用有了底层标的如何获取期权的交易代码呢&#xff1f;上代码历史帖子 迅投 QMT 我目前在使用 两个月前&#xff08;2024年4月&#xff09;迅投和CQF有一个互动的活动&#xff0c;进…