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

news2025/1/12 6:47:06

   大家好,在上篇文章中博主演示了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/auth
      dockerfile: Dockerfile
    image: kim-auth
    container_name: kingoffice-auth
    ports:
      - "9200:9200"
    volumes:
      - /kim/logs/auth:/kim/logs
    environment:
      - TZ=Asia/Shanghai
    restart: always

  kingoffice-gateway:
    build:
      context: /kim/project/gateway
      dockerfile: Dockerfile
    image: kim-gateway
    container_name: kingoffice-gateway
    ports:
      - "9100:9100"
    volumes:
      - /kim/logs/gateway:/kim/logs
    environment:
      - TZ=Asia/Shanghai
    restart: always

  kingoffice-system:
    build:
      context: /kim/project/system
      dockerfile: Dockerfile
    image: kim-system
    container_name: kingoffice-modules-system
    ports:
      - "9201:9201"
    volumes:
      - /kim/logs/system:/kim/logs
    environment:
      - TZ=Asia/Shanghai
    restart: always
    depends_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.7
    volumes:
      - /kim/mysql/conf:/etc/mysql/conf.d
      - /kim/mysql/log:/var/log/mysql
      - /kim/mysql/data:/var/lib/mysql
      - /etc/localtime:/etc/localtime
    environment:
      MYSQL_ROOT_PASSWORD: 123456
      TZ: Asia/Shanghai
    ports:
      - 3306:3306
    restart: always
    command:
      --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相关的教程,以实现自动化的构建与部署项目,教程制作不易,如果对你有帮助,可以一键三连,多多分享哦。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

遇到的基本问题

遇到的基本问题 Linux常用操作 1、关闭防火墙、配置本地yum源、添加静态网卡 systemctl stop firewalld if [ getenforce "Enforcing" ];thensetenforce 0 fi sleep 3 echo "防火墙和selinux高级权限管理已关闭" ############ #添加静态网卡 #########…

配置访问权限|预防数据泄漏

IT行业正在以闪电般速度发展&#xff0c;而网络攻击也随之激增。在今年4月份的IT数据泄漏报告中&#xff0c;教育行业数据泄漏事件数量最多&#xff0c;其次是医疗保健行业、IT服务和软件行业。 为什么有许多数据泄漏事件&#xff1f; 通常是由于缺乏访问权限的认证&#xff0…

渗透实战——为喜欢的游戏“排忧解难”

本文仅用于技术研究学习&#xff0c;请遵守相关法律&#xff0c;禁止使用本文所提及的相关技术开展非法攻击行为&#xff0c;由于传播、利用本文所提供的信息而造成任何不良后果及损失&#xff0c;与本账号及作者无关。 资料查询来源- 安全社区与AI模型结合探索【文末申请免费…

了解数据库中常用存储引擎数据结构(4)

目录 深入了解LSM树及其发展 一条数据的整体写入过程 读操作&#xff08;Bloom Filter优化&#xff09; 合并策略&#xff08;Merging Policy&#xff09; LSM-Tree并发控制机制 一些Compaction优化方案 深入了解LSM树及其发展 LSM Tree 的概念起源于 1996年的论文《The…

【网络工程师模拟面试题】(2)OSPF区域划分与LSA细节

一、OSPF中心结点与周围200个路由器节点建立邻居&#xff0c;该如何划分区域&#xff0c;为什么&#xff1f; 这个问题其实没有标准答案&#xff0c;因为据OSPF RFC标准文档(RFC 2328 OSPF Version 2)来看&#xff0c;其中内容并没有规定OSPF单区域的邻居数量限制&#xff0c;…

【鸿蒙学习】HarmonyOS应用开发者基础 - 从网络获取数据

学完时间&#xff1a;2024年8月15日 一、前言叨叨 学习HarmonyOS的第七课&#xff0c;人数居然反超到了3735名了&#xff0c;难道前面的那一课&#xff0c;这么多人挂科了吗。不过这一节的内容稍微简单一些&#xff0c;都是网络相关知识。 <HarmonyOS第一课>从网络获取…

【Angular18】封装自定义组件

