容器编排工具Docker Compose

目录

一、Docker Compose概述

        1、主要功能

        2、工作原理

二、常用命令参数

1、服务管理

2、构建和重新构建服务

三、Docker Compose的yml文件

1、服务

2、网络

3、存储卷

四、容器编排实现haproxy和nginx负载均衡


一、Docker Compose概述

1、主要功能
  1. 定义服务: 使用 YAML 格式的配置文件来定义一组相关的容器服务。每个服务可以指定镜像、端口映射、 环境变量、存储卷等参数。 例如,可以在配置文件中定义一个 Web 服务和一个数据库服务,以及它们之间的连接关系。

  2. 一键启动和停止: 通过一个简单的命令,可以启动或停止整个应用程序所包含的所有容器。这大大简化了多容器 应用的部署和管理过程。 例如,使用 docker-compose up 命令可以启动配置文件中定义的所有服务,使用 dockercompose down 命令可以停止并删除这些服务。

  3. 服务编排: 可以定义容器之间的依赖关系,确保服务按照正确的顺序启动和停止。例如,可以指定数据库 服务必须在 Web 服务之前启动。 支持网络配置,使不同服务的容器可以相互通信。可以定义一个自定义的网络,将所有相关的 容器连接到这个网络上。

  4. 环境变量管理: 可以在配置文件中定义环境变量,并在容器启动时传递给容器。这使得在不同环境(如开发、 测试和生产环境)中使用不同的配置变得更加容易。 例如,可以定义一个数据库连接字符串的环境变量,在不同环境中可以设置不同的值。

2、工作原理

Docker Compose 的工作原理是通过一个 YAML 配置文件定义一组相关的 Docker 容器服务,它读取配置文件后,根据其中指定的服务信息,如镜像、端口映射、环境变量、依赖关系等,依次创建和启动各个容器,并管理容器之间的网络连接和数据共享,确保整个应用系统按照预定的配置协同工作。

二、常用命令参数

[root@docker-node1 ~]# vim ~/.vimrc
set ts=2 ai sw=2 et
#yml有严格缩进
[root@docker-node1 ~]# vim  /root/test/docker-compose.yml
version: "1.0"
services:web:image: nginxports:- "80:80"db:image: mysql:5.7environment:MYSQL_ROOT_PASSWORD: leo

1、服务管理

docker compose up 

启动配置文件中定义的所有服务。

可以使用 -d 参数在后台启动服务。

可以使用-f 来指定yml文件。

例如: docker-compose up -d

[root@docker-node1 test]# docker compose up -d
[root@docker-node1 test]# docker compose -f /root/test/docker-compose.yml up -d

停止并删除配置文件中定义的所有服务以及相关的网络和存储卷

[root@docker-node1 test]# docker compose down

docker compose start : 启动已经存在的服务,但不会创建新的服务

[root@docker test]# docker compose start

docker compose stop : 停止正在运行的服务

[root@docker test]# docker compose stop

docker compose restart : 重启服务

[root@docker test]# docker compose restart

docker compose ps : 列出正在运行的服务以及它们的状态,包括容器 ID、名称、端口映射等信息

docker compose logs : 查看服务的日志输出。可以指定服务名称来查看特定服务的日志

2、构建和重新构建服务

“docker compose up” 用于创建并启动由 Compose 文件定义的服务,而 “docker compose build” 用于构建服务所使用的镜像。

[root@docker-node1 test]# vim /root/docker/Dockerfile
FROM busybox:latest
RUN touch /file1
[root@docker-node1 test]# vim /root/docker/leo
FROM busybox:latest
RUN touch /file2[root@docker-node1 test]# vim docker-compose.ymlservices:test1:image: test1build:context: /root/dockerdockerfile: Dockerfilecommand: ["/bin/sh","-c","sleep 100000"]container_name: leo1test2:image: test2build:context: /root/dockerdockerfile: leocommand: ["/bin/sh","-c","sleep 100000"]container_name: leo2
[root@docker-node1 test]# docker compose up -d
[+] Running 2/2✔ Container leo1  Started                                                                   0.4s✔ Container leo2  Started                                                                   0.4s[root@docker-node1 test]# docker compose build
#提前构建镜像,但镜像不运行
[root@docker-node1 test]# docker compose build test1
[root@docker-node1 test]# docker compose build test2
#可以分开构建docker compose up build 
启动服务并在启动前重新构建镜像[root@docker-node1 test]# docker compose exec -it test1 /bin/sh
在正在运行的服务容器中执行命令docker-compose pull
拉取配置文件中定义的服务所使用的镜像docker compose config 
验证并查看解析后的 Compose 文件内容,无语法错误则打印输出,加-q不输出

