当前位置: 首页 > news >正文

Docker最佳实践进阶(二):Docker Compose部署SpringCloud微服务项目

   大家好,在上篇文章中博主演示了Dockerfile常用的命令,以及如何利用Dockerfile构建镜像,生成容器服务,但是在实际应用环境中,特别是在微服务架构中,一个应用系统可能包含多个微服务,每个微服务可能需要部署多个实例。手动操作每个微服务不仅低效,还需要大量维护工作。此外,多个容器之间可能存在依赖关系,需要按照指定顺序启动。手动维护这些容器变得复杂、繁琐且容易出错。
为解决这些问题,Docker Compose应运而生。它是一个强大的工具,用于管理和编排多个容器。通过Docker Compose,我们可以轻松部署和管理复杂的应用系统,提高效率并降低出错的风险,下面为大家演示一下如何使用Docker Compose部署多个服务吧。

一:Docker Compose简介、安装

1.1 简介

Docker Compose 是 Docker 公司推出的一个工具,用于简化多容器应用程序的定义、运行和管理。通过一个 YAML 配置文件(通常是 docker-compose.yml),用户可以定义应用程序的各种服务、网络和卷,并通过一条命令就可以启动、停止一组相关联的多个容器。

1.2 安装

在 Docker 旧版本中,Docker Compose 要另外安装,现在的Docker中已经默认集成了Docker Compose。
使用 docker compse version 命令可以查看到版本信息:
在这里插入图片描述

旧版本安装:

# 下载最新版本的 Docker Compose:
sudo curl -L "https://github.com/docker/compose/releases/download/v2.5.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose  
#给与可执行权限
sudo chmod +x /usr/local/bin/docker-compose
#验证安装
docker-compose --version

二:使用Docker Compose构建,部署多镜像、服务

2.1 编写项目的Dockerfile

kingoffice-auth项目:Dockerfile文件、注意部署的jar和对应的Dockerfile文件需要在一个目录下,博主安装在/kim/project/auth目录下。

# 使用官方Java运行环境作为基础镜像
FROM openjdk:8-jre# 设置容器内jar工作目录
WORKDIR /kim# 暴露9200端口
EXPOSE 9200# 设置时区
ENV TZ=Asia/Shanghai# 将你的jar包添加到容器中
ADD kingoffice-auth.jar /kim/kingoffice-auth.jar# 声明日志卷,容器内应用生成的日志将被存储在这个位置
VOLUME /kim/logs# 设置容器启动时执行的命令
ENTRYPOINT ["java", "-jar", "/kim/kingoffice-auth.jar"]

kingoffice-system:Dockerfile文件、注意部署的jar和对应的Dockerfile文件需要在一个目录下,博主安装在/kim/project/system目录下。

# 使用官方Java运行环境作为基础镜像
FROM  openjdk:8-jre# 设置容器内jar工作目录
WORKDIR /kim# 暴露9201端口
EXPOSE 9201# 设置环境变量来指定时区
ENV TZ=Asia/Shanghai# 将你的jar包添加到容器中
ADD kingoffice-modules-system.jar /kim/kingoffice-modules-system.jar# 声明日志卷,容器内应用生成的日志将被存储在这个位置
VOLUME /kim/logs# 设置容器启动时执行的命令
ENTRYPOINT ["java", "-jar", "/kim/kingoffice-modules-system.jar"]
2.2 编写docker-compose.yaml

此配置 部署了三个项目服务,还有一个gateway博主未贴出,Dockerfile文件和auth服务的差别不大.
另外博主system服务的启动依赖于auth、gateway服务的启动,如果同学有用到此配置,请将关于gateway服务的配置补齐或者删除。

version: '3.8'
services:kingoffice-auth:build:context: /kim/project/authdockerfile: Dockerfileimage: kim-authcontainer_name: kingoffice-authports:- "9200:9200"volumes:- /kim/logs/auth:/kim/logsenvironment:- TZ=Asia/Shanghairestart: alwayskingoffice-gateway:build:context: /kim/project/gatewaydockerfile: Dockerfileimage: kim-gatewaycontainer_name: kingoffice-gatewayports:- "9100:9100"volumes:- /kim/logs/gateway:/kim/logsenvironment:- TZ=Asia/Shanghairestart: alwayskingoffice-system:build:context: /kim/project/systemdockerfile: Dockerfileimage: kim-systemcontainer_name: kingoffice-modules-systemports:- "9201:9201"volumes:- /kim/logs/system:/kim/logsenvironment:- TZ=Asia/Shanghairestart: alwaysdepends_on:- kingoffice-auth- kingoffice-gateway

