【Docker Compose】Docker Compose 的安装,使用以及实现微服务集群的部署

文章目录

  • 前言:Docker 部署存在的问题
  • 一、 初识 Docker Compose
    • 1.1 什么是 Docker Compose
    • 1.2 在 CentOS 上安装 Docker Compose
  • 二、深入了解 Docker Compose 文件
    • 2.1 Docker Compose 文件概述
    • 2.2 Docker Compose 文件详解
    • 2.3 示例:编写 Docker Compose 文件
  • 三、Docker Compose 相关命令
    • 3.1 常用 Docker Compose 命令
    • 3.2 示例:使用 Docker Compose 部署一个简单的 Web 应用
  • 四、使用 Docker Compose 部署微服务集群


前言:Docker 部署存在的问题

在实际应用中,当我们需要部署大量的 Docker 容器时,手动管理这些容器的配置和部署变得非常繁琐。每个容器可能需要不同的参数、端口映射、网络设置等,这导致了管理和维护的复杂性。为了解决这个问题,我们可以借助 Docker Compose 工具,它提供了一种简单、统一的方式来定义和管理多容器的 Docker 应用。

一、 初识 Docker Compose

1.1 什么是 Docker Compose

Docker Compose 是 Docker 公司提供的一个用于定义和运行多容器 Docker 应用程序的工具。通过 Docker Compose,可以使用简单的 YAML 文件来配置整个应用程序的服务、网络、卷等各种参数。这样,我们可以轻松实现一键部署和管理多个 Docker 容器,简化了多容器应用的配置和管理。

1.2 在 CentOS 上安装 Docker Compose

安装 Docker Compose 非常简单,可以按照以下步骤在 CentOS 上安装:

  1. 打开终端,以 root 用户身份登录。

  2. 使用以下命令下载 Docker Compose 的二进制文件:

    sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
    
  3. 赋予执行权限:

    sudo chmod +x /usr/local/bin/docker-compose
    
  4. 验证安装:

    docker-compose --version
    

    如果安装成功,会显示 Docker Compose 的版本信息。

通过以上步骤,就成功在 CentOS 上安装了 Docker Compose。接下来,我们将深入探索如何使用 Docker Compose 编写和管理多容器的应用程序。

二、深入了解 Docker Compose 文件

2.1 Docker Compose 文件概述

Docker Compose 文件是一个 YAML 文件,用于定义和配置多容器 Docker 应用程序的服务、网络、卷等。通过 Docker Compose 文件,我们可以以声明式的方式描述应用程序的结构和参数,从而简化容器化应用的部署和管理。

一个基本的 Docker Compose 文件通常包括以下几个部分:

  • version: 指定 Compose 文件的版本
  • services: 定义各个服务,每个服务对应一个容器。
  • networks: 定义网络设置。
  • volumes: 定义卷,用于持久化数据。

以下是一个简单的 Docker Compose 文件示例:

version: '3'services:web:image: nginx:latestports:- "8080:80"db:image: mysql:5.7environment:MYSQL_ROOT_PASSWORD: examplenetworks:app_net:volumes:data_vol:

在这个示例中,定义了两个服务 webdb,以及一个网络 app_net 和一个卷 data_vol

2.2 Docker Compose 文件详解

  1. version 指令

version 指令用于指定 Compose 文件的版本。不同的版本可能支持不同的特性和语法。常见的版本有 2, 2.1, 3, 等。根据需要选择适合的版本。

  1. services 指令

services 指令定义了各个服务,每个服务对应一个容器。每个服务可以包括以下一些常见配置项:

  • image: 指定使用的镜像。
  • build: 指定 Dockerfile 的路径,用于构建镜像。
  • ports: 指定端口映射。
  • environment: 指定环境变量。
  • volumes: 指定卷的挂载。

以下是一个服务的示例:

services:web:image: nginx:latestports:- "8080:80"volumes:- ./html:/usr/share/nginx/html