三、Docker Compose的yml文件

Docker Compose 的 YAML 文件用于定义和配置多容器应用程序的各个服务。

1、服务

服务名称

services:web:# 服务1的配置mysql:# 服务2的配置

镜像

services:web:images:nginxmysql:images:mysql:5.7

端口映射

将容器内部的端口映射到主机的端口,以便外部可以访问容器内的服务。例如, - "8080:80" 表示将主机的 8080 端口映射到容器内部的 80 端口。

services:test1:image: test1build:context: /root/dockerdockerfile: Dockerfilecommand: ["/bin/sh","-c","sleep 100000"]container_name: leo1expose:- 1234
[root@docker-node1 test]# docker ps
CONTAINER ID   IMAGE     COMMAND                   CREATED         STATUS         PORTS      NAMES
c7c6fa09dad9   test1     "/bin/sh -c 'sleep 1…"   4 seconds ago   Up 3 seconds   1234/tcp   leo1services:test1:image: nginxcontainer_name: webserverexpose:- 1234ports:- "80:80"
[root@docker-node1 test]# curl 172.25.254.100

环境变量

services:web:images:mysql:5.7environment:MYSQL_ROOT_PASSWORD: leodocker inspect

存储卷

将主机上的目录或文件挂载到容器中,以实现数据持久化或共享。例如, - /host/data:/container/data 将主机上的 /host/data 目录挂载到容器内的 /container/data 路径。

services:test:image: busyboxcommand: ["/bin/sh","-c","sleep 3000"]restart: alwayscontainer_name: busybox1volumes:- /etc/passwd:/tmp/passwd:ro #只读挂在本地文件到指定位置

网络

将服务连接到特定的网络,以便不同服务的容器可以相互通信。

services:test1:image: busybox:latestcontainer_name: leocommand: ["/bin/sh","-c","sleep 100000"]
[root@docker-node1 test]# docker compose up -d
[+] Running 2/2✔ Network test_default  Created                                                             0.1s✔ Container leo         Started                                                             0.3s
#默认网络

指定使用bridge网络

services:test1:image: busybox:latestcontainer_name: leocommand: ["/bin/sh","-c","sleep 100000"]network_mode: bridge #还可以指定none网络

 test1:image: busybox:latestcontainer_name: leocommand: ["/bin/sh","-c","sleep 100000"]networks:- mynet1- mynet2networks:mynet1:driver: bridgemynet2:driver: bridge
[root@docker-node1 test]# docker exec -it leo sh

命令

覆盖容器启动时默认执行的命令。例如, command: python app.py 指定容器启动时运行 python app.py 命令。

[root@docker test]# vim busybox.yml
services:web:image: busyboxcontainer_name: busybox#network_mode: mynet2command: ["/bin/sh","-c","sleep10000000"]

2、网络

定义 Docker Compose 应用程序中使用的网络。可以自定义网络名称和驱动程序等属性。 默认情况下docker compose 在执行时会自动建立网络。

services:test:image: busybox:latestcontainer_name: tsetcommand: ["/bin/sh","-c","sleep 100000"]network_mode: defaultnetworks:default:external: truename: bridge
容器建立后会使用宿主机上的默认 “bridge” 网络进行通信
services:test:image: busybox:latestcontainer_name: tsetcommand: ["/bin/sh","-c","sleep 100000"]network_mode: defaulttest2:image: busybox:latestcontainer_name: tset2command: ["/bin/sh","-c","sleep 100000"]networks:- mynet1networks:default:external: truename: bridgemynet1:driver: bridge

