云原生之基石-Docker Compose

news2025/1/19 19:33:24

1. 前言

        在上一篇文章中介绍了基本的Docker工具,我们对单个应用程序进行单机单进程部署,制作Dockerfile文件,执行docker build来生成docker镜像, 执行docker run来运行一个容器,自己指定需要的参数如-v,但是这种run的方式肯定是不高效的,肯定不能解决我们大规模部署应用程序的需求的。

        假如我们有一个小应用系统,有前端应用程序web app、后台API服务程序、存储系统、缓存系统,计划部署在一台资源很充足的单机Linux系统上,我们要写一个Bash脚本,在脚本里一个个docker run吗?有没有一种方法,很简单的运行一行命令就run起来?我们面临哪些需要解决的问题?

        1)需要一种方法做到一个命令就能run或stop所有的应用程序;

        2)容器之间需要通讯,前端需要访问后台服务,后台服务需要访问存储系统和缓存系统;

        3)外面用户需要访问前端应用程序;

        4)存储系统需要永久数据存储的能力。

        Docker Compose技术对以上问题提供了相应的解决之道,让我们轻松地解决了应用程序集的部署问题。

        看看百度翻译对Compose的描述:v. 组成;构成(一个整体);创作(音乐);作曲;撰写(信函、讲稿、诗歌等);使镇静。组成、组合、使之构成一个整体,这正是Docker Compose的本意。

 

 2. Compose概述     

        我们来看一看Docker官网是怎样介绍自己的:Docker Compose overview | Docker Docs 

        Docker Compose is a tool for defining and running multi-container applications. It is the key to unlocking a streamlined and efficient development and deployment experience.

        Docker Compose是一个定义和运行多容器应用程序的工具,它是开启精简高效的开发和部署体验的关键。

        Compose simplifies the control of your entire application stack, making it easy to manage services, networks, and volumes in a single, comprehensible YAML configuration file. Then, with a single command, you create and start all the services from your configuration file.

        Compose简化了你的全应用程序栈的控制,它使用一个单一的可读性强的YAML配置文件来管理服务管、网络管和磁盘卷,让整个管理变得很容易。然后,使用一个简单的命令,你可以创建和启动YAML配置文件里的所有服务。

        Compose works in all environments; production, staging, development, testing, as well as CI workflows. It also has commands for managing the whole lifecycle of your application:

  • Start, stop, and rebuild services
  • View the status of running services
  • Stream the log output of running services
  • Run a one-off command on a service

        Compose在所有环境里工作的很好,包括产品、预发布、开发、测试、以及CI工作流,它也有一系列命令来管理你的应用程序的全生命周期:

  • 启动、关闭和重建服务;
  • 观察运行中服务的状态;
  • 让运行中服务的日志输出流式化;
  • 在一个服务上运行一次性命令。

        总之,Docker Compose就是一个定义和运行多容器应用程序的工具,用一个YAML配置文件来管理服务的一切,所谓的声明式API理念,后来的K8s特别宣称这一理念。

        从2013年以来,关于Docker和Docker Compose的安装、使用、各种操作命令的文章千千万,随便查查都能学会怎么使用这个具体的技术,再写这篇文章的重点还是强调我们要认识清楚Docker Compose的特点和理念,主要解决了我们哪些实际问题,架构师在技术选型的时候能做出正确的选择。

3. Compose安装

        Compose安装是很简单的,直接看官网即可:Overview of installing Docker Compose | Docker Docs, 一共有三个方案:

        1)安装Docker Desktop, 它包含了Compose。不过,一般不建议用桌面版,毕竟系统一般是Linux,还是用命令行比较好。

        2)安装Compose plugin,条件是那台机器已经安装了Docker Engine和Docker CLI。

        3)安装独立的Compose工具,但官方说不推荐,仅仅是V2向下兼容的方案。

        注意,Compose有V1和V2两个版本,2023年7月开始V1已经停止更新了,但是我想大家目前环境基本上都是V1版本吧,没特别必要是不会去升级的。

4. Compose服务编排

        Docker Compose 将所管理的容器分为三层:工程(Project)、服务(Service)、容器(Container)。
        Docker Compose 运行目录下的所有文件(docker-compose.yml)组成一个工程,一个工程包含多个服务,每个服务中定义了容器运行的镜像、参数、依赖,一个服务可包括多个容器实例。

         

 

         上图是前言中假设的一个小应用系统的组件设计图,我们编写一个docker-compose.yml来部署它:   

version: "3"