注意:context: /kim/project/system 这里指向对应jar的Dockerfile文件的所在目录。

2.3 运行docker-compose 访问项目

docker-compose.yaml 文件编写好了,把文件上传到宿主机上,然后在终端进入到 docker-compose.yaml 文件所在目录,然后执行如下命令,检查一下配置有没有问题:

# 检查docker-compose.yaml有没有问题
docker compose config# 或者,检查docker-compose.yaml有没有问题,有问题才会输出内容
docker compose config -q

如果没有问题,就可以运行命令启动容器了:

docker compose up -d
  • up:表示启动。
  • -d:表示后台运行。
    启动后,会自动下载镜像和通过 Dockerfile 自动构建镜像,并启动服务:
    在这里插入图片描述启动服务后,可以使用如下命令,查看启动的服务:
    在这里插入图片描述
# 显示docker compose 编排的所有正在运行的容器
docker compose ps

运行容器完成,就可以访问到项目的接口了,开发同学可自行使用api工具调用接口测试。

三:Docker Compose常用命令

Docker 的基本使用上面已经讲解了,下面介绍一下其他的常用命令,需要的直接查询即可:
下面除了帮助命令,其他命令都需要在 docker-compose.yaml 所在目录下执行。

3.1 查看帮助
docker compose -h
  • 会列出 docker compose 所有的命令。
3.2 启动
# 启动
docker compose up# 后台启动
docker compose up -d
  • 启动并运行 Compose 文件中定义的所有服务。
  • 使用 -d 参数在后台运行服务。
  • 如果服务容器不存在,docker compose up 会创建它们。如果容器已经存在,但配置或镜像已更改,它会停止并重新创建容器,所以这个命令多次运行也不会存在问题,每次都会删除重新创建。
3.3 检查Compose文件
# 检查docker-compose.yaml有没有问题
docker compose config# 检查docker-compose.yaml有没有问题,有问题才会输出内容
docker compose config -q
  • 验证 Compose 文件的配置是否正确。
3.4 停止并删除
# 停止
docker compose down
  • 停止并删除 Compose 文件中定义的所有服务。
  • 注意,会同时删除相关的容器、网络和卷。
3.5 停止
# 停止服务
docker compose stop# 停止docker-compose文件中定义的某一个容器服务
docker compose stop 容器服务名
  • 停止正在运行的服务。
  • 注意和 docker compose down 的区别,stop 只是停止,不会删除。
3.6 启动服务
# 启动已停止的容器
docker compose start# 启动docker-compose文件中定义的某一个容器服务
docker compose start 容器服务名		# 容器服务名指的是docker-compose.yaml中定义的容器服务名称
  • 启动已经存在但已停止的容器。它不会创建新的容器,也不会重新构建服务。
3.7 重启
# 重启
docker compose restart
# 重启docker-compose文件中定义的某一个容器服务
docker compose restart 容器服务名		# 容器服务名指的是docker-compose.yaml中定义的容器服务名称
  • 重启服务。
3.8 显示compose所有容器
# 显示docker compose 编排的所有正在运行的容器
docker compose ps# 显示docker compose 编排的所有容器
docker compose ps -a
  • 显示当前 docker compose 编排的容器。
3.9 MySQL容器服务编写

这里示例一下 MySQL 容器的服务编写,需要的可以参考一下,启动之前需要准备 MySQL 的配置文件,和基础教程中 Docker 部署 MySQL。

docker-compose.yaml 的编写:

# 定义服务
services:mysql:image: mysql:5.7volumes:- /kim/mysql/conf:/etc/mysql/conf.d- /kim/mysql/log:/var/log/mysql- /kim/mysql/data:/var/lib/mysql- /etc/localtime:/etc/localtimeenvironment:MYSQL_ROOT_PASSWORD: 123456TZ: Asia/Shanghaiports:- 3306:3306restart: alwayscommand:--max_connections=1000--character-set-server=utf8mb4--collation-server=utf8mb4_general_ci--default-authentication-plugin=mysql_native_password # 解决外部无法访问

