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

news2024/12/23 9:22:28

   大家好,在上篇文章中博主演示了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/2056211.html

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

相关文章

软数据与硬数据的深度解析:住宅代理如何优化数据抓取

引言 什么是软数据&#xff1f;有哪些类型&#xff1f; 什么是硬数据&#xff1f;有哪些类型&#xff1f; 软数据和硬数据的区别是什么&#xff1f; 如何收集软数据和硬数据&#xff1f; 如何优化抓取软数据和硬数据&#xff1f; 总结 引言 在大数据时代&#xff0c;企业…

Sanic 和 Go Echo 对比

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐&#xff1a;「storm…

【Python系列】 并发编程在数据处理中的应用

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

iOS 17.6.1版本重发,修复高级数据保护错误

今日&#xff0c;苹果没有带来iOS 17.6.2的更新&#xff0c;而是重新发布了iOS 17.6.1版本&#xff0c;本次升级版本号为21G101&#xff0c;高于第一版的21G93。距离初版发布相隔一周半时间。 在 iOS / iPadOS 17.6.1 的更新日志&#xff0c;苹果公司写道&#xff1a;“此更新包…

只用一个 HTML 元素可以写出多少形状?——伪元素篇(上)

只用一个 div 元素&#xff0c;我们已经通过四个篇章写了很多形状。 首先&#xff0c;我们通过对这个 div 的宽度与高度的直接控制&#xff0c;轻松写出矩形和正方形&#xff0c;并结合 transform 的 skew 方法写出了平行四边形与菱形。 其次&#xff0c;我们通过对边框的灵活…

iphone异常问题常用修复方法

作为智能手机的领军者&#xff0c;iPhone凭借其卓越的性能和稳定的系统赢得了全球用户的青睐。然而&#xff0c;就像任何电子设备一样&#xff0c;iPhone在使用过程中也难免会遇到各种异常问题&#xff0c;如卡顿、无法充电、应用闪退等。这些问题虽然令人头疼&#xff0c;但大…

linux之ELK

ELK概述 ELK是一套开源的日志分析系统&#xff0c;由elasticsearchlogstashKibana组成。 官网说明:https://www.elastic.co/cn/products 首先: 先一句话简单了解E,L,K这三个软件 elasticsearch: 分布式搜索引擎 logstash: 日志收集与过滤&#xff0c;输出给elasticsearch Kiban…

校园快递代取系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图详细视频演示技术栈系统测试为什么选择我官方认证玩家&#xff0c;服务很多代码文档&#xff0c;百分百好评&#xff0c;战绩可查&#xff01;&#xff01;入职于互联网大厂&#xff0c;可以交流&#xff0c;共同进步。有保障的售后 代码参考数据库参…

Windows搭建我的世界MC服务器 【Minecraft外网联机教程】

目录 ⛳️推荐 1. 搭建我的世界服务器 1.1 服务器安装java环境 1.2 配置服务端 1.3 创建我的世界服务器 2. 局域网联机测试 3. 安装cpolar内网穿透 4. 公网联机Minecraft 5. 配置固定远程联机端口地址 ⛳️推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通…

【启明智显技术分享】工业级HMI芯片Model系列GUI合成到项目中的指南

在工业自动化、智能终端HMI、车载仪表盘等领域&#xff0c;高性能的HMI&#xff08;人机界面&#xff09;芯片是不可或缺的核心组件。启明智显推出的Model系列&#xff08;如Model3C、Model3、Model4&#xff09;HMI芯片&#xff0c;以其卓越的性能和广泛的应用领域&#xff0c…

大模型学习应用 2:快速上手大模型基于langchain实现RAG检索应用

快速上手大模型基于langchain实现RAG检索应用 - 项目作业 目录 准备工作镜像选择算力选择安装包数据说明提示参考链接 Task1 申请 api 后&#xff0c;使用 langchain 导入大模型&#xff0c;并打印出大模型信息Task2 使用 langchian 加载数据&#xff0c;并把数据打印出来Task…