在这个示例中,web 服务使用了 nginx:latest 镜像,将主机的 ./html 目录挂载到容器的 /usr/share/nginx/html 目录,并映射主机的 8080 端口到容器的 80 端口。

  1. networks 指令

networks 指令用于定义网络设置。可以为服务指定特定的网络。以下是一个网络的示例:

networks:app_net:

在这个示例中,定义了一个名为 app_net 的网络。

  1. volumes 指令

volumes 指令用于定义卷,用于持久化数据。以下是一个卷的示例:

volumes:data_vol:

在这个示例中,定义了一个名为 data_vol 的卷。

2.3 示例:编写 Docker Compose 文件

version: '3'services:web:image: nginx:latestports:- "8080:80"volumes:- ./html:/usr/share/nginx/htmldb:image: mysql:5.7environment:MYSQL_ROOT_PASSWORD: examplenetworks:app_net:volumes:data_vol:

在这个示例中,定义了两个服务 webdb,以及一个网络 app_net 和一个卷 data_vol

  • web 服务使用了 nginx:latest 镜像,将主机的 ./html 目录挂载到容器的 /usr/share/nginx/html 目录,并映射主机的 8080 端口到容器的 80 端口。
  • db 服务使用了 mysql:5.7 镜像,并设置了 MySQL 的 root 密码。网络 app_net 和卷 data_vol 分别定义了一个网络和一个卷。

通过这个示例,可以更好地理解 Docker Compose 文件的基本结构和语法。在接下来的学习中,我们将深入了解如何使用 Docker Compose 部署和管理多容器的应用程序。

三、Docker Compose 相关命令

Docker Compose 提供了一系列命令,用于管理多容器的应用程序。下面我们将介绍一些常用的 Docker Compose 命令,帮助更好地使用和管理容器化应用。

3.1 常用 Docker Compose 命令

  1. docker-compose up

启动容器。在项目目录下执行该命令,Compose 将会根据 docker-compose.yml 文件启动相应的服务。如果没有 docker-compose.yml 文件,可以使用 -f 参数指定其他的 Compose 文件。

docker-compose up
  1. docker-compose down

停止并移除容器、网络、卷。在项目目录下执行该命令,Compose 将停止并删除与该项目关联的所有服务。同样可以使用 -f 参数指定其他的 Compose 文件。

docker-compose down
  1. docker-compose ps

列出项目中所有服务的状态。在项目目录下执行该命令,Compose 将列出项目中所有服务的状态,包括运行状态、端口映射等信息。

docker-compose ps
  1. docker-compose logs

显示服务的日志输出。在项目目录下执行该命令,Compose 将显示项目中所有服务的实时日志输出。

docker-compose logs
  1. docker-compose exec

在服务中执行命令。可以使用该命令在指定的服务中执行特定的命令,例如:

docker-compose exec web ls -l

以上是一些常用的 Docker Compose 命令,通过这些命令,我们可以方便地启动、停止、管理多容器的应用程序。

3.2 示例:使用 Docker Compose 部署一个简单的 Web 应用

下面通过一个简单的示例来演示如何使用 Docker Compose 部署一个包含 Web 服务和数据库服务的应用程序。

  1. 编写 Docker Compose 文件

创建一个名为 docker-compose.yml 的文件,并添加以下内容:

version: '3'services:web:image: nginx:latestports:- "8080:80"db:image: mysql:5.7environment:MYSQL_ROOT_PASSWORD: example

在这个示例中,定义了两个服务 webdbweb 服务使用了 nginx:latest 镜像,将主机的 8080 端口映射到容器的 80 端口。db 服务使用了 mysql:5.7 镜像,并设置了 MySQL 的 root 密码。

  1. 启动应用程序

在包含 docker-compose.yml 文件的目录下,执行以下命令启动应用程序:

docker-compose up

Compose 将会启动两个服务,分别运行在两个容器中。web 服务使用 Nginx 提供 Web 服务,db 服务使用 MySQL 提供数据库服务。

  1. 访问 Web 应用