services:test:image: busybox:latestcontainer_name: tsetcommand: ["/bin/sh","-c","sleep 100000"]network_mode: defaulttest2:image: busybox:latestcontainer_name: tset2command: ["/bin/sh","-c","sleep 100000"]networks:- mynet1- mynet2networks:default:external: truename: bridgemynet1:driver: bridgemynet2:ipam:driver: defaultconfig:- subnet: 172.26.0.0/24gateway: 172.26.0.254

3、存储卷

定义 Docker Compose 应用程序中使用的存储卷。可以自定义卷名称和存储位置等属性。

services:test:image: busyboxcommand: ["/bin/sh","-c","sleep 3000"]restart: alwayscontainer_name: busybox1volumes:- data:/test #挂在data卷- /etc/passwd:/tmp/passwd:ro #只读挂在本地文件到指定位置
volumes:data:name: leoma #指定建立卷的名字

四、容器编排实现haproxy和nginx负载均衡

容器编排实现 HAProxy 和 Nginx 负载均衡的工作原理如下:通过容器编排工具将 Nginx 容器实例和 HAProxy 容器部署在同一环境中。Nginx 容器作为后端服务器提供服务,HAProxy 容器处于前端,接收外部请求,根据预设的负载均衡策略将请求分发到不同的 Nginx 容器上,从而实现高效、可靠的流量分配,提高系统的整体性能和可用性。

HAProxy 服务: 作用:作为负载均衡器,负责将外部请求分发到后端的 Nginx 服务器(web1 和 web2)

web1 和 web2 服务(Nginx 服务器): 作用:作为后端服务器,提供实际的网页服务

internel 网络: 作用:用于连接内部的服务,即 web1 和 web2。这个网络使得这两个后端服务器可以相互通信,并且与 HAProxy 进行内部通信

extrnal 网络: 作用:连接外部世界和 HAProxy,使得外部客户端可以访问到负载均衡器,进而访问后端的 Nginx 服务器

data_web1 和 data_web2: 作用:用于存储 Nginx 服务器的网页数据,确保数据的持久性和可移植性

[root@docker-node1 test]# mkdir /var/lib/docker/volumes/conf[root@docker-node1 mnt]# rpm2cpio haproxy-2.4.17-3.el9.x86_64.rpm  | cpio -id[root@docker-node1 haproxy]# cp haproxy.cfg /var/lib/docker/volumes/conf/
[root@docker-node1 haproxy]# pwd
/mnt/etc/haproxy[root@docker-node1 conf]# vim haproxy.cfg
listen webserverbind *:80balance roundrobinserver web1 webserver1:80 check inter 3 fall 3 rise 5server web2 webserver2:80 check inter 3 fall 3 rise 5
[root@docker-node1 test]# docker compose -f haproxy.yml config
name: test
services:haproxy:container_name: haproxyimage: haproxy:2.3networks:extrnal: nullinternel: nullports:- mode: ingresstarget: 80published: "80"protocol: tcprestart: alwaysvolumes:- type: bind	# 卷的类型为绑定主机目录source: /var/lib/docker/volumes/conf/haproxy.cfg	# 主机上的源文件路径target: /usr/local/etc/haproxy/haproxy.cfg	# 容器内的目标路径bind:create_host_path: trueweb1:container_name: webserver1expose:- "80"image: nginx:latestnetworks:internel: nullrestart: alwaysvolumes:- type: volumesource: data_web1target: /usr/share/nginx/htmlvolume: {}web2:container_name: webserver2expose:- "80"image: nginx:latestnetworks:internel: nullrestart: alwaysvolumes:- type: volumesource: data_web2target: /usr/share/nginx/htmlvolume: {}
networks:extrnal:name: test_extrnaldriver: bridgeinternel:name: test_interneldriver: bridge
volumes:data_web1:name: data_web1data_web2:name: data_web2
[root@docker-node1 test]# docker compose -f haproxy.yml up -d
[+] Running 7/7✔ Network test_internel  Created                                                                                                                                              0.1s✔ Network test_extrnal   Created                                                                                                                                              0.1s✔ Volume "data_web1"     Created                                                                                                                                              0.0s✔ Volume "data_web2"     Created                                                                                                                                              0.0s✔ Container webserver2   Started                                                                                                                                              1.2s✔ Container haproxy      Started                                                                                                                                              1.1s✔ Container webserver1   Started                                                                                                                                              1.2s
[root@docker-node1 test]# docker compose -f haproxy.yml ps
NAME         IMAGE          COMMAND                   SERVICE   CREATED              STATUS                          PORTS
haproxy      haproxy:2.3    "docker-entrypoint.s…"   haproxy   About a minute ago   Restarting (1) 19 seconds ago
webserver1   nginx:latest   "/docker-entrypoint.…"   web1      About a minute ago   Up About a minute               80/tcp
webserver2   nginx:latest   "/docker-entrypoint.…"   web2      About a minute ago   Up About a minute               80/tcp