services:
  mysql:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: abc12345678
      MYSQL_DATABASE: test
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - /etc/timezone:/etc/timezone:ro
      - ./mysql/db:/var/lib/mysql
    ports:
      - "3306:3306"
    networks:
      - default
      - gateway

  redis:
    image: redis:latest
    command: redis-server /etc/redis/redis.conf
    volumes:
      - ./redis/redis.conf:/etc/redis/redis.conf
      - ./redis/redis/data:/data
      - /etc/localtime:/etc/localtime:ro
    ports:
      - "6379:6379"
    restart: always
    networks:
      - default
      - gateway

  backend-api:
    image: demo/backend-api:1.0
    ports:
      - 8080:80
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - /etc/timezone:/etc/timezone:ro
      - ./backend/conf:/opt/backend/conf
      - ./backend/logs:/opt/backend/logs
    networks:
      - default
      - gateway
    depends_on:
      - mysql
      - redis

  frontend-webapp:
    image: demo/frontend-webapp:1.0
    ports:
      - 80:80
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - /etc/timezone:/etc/timezone:ro
      - ./webapp:/opt/webapp
    networks:
      - default
      - gateway
    depends_on:
      - backend-api

networks:
  default:
    external:
      name: web-service
  gateway:
    external: true

        上面docker-compose.yml文件内容是我从实际项目中抽出来简化了的版本,backend-api可能是SpringBoot框架开发的,也可能是Flask框架开发的,实际参数不止于这些,而同样frontend-webapp可能是vue2/vue3框架开发的,也可能是react框架开发的, 实际参数并不尽同,但并不影响我们说明问题。下面讲解几个关键点:

  • services: 所有服务的根节点。例子里定义了4个服务mysql、redis、backend-api、frontend-webapi。
  • image: 指定服务的镜像。
  • environment:环境变量。
  • volumes:挂载主机目录,其中 ro 表示只读。
  • ports:端口映射,要想外部能访问容器内服务,就需要做端口映射。
  • networks:网络配置,docker是有自己内部网络的,容器之间可以通讯,可以通过服务名来访问,具体网络创建等不详述。
  • depends_on:服务依赖。

        docker-compose.yml编排语法不仅仅只有以上这几个,详细请参见Docker Compose overview | Docker Docs ,要注意默认官网文档是V2,当然相差也不会太大,具体在自己环境试试就知道了。

5. Compose常见命令

        Compose常见操作命令都很容易,下面列举几个:

5.1 启动容器: 

docker-compose up

docker compose up

5.2 列出所有运行容器:

docker-compose ps 

docker compose ps

5.3 停止容器:
docker compose down 

  全部命令具体参见:Overview of docker compose CLI | Docker Docs,下面截图一下官网的文档:

6. 总结

         Docker Compose是一个定义和运行多容器应用程序的工具,用一个YAML配置文件来管理服务的一切,对系统部署按工程、服务、容器进行管理,让我们很方便地对一批服务进行高效地部署和管理。

                       

         

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

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

相关文章

在Ubuntu22.04上部署FoooCUS2.1

Fooocus 是一款基于 Gradio的图像生成软件,Fooocus 是对 Stable Diffusion 和 Midjourney 设计的重新思考: 1、从 Stable Diffusion 学习,该软件是离线的、开源的和免费的。 2、从 Midjourney 中学到,不需要手动调整,…

【AI】安装ubuntu20.04教程(未完待续)

目录 1 制作ubuntu20.04系统盘1.1 下载ubuntu镜像1.2 使用ultraiso写入镜像 2 安装Ubuntu系统 1 制作ubuntu20.04系统盘 1.1 下载ubuntu镜像 在清华镜像站https://mirrors.tuna.tsinghua.edu.cn/下载ubuntu20.04镜像 路径为/ubuntu-releases/20.04/,下载ubuntu-20…

【教程】C++语言基础学习笔记(七)——Array数组

写在前面: 如果文章对你有帮助,记得点赞关注加收藏一波,利于以后需要的时候复习,多谢支持! 【C语言基础学习】系列文章 第一章 《项目与程序结构》 第二章 《数据类型》 第三章 《运算符》 第四章 《流程控制》 第五章…

Promise与async await的作用及应用场景

在Web前端开发中,处理异步操作是非常常见的需求。为了解决这个问题,ES6引入了Promise和后续的async await。本文将介绍Promise和async await的作用,以及在实际开发中的应用场景。 一、Promise的作用及应用场景 Promise是一个表示异步操作最…

【MySQL】学习约束和使用图形化界面创建表

