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

Docker最佳实践进阶(二):Docker Compose容器编排

   大家好,在上篇文章中博主演示了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相关的教程,以实现自动化的构建与部署项目,教程制作不易,如果对你有帮助,可以一键三连,多多分享哦。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • conda 常见使用命令详解
  • 单例模式下的自动内存释放和模板
  • 【C++初阶】:C++入门篇(一)
  • 计算机网络 —— 物理层
  • 了解Android
  • WPF 中,ControlTemplate 和 DataTemplate 是两种不同类型的模板和区别
  • 网络工程师学习笔记(一)
  • Unity Pro安装教程
  • Debezium系列之:记录一次SQLServer数据库数据不采集,恢复采集造成下游承压的情况,以及相对应的详细解决方案
  • USART————单字节串口的发送和发送接收
  • STM32——I2C和SPI波形分析
  • uniapp中节点信息的使用
  • 使用Dynamic Provision的PV需要Kubernetes集群管理员和用户分别做什么?
  • 3个常用zip压缩包文件打来密码删除方法
  • linux中cd的命令
  • exif信息对照
  • GitUp, 你不可错过的秀外慧中的git工具
  • java小心机(3)| 浅析finalize()
  • NSTimer学习笔记
  • Spring技术内幕笔记(2):Spring MVC 与 Web
  • Spring声明式事务管理之一:五大属性分析
  • thinkphp5.1 easywechat4 微信第三方开放平台
  • vue2.0开发聊天程序(四) 完整体验一次Vue开发(下)
  • 笨办法学C 练习34:动态数组
  • 从0搭建SpringBoot的HelloWorld -- Java版本
  • 浏览器缓存机制分析
  • 前端每日实战:61# 视频演示如何用纯 CSS 创作一只咖啡壶
  • 融云开发漫谈:你是否了解Go语言并发编程的第一要义?
  • 吐槽Javascript系列二:数组中的splice和slice方法
  • 我看到的前端
  • 格斗健身潮牌24KiCK获近千万Pre-A轮融资,用户留存高达9个月 ...
  • ​你们这样子,耽误我的工作进度怎么办?
  • # Java NIO(一)FileChannel
  • # 移动硬盘误操作制作为启动盘数据恢复问题
  • #### golang中【堆】的使用及底层 ####
  • (笔试题)分解质因式
  • (编程语言界的丐帮 C#).NET MD5 HASH 哈希 加密 与JAVA 互通
  • (附源码)apringboot计算机专业大学生就业指南 毕业设计061355
  • (三)Pytorch快速搭建卷积神经网络模型实现手写数字识别(代码+详细注解)
  • (使用vite搭建vue3项目(vite + vue3 + vue router + pinia + element plus))
  • (原創) 博客園正式支援VHDL語法著色功能 (SOC) (VHDL)
  • (转) SpringBoot:使用spring-boot-devtools进行热部署以及不生效的问题解决
  • (转)项目管理杂谈-我所期望的新人
  • .mat 文件的加载与创建 矩阵变图像? ∈ Matlab 使用笔记
  • .NET C#版本和.NET版本以及VS版本的对应关系
  • .NET Framework 3.5安装教程
  • .NET Framework 和 .NET Core 在默认情况下垃圾回收(GC)机制的不同(局部变量部分)
  • .NET 的静态构造函数是否线程安全?答案是肯定的!
  • .Net通用分页类(存储过程分页版,可以选择页码的显示样式,且有中英选择)
  • .net通用权限框架B/S (三)--MODEL层(2)
  • .pyc文件还原.py文件_Python什么情况下会生成pyc文件?
  • @Import注解详解
  • @kafkalistener消费不到消息_消息队列对战之RabbitMq 大战 kafka
  • @Mapper作用
  • @软考考生,这份软考高分攻略你须知道