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相关的教程,以实现自动化的构建与部署项目,教程制作不易,如果对你有帮助,可以一键三连,多多分享哦。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【vue】h 函数的使用

文章目录 1. 引言2. h 函数3. h 函数的使用3.1 v-if3.2 v-for3.3 v-on3.4 组件3.5 渲染插槽 4. h函数的使用场景参考链接 1. 引言 在绝大多数情况下&#xff0c;Vue 推荐使用模板语法来创建应用。然而在某些使用场景下&#xff0c;我们真的需要用到 JavaScript 完全的编程能力。…

Java开发代码规范文档

优质博文&#xff1a;IT-BLOG-CN 一、命令规范 包命名规范 包Package的作用是将功能相似或相关的类或者接口进行分组管理&#xff0c;便于类的定位和查找&#xff0c;同时也可以使用包来避免类名的冲突和访问控制&#xff0c;使代码更容易维护。通常&#xff0c;包命使用小写…

安卓中Room持久化库的使用

在Android开发中&#xff0c;Room是Google提供的一个持久化库&#xff0c;旨在为应用提供SQLite的抽象层&#xff0c;以简化数据库的访问和操作。相比直接使用SQLite&#xff0c;Room提供更清晰、更简洁的数据库访问机制。 1. Room的基础知识 1.1 引入Room依赖 首先&#xff…

GB/T 38082-2019 生物降解塑料购物袋检测

生物降解塑料购物袋是指以生物降解树脂为主要原料制得的&#xff0c;具有提携结构的&#xff0c;在销售、服务等场所用于盛装及携提商品的袋制品。 GB/T 38082-2019 生物降解塑料购物袋检测项目&#xff1a; 检测项目 测试标准 尺寸偏差 GB/T 38082 感官 GB/T 38082 提掉…

谷粒商城实战笔记-190-192商城业务-检索服务-面包屑导航

文章目录 一&#xff0c;什么是面包屑导航1&#xff0c;京东商城的面包屑2&#xff0c;面包屑是怎么产生的 二&#xff0c;面包屑导航的后台实现 这三节的主要内容是开发面包屑的前后端功能。 190-商城业务-检索服务-面包屑导航191-商城业务-检索服务-条件删除与URL编码问题192…

阿一网络安全实战演练之利用 REST URL 中的服务器端参数污染

所需知识 要解决这个实验室问题&#xff0c;您需要了解以下内容&#xff1a; 如何确定用户输入是否包含在服务器端的 URL 路径或查询字符串中。如何使用路径遍历序列尝试更改服务器端请求。如何查找 API 文档。 这些内容在我们的 API 测试学院主题中有涵盖。 进入实验室 研…

【Docker安装】Ubuntu系统下离线部署Docker环境教程

【Docker安装】Ubuntu系统下离线部署Docker环境教程 前言一、本次实践介绍1.1 本次实践规划1.2 本次实践简介二、检查本地环境2.1 检查操作系统版本2.2 检查内核版本2.3 更新软件源三、卸载Docker四、下载安装包4.1 创建目录4.2 官网下载五、部署Docker环境5.1 解压安装包5.2 复…

Web Image scr图片从后端API获取基本实现

因系统开发中需求&#xff0c;会有页面显示图片直接从后端获取后显示&#xff0c;代码如下&#xff1a; 后端&#xff1a; /*** 获取图片流* param response* param fileName*/RequestMapping(value"getImgStream",method RequestMethod.GET)public void getImgStr…

Yearning开源SQL审核平台本地Linux系统部署与远程登录语句审核

文章目录 前言1. Linux 部署Yearning2. 本地访问Yearning3. Linux 安装cpolar4. 配置Yearning公网访问地址5. 公网远程访问Yearning管理界面6. 固定Yearning公网地址 前言 本文主要介绍在 Linux 系统简单部署 Yearning 并结合 cpolar 内网穿透工具实现远程访问&#xff0c;破除…

Java基础入门15:算法、正则表达式、异常