测试访问

[root@docker-node1 ~]# echo webserver2 > /var/lib/docker/volumes/data_web2/_data/index.html
[root@docker-node1 ~]# echo webserver1 > /var/lib/docker/volumes/data_web1/_data/index.html
[root@docker-node1 ~]# for i in {1..10};
> do
> curl 172.25.254.100
> done
webserver1
webserver2
webserver1
webserver2
webserver1
webserver2
webserver1
webserver2
webserver1
webserver2

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

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

相关文章

又一条地铁无人线开通!霞智科技智能清洁机器人正式“上岗”

2024年9月26日12时,又一条无人线开通运营,这是陕西省首条全自动无人驾驶地铁线路。该线路作为北跨战略的先行工程,是连接主城区与渭北地区的轨道交通快线,对优化城市总体空间布局、推动区域融合发展、促进沿线产业升级具有十分重要…

HBuilder X中搭建vue-cli项目(一)

一、前端项目结构 传统结构:一个项目中有很多HTML文件,一个HTML文件就是一个网页。他们之间彼此独立,互相没有联系,我们每次导入其它前端文件时,需要给每一个HTML文件都导入,需要导入的文件一旦过多,就会很麻烦,并且整体看来很乱。 现代结构:在一个nod…

相关数据库类型介绍

数据库类型可以根据不同的维度进行分类,但最常见的分类方式是将其分为关系型数据库(Relational Databases)和非关系型数据库(Non-Relational Databases),也称为NoSQL数据库。下面我将详细介绍这两种类型的数…

5.3 克拉默法则、逆矩阵和体积

本节是使用代数而不是消元法来求解 A x b A\boldsymbol x\boldsymbol b Axb 和 A − 1 A^{-1} A−1。所有的公式都会除以 det ⁡ A \det A detA, A − 1 A^{-1} A−1 和 A − 1 b A^{-1}\boldsymbol b A−1b 中的每个元素都是一个行列式除以 A A A 的行列式。…

机器学习-模型集成

文章目录 模型集成为什么要集成?模型集成要解决的问题主要的集成思想 Committees多个模型的结果进行融合。BaggingBagging 特点 BoostingAdaBoost算法过程 GBDT负梯度拟合 XGBoostXGBoost 参数通用参数booster 参数学习目标参数 模型保存 模型集成 三个臭皮匠顶一个…

Nginx的核心架构和设计原理

Nginx 是一个免费的、开源的、高性能 Http 服务器和反向代理。Nginx 的架构设计是为了提供高性能、稳定性和可扩展性。 Nginx 的主要架构组件和工作原理: 1、Master 进程:Nginx 的运行始于一个 master 进程,它负责管理所有的工作进程。mast…

MySQL递归查询笔记

目录 一、创建表结构和插入数据 二、查询所有子节点 三、查询所有父节点 四、查询指定节点的根节点 五、查询所有兄弟节点(同级节点) 六、获取祖先节点及其所有子节点 七、查询每个节点之间的层级关系 八、查询指定节点之间的层级关系 一、创建表…

Docker配置阿里云镜像加速器,拉取Tomcat,使用云服务器访问Tomcat容器

一、简介与概述 1.Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。 Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。 2. Doc…

数据结构编程实践20讲(Python版)—03栈