🌈个人主页: Aileen_0v0 🔥热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​💫个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-iqtbME2KmWpQFQSt {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…

综合例题及补充

目录 查询员工的编号、姓名、雇佣日期,以及计算出每一位员工到今天为止被雇佣的年数、月数、天数 计算出年 计算月 计算天数 Oracle从入门到总裁:https://blog.csdn.net/weixin_67859959/article/details/135209645 查询员工的编号、姓名、雇佣日期&#xff0c…

S32 Design Studio的PE工具

S32 Design Studio软件是NXP公司专门为了方便用户开发S32K1系列芯片的IDE,跟Eclipse比较像。里面有个配套的图形工具Processor Expert,会产生一个后缀名为pe的文件,跟ST的cubemx作用类似。 双击pe文件即可打开pe界面,生成的文件将…

Codeforces Round 925 (Div. 3)

Codeforces Round 925 (Div. 3) Codeforces Round 925 (Div. 3) A. Recovering a Small String 题意:给出一个整数n,为三个26个字母的位置序号的和,输出字典序最小的三个字符的字符串。 思路:直接倒推,顺一遍&…

第6个-滚动动画

Day 6 - Scroll Animation 1. 演示效果 2. 分析思路 布局 所有的内容进行水平垂直居中,可以使用**margin:0 auto;,也可以使用flex**布局: body {background-color: #efedd6;display: flex;flex-direction: column;justify-content: center…

腾讯云幻兽帕鲁服务器配置怎么选择合适?

腾讯云幻兽帕鲁服务器配置怎么选?根据玩家数量选择CPU内存配置,4到8人选择4核16G、10到20人玩家选择8核32G、2到4人选择4核8G、32人选择16核64G配置,腾讯云百科txybk.com来详细说下腾讯云幻兽帕鲁专用服务器CPU内存带宽配置选择方法&#xff…

音视频剪辑|FFMPEG|windows10下的音视频格式转换,遮挡填充,GIF动图制作,背景音频抽取,替换

前言: 最近对于音视频和图像的处理问题比较感兴趣,但发现很多目前需要的功能要么需要付费但不会过于麻烦,要么比较麻烦,很可能某个功能实现需要安装很多软件 例如,视频转GIF动图,该功能的实现要么使用Pho…

VMware清理拖拽缓存 Ubuntu硬盘情况占用分析

这两天在尝试编译Linux源码,我在win上将源码下载下来然后复制到ubuntu上,这一步我粗略看到了三种方法:安装VM tools,就可以使文件正常的在win和ubuntu中复制剪切;使用scp命令将win和linux系统链接起来;使用…

P5440 【XR-2】奇迹 (大模拟dfs+欧拉筛板子+闰年)

传送门https://www.luogu.com.cn/problem/P5440 相信奇迹的人,本身就和奇迹一样了不起。——笛亚 《星游记》 思路历程:很离谱的一题,在理论上并不困难,只要简单dfs欧拉筛就能过。在一开始,我采用了倒着模拟的思路&am…

JavaWeb:关于登录认证的简单拓展

前提介绍 本文基于文章-------JavaWeb:SpringBootWeb登录认证 --黑马笔记 -------再做简单拓展 如果没有关于登录认证知识的基础,可以先看上面所说的的文章,文章在专栏javaweb中,下面我为了大家观看,直接放了链接。…

服务降级(Sentinel)

服务降级 采用 SentinelResource 注解方式实现, 必要的 依赖必须引入 以及 切面Bean 接口代码 RequestMapping("/degrade")SentinelResource(value DEGRADE_RESOURCE_NAME, blockHandler "blockHandlerForDegrade",entryType EntryType.IN…

Excel模板2:进度条甘特图

Excel模板2:进度条甘特图 ‍ 今天复刻B站up【名字叫麦兜的狗狗】的甘特图:还在买Excel模板吗?自己做漂亮简洁的甘特图吧!_哔哩哔哩_bilibili 阿里网盘永久分享:https://www.alipan.com/s/cXhq1PNJfdm 当前效果&…

2.13 数组练习

1、选择题 1.1、若有定义语句:int a[3][6]; ,按在内存中的存放顺序,a 数组的第10个元素是 B A)a[0][4] B) a[1][3] C)a[0][3] D)a[1][4] 解析:二维数组在内存中是以行优先的方式存放的。这意味着首先填充第一行的…

Excel练习:折线图突出最大最小值

Excel练习:折线图突出最大最小值 ​​ 要点:NA值在折现图中不会被绘制,看似一条线,实际是三条线。换成0值和""都不行。 ‍ 查看所有已分享Excel文件-阿里云 ‍ 学习的这个视频:Excel折线图&#xff0c…

java之jvm详解

JVM内存结构 程序计数器 Program Counter Register程序计数器(寄存器) 程序计数器在物理层上是通过寄存器实现的 作用:记住下一条jvm指令的执行地址特点 是线程私有的(每个线程都有属于自己的程序计数器)不会存在内存溢出 虚拟机栈(默认大小为1024kb) 每个线…

MySQL:常用指令

MySQL官网 一、在Windows 系统 cmd窗口里执行的命令 启动:net start MySQL停止:net stop MySQL卸载:sc delete MySQL 二、在macOS系统终端里执行的命令 启动:mysql.server start停止:mysql.server stop重启:mysql.server restart 三、执行帮…