在浏览器中访问 http://宿主机IP:8080,将看到 Nginx 提供的欢迎页面。至此,一个简单的多容器应用程序就成功部署和运行了。

  1. 停止和清理

当不再需要应用程序时,可以执行以下命令停止并清理容器、网络和卷:

docker-compose down

通过这个简单的示例,可以帮助我们如何编写 Docker Compose 文件,以及如何使用 Docker Compose 启动、停止和管理多容器的应用程序。这对于复杂的容器化应用程序管理将会非常实用。

四、使用 Docker Compose 部署微服务集群

目标:使用 Docker Compose 将 cloud-demo 微服务项目集群部署到 Docker 容器中。

  1. 首先创建一个 cloud-demo 的目录,然后在这个目录下分别创建四个文件夹:gatewaymysqlorder-serviceuser-service ,另外创建一个 docker-compose.yml 用于编写 Docker Compose 配置信息。

  1. 编写 Docker Compose 文件
version: "3.2"services:nacos:image: nacos/nacos-serverenvironment:MODE: standaloneports:- "8848:8848"mysql:image: mysql:5.7.25environment:MYSQL_ROOT_PASSWORD: 123volumes:- "$PWD/mysql/data:/var/lib/mysql"- "$PWD/mysql/conf:/etc/mysql/conf.d/"userservice:build: ./user-serviceorderservice:build: ./order-servicegateway:build: ./gatewayports:- "10010:10010"

说明:
这是一个 docker-compose.yml 文件,用于定义 Docker Compose 的配置信息,包含了多个服务的定义,每个服务都有特定的配置。

  • nacos 服务使用了 nacos/nacos-server 镜像,设置了环境变量 MODEstandalone,并将容器的 8848 端口映射到主机的 8848 端口。

  • mysql 服务使用了 mysql:5.7.25 镜像,设置了 MySQL 的 root 用户密码为 123,并将两个本地目录挂载到容器内,分别用于存储 MySQL 数据和配置文件。

  • userserviceorderservicegateway 三个服务都使用了各自微服务目录中的 Dockerfile 进行构建。这意味着这三个服务的构建过程需要分别查看各自目录下的 Dockerfile 文件。

  • 对于 gateway 服务,还将容器的 10010 端口映射到主机的 10010 端口。

此文件的作用是描述整个微服务架构中各个服务的配置和依赖关系,通过执行 docker-compose up -d 命令,Docker Compose 将按照这个配置信息创建、启动整个微服务集群。

  1. 修改 cloud-demo 项目中的配置:将 MySQL 数据库、nacos地址,微服务的 IP 地址都命名为docker-compose中的服务名

例如:

  1. 使用maven打包工具,将项目中的每个微服务都打包为app.jar

即将所有微服务中的 build 改为如下形式:

<build><finalName>app</finalName><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins>
</build>
  1. 将每个微服务打包好的app.jar拷贝自己对应的目录中,并在自己的目录中创建 Dockerfile文件:

Dockerfile文件内容:

FROM java:8-alpine
COPY ./app.jar /tmp/app.jar
ENTRYPOINT java -jar /tmp/app.jar

cloud-demo目录结构:

其中,mysql 目录中存放的数据库的配置文件和数据库表文件。

  1. 部署cloud-demo微服务集群

部署的命令:

docker-compose up -d


执行这个命令后,由于当前Docker中没有 Nacos 和 MySQL 镜像,因此首先会拉取这两个镜像。然后才会构建微服务的镜像,最后运行所有镜像。

  1. 查看运行的容器

注意,有可能会因为 Nacos 不是最先启动完成而导致其他服务启动失败,此时可以重启其他微服务来解决:

docker-compose restart gateway userservice orderservice
  1. 通过gateway网关访问微服务集群

访问用户:

访问订单:

此时,我们的微服务集群便通过 Docker Compose 搭建成功了。

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

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

相关文章

Linux上将进程、线程与CPU核绑定