四:Docker拓展

4.1 限制容器资源

为了确保容器不会过度占用宿主机资源,限制CPU和内存的使用量是非常重要的。下面是关于限制CPU和内存资源的方法:

4.1.1 限制CPU资源
  1. 限制CPU核心数: 使用 --cpus 参数来限制容器可以使用的CPU核心数。

    docker run --cpus 2 my-image
    
  2. 限制使用指定的CPU: 使用 --cpuset-cpus 参数来指定容器可以使用的具体CPU核心。

    docker run -it --cpuset-cpus="0,2" my-image
    
  3. 设置控制相对的权重: 使用 --cpu-shares 参数来设置容器的CPU份额,这是一个相对值,默认为1024。

    docker run -it --cpu-shares=512 my-image
    
  4. 设置CPU周期和配额: 使用 --cpu-period--cpu-quota 参数来设置CPU周期和配额。

    docker run --cpu-period 100000 --cpu-quota 50000 my-image
    
4.1.2 限制内存使用
  1. 设置内存限制: 使用 -m--memory 标志来限制容器可以使用的内存量。

    docker run -it -m 512m my-image
    
  2. 设置内存和交换空间限制: 使用 --memory-swap 参数来限制容器的内存加交换空间总量。

    docker run -it -m 512m --memory-swap=1g my-image
    
  3. 组合使用: 可以组合以上限制方式,例如同时限制CPU、内存和交换空间:

    docker run -it --cpus="1.5" --memory="512m" --memory-swap="1g" my-image
    

通过以上方法,你可以有效地限制容器对宿主机资源的使用,确保系统稳定性。

4.2 docker可视化工具

Portainer是一个轻量级的容器管理器,它提供了一个直观和用户友好的图形界面,用于管理和监视Docker容器集群。通过Portainer的图形界面,用户可以快速地创建、启动、停止和重启容器,以及进行其他管理操作,从而提高了容器管理的效率。
Portainer 官网:https://www.portainer.io/ ,Portainer 分为商业版和社区版,我们用社区版就可以了。
安装的话可以直接查看官方的文档,Portainer 也是容器安装,所以很简单,直接执行命令。

docker run -d -p 8000:8000 -p 9443:9443 --name portainer --restart=always \ -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data \ portainer/portainer-ce:latest

通过这条命令,你可以在宿主机上运行Portainer容器,并通过端口8000和9443访问Portainer的Web界面。同时,容器会自动重启,并且会将Docker守护进程的socket文件和Portainer数据持久化存储。
安装完成后,你可以通过访问 http://<宿主机IP>:8000https://<宿主机IP>:9443 来访问Portainer的Web界面,并开始管理Docker容器。

4.3 Kubernetes

在探索容器技术和容器编排工具的旅程中,我们已经学习了 DockerDocker Compose 的基本概念和使用方法。现在,是时候转向更高级、更强大的容器管理技术——Kubernetes (K8s) 了。

🔹 Docker 是容器技术的核心和基础,提供了一个轻量级、可移植的环境来运行、分发和管理容器。 🔹 Docker Compose 则是建立在 Docker 之上的单主机容器编排工具。它允许用户通过一个简单的 YAML 文件定义一组相关联的应用容器作为一个项目,并通过一个命令(docker-compose up)启动整个应用。 🔹 而 Docker Swarm 是 Docker 公司提出的原生容器集群管理工具,用于将多个 Docker 主机组织成一个集群,实现容器的高可用性和负载均衡。这是 Docker Compose 无法实现的功能,因为 Docker Compose 只能管理当前主机上的 Docker 容器。

接下来谈谈 Kubernetes (K8s)

  • Kubernetes 和 Docker Swarm 定位相似,都是跨主机的容器管理平台。
  • Kubernetes 由谷歌根据多年运维经验研发,而 Docker Swarm 是由 Docker 公司推出。
  • Kubernetes 提供了更丰富的特性和强大的社区支持,已成为许多大公司默认使用的容器管理技术。