算法&#xff08;选择排序、冒泡排序、二分查找&#xff09; 选择排序 每轮选择当前位置&#xff0c;开始找出后面的较小值与该位置交换。 选择排序的关键&#xff1a; 确定总共需要选择几轮&#xff1a;数组的长度-1。 控制每轮从以前位置为基准&#xff0c;与后面元素选择…

Typescript在AI产品中应用越来越广泛

AI产品中的应用 TypeScript 在 AI 产品中的应用逐渐增多&#xff0c;主要得益于其提供的类型安全、面向对象编程和模块化等特性&#xff0c;这些特性使得开发者能够构建可维护、可扩展和高性能的应用程序。 首先&#xff0c;TypeScript 作为 JavaScript 的超集&#xff0c;通…

15.基于session实现登录 前端项目部署

前端项目nginx部署 nginx配置文件 worker_processes 1;events {worker_connections 1024; }http {include mime.types;default_type application/json;sendfile on;keepalive_timeout 65;server {listen 8080;server_name localhost;# 指定前端项目所…

线性DP(动态规划)

文章目录 数字三角形思路代码 最长上升子序列1思路代码 最长公共子序列思路代码 其实和背包一样&#xff0c;都不固定&#xff0c;这种类型的题每一道题都需要自己从之前的经验中去摸索。 数字三角形 题目链接 思路 只能从左上或者右上走过来&#xff0c;用一个二维数组&am…

python-A+B again

[题目描述] 小理有一个非常简单的问题给你&#xff0c;给你两个整数 A 和 B&#xff0c;你的任务是计算 AB。输入格式&#xff1a; 输入共 2∗T1 行。 输入的第一行包含一个整数 T 表示测试实例的个数&#xff0c;然后 2∗T 行&#xff0c;分别表示 A 和 B 两个正整数。注意整数…

计算机网络面试题汇总

文章目录 计算机网络基础计算机网络体系结构(网络分层模型)OSI 七层模型是什么?每一层的作用是什么?TCP/IP 四层模型是什么?每一层的作用是什么?五层体系结构以及对应的协议为什么网络要分层,分层的好处?常见网络协议有哪些,每一层常见协议有哪些?应用层有哪些常见的协…

mysql5.7安装

1.创建一个software文件 2.先下载mysql的repo源 wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm 3安装源包 rpm -ivh mysql-community-release-el7-5.noarch.rpm 可能会报错 改成命令 rpm -ivh mysql-community-release-el7-5.noarch.rpm --nodeps…

目标检测 | yolov6 原理和介绍

前言&#xff1a;目标检测 | yolov5 原理和介绍 后续&#xff1a; 1.简介 YOLOv6是由美团视觉智能部研发的一款目标检测框架&#xff0c;专注于工业应用&#xff0c;致力于提供极致的检测精度和推理效率。相较于YOLOv4和YOLOv5&#xff0c;YOLOv6在网络结构方面进行了深入优化…

在LabVIEW中高效读取大型CSV文件的方法

当尝试使用“读取分隔的电子表格VI”从大型CSV文件&#xff08;数百MB&#xff09;中读取数据时&#xff0c;可能会遇到内存已满错误。这是因为该VI会一次性读取整个文件并将其转换为数值数组&#xff0c;导致占用大量内存。 解决方案 可以使用“从文本文件VI读取”来部分读取…

技术探索之android项目结构

在新建项目时会自动生成很多文件&#xff0c;需要知道项目结构&#xff0c;我们需要编辑的文件的位置&#xff1a; app: 项目的代码资源都在其中&#xff0c;是我们工作的核心目录 build &#xff1a; 编译生成文件。生成的apk就在build/outputs/apk/debug里。apk在虚拟机里就…

MySQL——内置函数

时间函数 select * from msg where date_add(sendtime, interval 2 minute) > now(); 理解&#xff1a; ------------------------------|-----------|-------------|------------------ 初始时间 now() 初始时间2min 字符串 length函数返回字符串长度&#xff0c;以字节为…