WebSocket 快速入门

WebSocket是什么 WebSocket 是基于 TCP 的一种新的应用层网络协议。它实现了浏览器与服务器全双工通信&#xff0c;即允许服务器主动发送信息给客户端。因此&#xff0c;在 WebSocket 中&#xff0c;浏览器和服务器只需要完成一次握手&#xff0c;两者之间就直接可以创建持久性…

Linux系统中安装Git(详细教程)

在Linux系统中安装Git&#xff0c;可以通过多种方式来实现&#xff0c;主要包括使用包管理器安装和从源代码编译安装。以下是详细的安装步骤&#xff1a; 一、使用包管理器安装&#xff08;不建议该方式&#xff09; 大多数Linux发行版都提供了包管理器&#xff0c;如Debian/…

90%的人都在用这7个图片转pdf技巧,转换速度很快!

图片怎么转换成pdf格式&#xff1f;图片和pdf格式是两种完全不一样的格式&#xff0c;但是如果想要将图片转换成pdf格式还是蛮容易的&#xff0c;常见的方法就有数十种了。 本文整理了几种常见的图片转pdf的方法&#xff0c;包括图片转pdf在线方法&#xff0c;有需要的朋友可以…

取证工具 ElcomSoft iOS Forensics Toolkit: 在 Windows 中加载 HFS 镜像

天津鸿萌科贸发展有限公司是 ElcomSoft 系列取证软件的授权代理商。 Elcomsoft iOS Forensics Toolkit 功能简介 Elcomsoft iOS Forensics Toolkit 软件工具包适用于取证工作&#xff0c;对 iPhone、iPad 和 iPod Touch 设备执行完整文件系统和逻辑数据采集。对设备文件系统制…

【Linux操作系统】基础IO

目录 一、接口使用1.1 铺垫知识1.2 C接口使用1.3 系统接口使用 二、认识fd三、缓冲区四、文件系统五、软硬连接六、动静态库6.1 静态库的制作和使用6.1 动态库的制作和使用 七、理解动态库加载 一、接口使用 1.1 铺垫知识 文件文件内容文件属性 。一个文件如果它的文件内容为…

AI产品经理如何入门?零基础入门到精通,收藏这一篇就够了

现在做产品经理&#xff0c;真的挺累的。 现在产品越来越难做&#xff0c;晋升困难&#xff0c;工资迟迟不涨……公司裁员&#xff0c;产品经理首当其冲&#xff01;&#xff01; 做产品几年了&#xff0c;还没升职&#xff0c;就先到了“职业天花板”。 想凭工作几年积累的…

linux被植入木马排查思路

linux被植入木马排查思路 一、是否侵入检查 1&#xff09;检查系统登录日志 last命令 2&#xff09;检查系统用户 1、检查是否有异常用户 cat /etc/passwd 2、查看是否产生了新用户、uid和gid为0的用户 grep "0" /etc/passwd 3、查看passwd的修改时间&#xf…

CY7C68000 实现High Speed USB2 UART

已经在Malogic PFGA Board 上用CY7C68000 实现High Speed USB2UART&#xff0c;店铺还上架了 ULPI &#xff08;USB3300&#xff09;的 TestBench 和ModelSim 验证环境&#xff0c;刚刚写出来的&#xff0c;其实效果和UTMI差不多&#xff0c; 比UTMI麻烦一些&#xff0c;需要写…

k8s篇之kubectl安装命令自动补全插件

1. 简介 常见情况&#xff1a;在部署生产环境或者测试环境的k8s集群时&#xff0c;常因输入命令繁琐&#xff0c;使得执行相关k8s操作排错时麻烦&#xff0c;以下自动补全插件即可解决这一问题。 以下安装亲测有效 2. 安装 安装bash completion yum install -y bash-comple…