容器编排工具Docker Compose

news/2024/9/28 12:20:27/

目录

一、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.ppmy.cn/news/1531524.html

相关文章

OpenCV 进行图像分割

介绍 图像分割是将数字图像划分互不相交的区域的过程,它可以降低图像的复杂性,从而使分析图像变得更简单。 图像分割技术 阈值法 基于边缘的分割 基于区域的分割 基于聚类的分割 基于分水岭的方法 基于人工神经网络的分割 在这里,我们选择基于聚类的分割 与分类算法不同,…

Python 多进程解析:Multiprocessing 高效并行处理的奥秘

Python 多进程解析:Multiprocessing 高效并行处理的奥秘 文章目录 Python 多进程解析:Multiprocessing 高效并行处理的奥秘一 多进程1 导入进程标准模块2 定义调用函数3 创建和启动进程 二 存储进程结果 Queue三 threading & multiprocessing 对比1 …

Mbox物联网关:驱动工业数据汇聚与智能处理的核心引擎

在数字化转型的汹涌浪潮中,Mbox物联网关作为工业物联网领域的佼佼者,正引领着制造业向智能化、高效化方向迈进,深刻重塑着传统工业的生产生态与效率边界。作为连接物理世界与数字世界的智能桥梁,明达技术自主研发的Mbox物联网关在…

基于Java开发的(控制台)模拟的多用户多级目录的文件系统

多级文件系统 1 设计目的 为了加深对文件系统内部功能和实现过程的理解,设计一个模拟的多用户多级目录的文件系统,并实现具体的文件物理结构、目录结构以及较为完善的文件操作命令集。 2 设计内容 2.1系统操作 操作命令风格:本文件系统的…

维权成功!

阅读本文大概需要 1.26 分钟 周五了,简单聊几句。是这样的,前些天看后台私信的时候,发现有读者私信关键词「截图」「后台截图」之类的,我一下就知道是怎么回事了,估计也就我星球里的球友或者较早点的老读者能 get 到这…

基于 LangChain 的自动化测试用例的生成与执行

应用价值 通过人工智能代替人工操作的部分,节省时间,提升效率。通过封装更多的 Tools,让 Agent 更为智能。 实践演练 实现原理 实现思路 在理解需求之后,我们可以了解到我们需要让 Agent 具备两个功能: 输入源码信…

尚硅谷vue3+TypeScript笔记大全

1. Vue3简介 2020年9月18日,Vue.js发布版3.0版本,代号:One Piece(n 经历了:4800次提交、40个RFC、600次PR、300贡献者 官方发版地址:Release v3.0.0 One Piece vuejs/core 截止2023年10月,最…

GLM-4-9B 是智谱 AI 推出的预训练模型 GLM-4 系列中的开源版本

根据glm4的项目介绍 GLM-4-9B 是智谱 AI 推出的预训练模型 GLM-4 系列中的开源版本。 在语义、数学、推理、代码和知识等多方面的数据集测评中, GLM-4-9B 及其人类偏好对齐的版本 GLM-4-9B-Chat 均表现出超越 Llama-3-8B 的卓越性能。除了能进行多轮对话&#xff0c…