CPU亲和性(CPU Affinity)是某一进程(或线程)绑定到特定的CPU核(或CPU集合)&#xff0c;从而使得该进程(或线程)只能运行在绑定的CPU核(或CPU集合)上。进程(或线程)本质上并不与CPU核绑定。每次进程(或线程)被调度执行时&#xff0c;它都可以由其关联列表中的任何CPU核执行。如果…

WEB3 创建React前端Dapp环境并整合solidity项目,融合项目结构便捷前端拿取合约 Abi

好 各位 经过我们上文 WEB3 solidity 带着大家编写测试代码 操作订单 创建/取消/填充操作 我们自己写了一个测试订单业务的脚本 没想到运行的还挺好的 那么 今天开始 我们就可以开始操作我们前端 Dapp 的一个操作了 在整个过程中 确实是没有我们后端的操作 或者说 我们自己就…

Ipython和Jupyter Notebook介绍

Ipython和Jupyter Notebook介绍 Python、IPython和Jupyter Notebook是三个不同但密切相关的工具。简而言之&#xff0c;Python是编程语言本身&#xff0c;IPython是对Python的增强版本&#xff0c;而Jupyter Notebook是一种在Web上进行交互式计算的环境&#xff0c;使用IPytho…

数据科学家的编程语言

数据科学家的编程语言 在今天有256种编程语言可供选择&#xff0c;选择要学习的语言可能会令人不知所措和困难。有些语言更适用于构建游戏&#xff0c;而有些更适用于软件工程&#xff0c;还有一些更适用于数据科学。 编程语言的类型 低级编程语言是计算机用来执行操作的最容…

主流的图像—文本的多模态技术实现方法有哪些?

大体上可划分为3类&#xff1a; 1&#xff09;训练中间层以对齐视觉模块和语言模型。该类方法首先预训练视觉模块&#xff0c;将这些视觉模块与LLM冻结&#xff0c;然后在视觉模块与LLM之间插入可训练的中间层&#xff0c;构建多模态模型。接着在大规模的图像—文本对数据集上…

WPF中, 如何将控件的触发事件绑定到ViewModel

在DataGrid 等控件中, 有很多这种带闪电符号的触发事件. 如果用传统的事件驱动, 则直接在后台中建立 一个private PropertyChanged(Sender s, EventAgars Args) 即可. 但是如果需要绑定到ViewModel的话? 应该怎么做? 带闪电符号的触发事件 实现viewModel绑定前端触发事件的…

Unity实现设计模式——解释器模式

Unity实现设计模式——解释器模式 解释器模式&#xff08;Interpreter Pattern&#xff09;是一种按照规定语法进行解析的模式&#xff0c;现实项目中用得较少。 给定一门语言&#xff0c;定义它的文法的一种表示&#xff0c;并定义一个解释器&#xff0c;该解释器使用该表示来…

python读取vivo手机截图,将满屏图片文件移动别的路径

问题之初 python读取vivo手机截图&#xff0c; 将满屏图片文件移动别的路径好多这样的图片&#xff0c;占用手机大量的内存&#xff0c;食之无味弃之可惜&#xff01;那么会复制粘贴&#x1f440;代码的我们我们今天就把这些图片筛选清理掉。 这段代码 原有逻辑的基础上&…

【C++设计模式之原型模式:创建型】分析及示例

简介 原型模式&#xff08;Prototype Pattern&#xff09;是一种创建型设计模式&#xff0c;它允许通过复制已有对象来生成新的对象&#xff0c;而无需再次使用构造函数。 描述 原型模式通过复制现有对象来创建新的对象&#xff0c;而无需显式地调用构造函数或暴露对象的创建…

Fiddle日常运用手册(3)-对移动端产品进行数据接口抓包

一般如果在做安卓移动端产品测试的时候&#xff0c;一般不像WEB端产品&#xff0c;可以直接进行F12进行接口日志查看开发预留的打印信息&#xff0c;将会影响测试人员的问题定位精准度以及效率。 这里&#xff0c;我们就介绍一下使用Fiddle进行移动端产品的抓包教程。 一、pc端…