1. 准备组件 2. 创建打包文件夹及部分配置文件 创建 文件夹app-legalentities-root拷贝组件源文件到新的文件夹app-legalentities中创建文件 .npmrc registry发布地址always-authtrue创建文件 ng-package.json {"$schema": "./node_modules/ng-packagr/ng-pac…

FChen的408学习日记--三次握手和四次握手

一、三次握手 在建立连接的过程中&#xff0c;首先SYN1&#xff0c;随机发送sqex。服务器接受后要反过来对客户端发送连接请求&#xff0c;SYN1&#xff0c;随机发送sqey&#xff0c;ackx1。然后客户端还要发送连接确认报文&#xff0c;原因如下 例题&#xff1a; 二、四次…

WeiXin Bill Record

WeiXin Bill Record 微信账单记录查询流程 【我】 【钱包】 【账单】 选中一笔【查询对象】的交易记录 【查看往来转账】 【导出凭证】 选择查询开始时间&#xff0c;结束时间&#xff1b;【申请】 【验证】 【同意】协议 进入人脸识别 【申请】 【查看详情】 【确定】

SaaS中如何应用AIGC:智能赋能,引领未来

引言 在数字化浪潮的推动下&#xff0c;SaaS&#xff08;软件即服务&#xff09;已成为企业数字化转型的重要工具。而 AIGC 作为人工智能领域的前沿技术&#xff0c;正逐步渗透到SaaS的各个环节&#xff0c;为企业带来前所未有的智能化体验。 一、智能客服与自动化服务 在Saa…

Docker-命令

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、Docker架构二、Docker进程相关命令&#xff08;一&#xff09;启动 docker 服务&#xff08;二&#xff09;重启 docker 服务&#xff08;三&#xff09;停…

C语言——二分法求有序数组中指定元素的位置

二分法只是用于有序的数组&#xff0c;如果是无序输入&#xff0c;还需要进行排序。此外&#xff0c;mid 中间值不是整数&#xff0c;要取整。 #include <stdio.h> #include <stdlib.h> int Bin_search(int* p, int len, int target) { int left 0; int …

数实融合打破场景边界,苏宁大店直播火了!

今年以来&#xff0c;促消费扩内需举措持续发力&#xff0c;创新消费场景作为重点发力方向&#xff0c;在多个场合被提及。近期&#xff0c;国务院《关于促进服务消费高质量发展的意见》进一步提出&#xff0c;加速推动消费场景应用升级和数字赋能&#xff0c;构建智慧商圈、智…

苹果iOS 17.6.1正式推送,有哪些机型值得更新呢?

在科技界&#xff0c;每一次操作系统更新都备受瞩目&#xff0c;尤其是对于苹果这样在全球范围内拥有庞大用户群的品牌而言。 最近&#xff0c;苹果发布了iOS 17.6.1更新&#xff0c;这一小版本更新不仅修复了一系列关键错误&#xff0c;还针对之前版本中存在的问题进行了针对…

纺织设备如何实现信息化转型?

纺织设备的信息化转型&#xff0c;是当代制造业智能化升级的关键一环&#xff0c;它不仅深刻影响着纺织行业的生产效率与产品质量&#xff0c;还促进了整个产业链的创新与优化。这一进程不仅仅是简单地将信息技术融入传统纺织机械中&#xff0c;而是通过深度融合物联网、大数据…

【AI】AI编程工具概述

1. AI编程工具概述 1.1 定义与功能 AI编程工具是利用人工智能技术辅助编程工作的软件集合&#xff0c;它们通过集成到现有的开发环境中&#xff0c;提供代码自动生成、补全、错误检测、优化建议等功能&#xff0c;旨在提高开发效率和代码质量。 代码生成&#xff1a;AI工具可…

[书生大模型实战营][L0][Task1] Linux 远程连接 InternStudio

[书生大模型实战营][Task1] Linux 远程连接 InterStudio 1. 申请 InterStudio 账号 https://studio.intern-ai.org.cn/console/dashboard 2. ssh 生成公匙与密匙 使用 ssh-gen 生成公匙与密匙 # 1. ssh-gen ssh-gen# 2. 查看生成的文件 ls ~/.ssh# 3. 打开生成的公匙&#…

如何在 Linux 系统上创建软硬链接 ?

在本指南中&#xff0c;我将介绍什么是链接以及如何更好地使用它们以及所需的概念。 通过执行 man ln 命令&#xff0c;可以看到这是在文件之间建立链接&#xff0c;而没有提及是软链接或硬链接。 shashilinuxtechi ~}$ man ln类似地&#xff0c;命令 man link 描述为调用链接…

vue-I18n开箱方式

最近公司没什么活&#xff0c;没事捣鼓捣鼓技术 话不多说 上干货 npm i vue-i18nlatest //下载最新版插件创建文件用来存放需要的公共语言 文件夹内容 const zh {message: {Language: "简体中文",name: "中文名称",}, }; export default zh;const ja …

基于微软TTS,优雅的实现文本转语音

项目介绍 该项目源自以前了解的edge-tts&#xff0c;edge-tts 是一个python库&#xff0c;用于将文本转换为语音&#xff0c;它依赖于 Microsoft Azure 的 Text-to-Speech 服务&#xff0c;可以轻松实现本地文字转语音&#xff0c;在所有的文字转语音的服务中&#xff0c;说它…