🚀 选择 Kubernetes 的理由:
  • 广泛采用: Kubernetes 已经成为业界标准,许多大型企业都在使用。
  • 社区支持: 拥有活跃的开源社区,提供大量资源和插件。
  • 强大功能: 提供服务发现、负载均衡、自动部署、滚动更新等高级功能。
🎯 结论:

虽然 Docker 和 Docker Compose 提供了强大的单主机容器管理能力,但在面对需要跨主机管理和高度可扩展性的场景时,Kubernetes 显然是更优选。鉴于其广泛的应用和社区支持,学习 Kubernetes 是一个明智的选择。

五:总结

   docker的学习到这里就告一段落了,接下来博主将带着大家完成jenkins相关的教程,以实现自动化的构建与部署项目,教程制作不易,如果对你有帮助,可以一键三连,多多分享哦。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • ansible环境搭建
  • 免费开源的AI绘画工具ComfyUI,让AI作画变得简单又快捷
  • EmguCV学习笔记 VB.Net和C# 下的OpenCv开发 C# 目录
  • 解决电脑突然断网没网,以太网无网络访问权限,本地连接时出错:地址仍未与网络终结点关联
  • 深入对比:Python pandas 与 Java Map 在数据处理中的应用
  • 其实你就学不会 Python
  • 算法日记day 42(动归之不相交的线|最大子数组和|判断子序列)
  • 机器学习——第十四章 概率图模型
  • 基于vllm部署大模型
  • <数据集>铝型材缺陷识别数据集<目标检测>
  • Comsol 宽频带超薄卷状超表面吸声器
  • 使用 Apache POI 的 DataFormatter 处理 Excel 数据
  • 《智能计算系统:从深度学习到大模型(第2版)》重磅上市!
  • 动态规划-打家劫舍、股票问题
  • Python——变量和字符串以及转义字符常见问题总结
  • 【RocksDB】TransactionDB源码分析
  • 5分钟即可掌握的前端高效利器:JavaScript 策略模式
  • CSS3 变换
  • ERLANG 网工修炼笔记 ---- UDP
  • IIS 10 PHP CGI 设置 PHP_INI_SCAN_DIR
  • iOS编译提示和导航提示
  • iOS筛选菜单、分段选择器、导航栏、悬浮窗、转场动画、启动视频等源码
  • JS 面试题总结
  • Laravel Telescope:优雅的应用调试工具
  • Python爬虫--- 1.3 BS4库的解析器
  • React16时代,该用什么姿势写 React ?
  • Redis在Web项目中的应用与实践
  • vue.js框架原理浅析
  • 如何进阶一名有竞争力的程序员?
  • 时间复杂度与空间复杂度分析
  • 使用docker-compose进行多节点部署
  • 视频flv转mp4最快的几种方法(就是不用格式工厂)
  • 看到一个关于网页设计的文章分享过来!大家看看!
  • ​​​​​​​开发面试“八股文”:助力还是阻力?
  • ​Distil-Whisper:比Whisper快6倍,体积小50%的语音识别模型
  • ​ssh免密码登录设置及问题总结
  • ‌JavaScript 数据类型转换
  • # Java NIO(一)FileChannel
  • #职场发展#其他
  • (01)ORB-SLAM2源码无死角解析-(56) 闭环线程→计算Sim3:理论推导(1)求解s,t
  • (02)Cartographer源码无死角解析-(03) 新数据运行与地图保存、加载地图启动仅定位模式
  • (70min)字节暑假实习二面(已挂)
  • (arch)linux 转换文件编码格式
  • (二)c52学习之旅-简单了解单片机
  • (二)WCF的Binding模型
  • (原)记一次CentOS7 磁盘空间大小异常的解决过程
  • (转)原始图像数据和PDF中的图像数据
  • .NET CLR基本术语
  • .net core 源码_ASP.NET Core之Identity源码学习
  • .NET MVC之AOP
  • .net 设置默认首页
  • .net 桌面开发 运行一阵子就自动关闭_聊城旋转门家用价格大约是多少,全自动旋转门,期待合作...
  • .net开源工作流引擎ccflow表单数据返回值Pop分组模式和表格模式对比
  • .NET开源全面方便的第三方登录组件集合 - MrHuo.OAuth
  • [12] 使用 CUDA 进行图像处理