本文目录 03 栈 StackS1 说明S2 示例基于列表的实现基于链表的实现 S3 问题:复杂嵌套结构的括号匹配问题求解思路Python3程序 S4 问题:基于栈的阶乘计算VS递归实现求解思路Python3程序 S5 问题:逆波兰表示法(后缀表达式)求值求解思路Python3程…

华为GaussDB数据库之Yukon安装与使用

一、Yukon简介 Yukon(禹贡),基于openGauss、PostgreSQL、GaussDB数据库扩展地理空间数据的存储和管理能力,提供专业的GIS(Geographic Information System)功能,赋能传统关系型数据库。 Yukon 支…

Go基础编程 - 15 - 延迟调用(defer)

延迟调用 defer 1. 特性2. 常用用途3. defer 执行顺序:同函数内先进后出4. defer 闭包5. defer 陷阱 上一篇:泛型 1. 特性 1. 关键字 defer 用于注册延迟调用。 2. defer 调用直到 return 前才被执行。 3. 同函数内多个 defer 语句,按先进后…

怎么绕开华为纯净模式安装软件

我是标题 众所周不知,华为鸿蒙系统自带纯净模式,而且 没法关闭 : ) 我反正没找到关闭键 以前或许会有提示,无视风险,“仍要安装”。但我这次遇到的问题是,根本没有这个选项,只有“应用市场”和“取消”&…

数据结构:二叉树的遍历和线索二叉树

二叉树的遍历 二叉树的遍历是二叉树的一种重要的操作,指按照某种顺序访问树中的每个节点,并且每个节点仅被访问一次。常见的遍历方式有四种:前序遍历、中序遍历、后序遍历和层次遍历(或称为广度优先遍历)。 二叉树的…

物联网系统中LCD屏主流驱动方案详解

01 物联网系统中为什么要使用LCD驱动芯片 在物联网系统中使用LCD驱动芯片的原因主要有以下几点: 节省资源 1、减少IO端口占用:在物联网设备中,单片机或其他主控芯片的IO资源通常非常有限。LCD驱动芯片可以通过简单的接口(如SP…

基于Hive和Hadoop的白酒分析系统

本项目是一个基于大数据技术的白酒分析系统,旨在为用户提供全面的白酒市场信息和深入的价格分析。系统采用 Hadoop 平台进行大规模数据存储和处理,利用 MapReduce 进行数据分析和处理,通过 Sqoop 实现数据的导入导出,以 Spark 为核…

jenkins项目发布基础

随着软件开发需求及复杂度的不断提高,团队开发成员之间如何更好地协同工作以确保软件开发的质量已经慢慢成为开发过程中不可回避的问题。Jenkins 自动化部署可以解决集成、测试、部署等重复性的工作,工具集成的效率明显高于人工操作;并且持续集成可以更早的获取代码变更的信息,…

从Linux系统的角度看待文件-基础IO

目录 从Linux系统的角度看待文件 系统文件I/O open write read 文件操作的本质 vim中批量注释的方法 从Linux系统的角度看待文件 关于文件的共识: 1.空文件也要占用磁盘空间 2.文件内容属性 3.文件操作包括文件内容/文件属性/文件内容属性 4.文件路径文…

【Qt】前后端交互---DataCenter类

设计目的 前后端交互系统中,创建并使用数据核心类的目的就是让该类作为客户端的数据中心,也就是说其负责管理客户端的所有数据与服务器的网络通信。 数据持久化 初始化数据文件 该函数设计的目的就是用于检查所需要的文件和目录是否存在,如…

短视频矩阵系统源码开发/矩阵系统OEM搭建--源代码开发经验分享

短视频矩阵系统开发策略 短视频矩阵系统源码的原生开发方法 一、基于原生技术的短视频矩阵系统开发途径 原生编程语言:采用各平台专有的编程语言及开发工具,如iOS平台的Swift或Objective-C,以及平台的Java或Kotlin,确保应用性能与…

[贪心+数学/数学+位运算] 两种方法O(1)解决 消减整数

标题:[贪心数学/数学位运算] 两种方法O(1)解决 消减整数 个人主页水墨不写bug 目录 一、题目:消减整数(Newcoder) 二、题目分析 1.理解题意: 2.解决问题 解法详解一:贪心数学 解法一参考代码: 解法详解二&#xf…