JavaAPI---replace

package daysreplace;public class ReplaceTest {public static void main(String[] args) {String str "wwxhhhhhhhhhhh333";System.out.println("替换前的字符串" str);String newstr str.replace("333", "111");System.out.prin…

CRMEB商城源码开源标准版v5.2.0+后端+前端uni-app开源包安装教程

CRMEB打通版是一款全开源支持商用的PHP多语言商城系统,历经年时间匠心之作&#xff01;系统采用前后端分离技术&#xff0c;基于TP6Uui-app框架开发&#xff1b;客户移动端采用uni-app开发&#xff0c;管理后台前端使用iviewUI开发。系统支持微信公众号端、微信小程序端、H5端、…

10链表-单链表构造LinkedList

目录 LeetCode之路——707. 设计链表 分析&#xff1a; Code&#xff1a; LeetCode之路——707. 设计链表 你可以选择使用单链表或者双链表&#xff0c;设计并实现自己的链表。 单链表中的节点应该具备两个属性&#xff1a;val 和 next 。val 是当前节点的值&#xff0c;n…

@SpringBootApplication剖析

一、前言 在SpringBoot项目中启动类必须加一个注解SpringBootApplication&#xff0c;今天我们来剖析SpringBootApplication这个注解到底做了些什么。 二、SpringBootApplication简单分析 进入SpringBootApplication源代码如下&#xff1a; 可以看出SpringBootApplication是…

el-date-picker增加默认值 修改样式

预期效果 默认是这样的 但希望是直接有一个默认的当天日期&#xff0c;并且字体颜色啥的样式也要修改&#xff08;在这里假设今天是2023/10/6 功能实现 踩了坑挺多坑的&#xff0c;特此记录 官方文档 按照官方的说明&#xff0c;给v-model绑定一个字符串就可以了 在j…

关联规则挖掘(下):数据分析 | 数据挖掘 | 十大算法之一

⭐️⭐️⭐️⭐️⭐️欢迎来到我的博客⭐️⭐️⭐️⭐️⭐️ &#x1f434;作者&#xff1a;秋无之地 &#x1f434;简介&#xff1a;CSDN爬虫、后端、大数据领域创作者。目前从事python爬虫、后端和大数据等相关工作&#xff0c;主要擅长领域有&#xff1a;爬虫、后端、大数据…

uniapp 实现地图头像上的水波纹效果

最近实现了uniapp 地图头像水波纹的效果&#xff0c;话不多说&#xff0c;先来看看视频效果吧&#xff1a;链接 在这里具体的代码就不放出来了&#xff0c;还是利用了uniapp的 uni.createAnimation 方法&#xff0c;因为cover-view 不支持一些css 的动画效果&#xff0c;所以这…

文举论金:非农到来!黄金原油全面走势分析策略独家指导

市场没有绝对&#xff0c;涨跌没有定势&#xff0c;所以&#xff0c;对市场行情的涨跌平衡判断就是你的制胜法宝。欲望&#xff01;有句意大利谚语&#xff1a;让金钱成为我们忠心耿耿的仆人&#xff0c;否则&#xff0c;它就会成为一个专横跋扈的主人。空头&#xff0c;多头都…

24 mysql all 查询

前言 这里主要是 探究一下 explain $sql 中各个 type 诸如 const, ref, range, index, all 的查询的影响, 以及一个初步的效率的判断 这里会调试源码来看一下 各个类型的查询 需要 lookUp 的记录 以及 相关的差异 此系列文章建议从 mysql const 查询 开始看 测试表结构…

基于可解释性特征矩阵与稀疏采样全局特征组合的人体行为识别

论文还未发表&#xff0c;不细说&#xff0c;欢迎讨论。 Title: A New Solution to Skeleton-Based Human Action Recognition via the combination usage of explainable feature extraction and sparse sampling global features. Abstract: With the development of deep …