容器编排工具Docker Compose

news2024/12/22 22:32:52

目录

一、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: nginx
    ports:
      - "80:80"


  db:
    image: mysql:5.7
    environment:
      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.yml
  services:
  test1:
    image: test1
    build:
      context: /root/docker
      dockerfile: Dockerfile
    command: ["/bin/sh","-c","sleep 100000"]
    container_name: leo1
  test2:
    image: test2
    build:
      context: /root/docker
      dockerfile: leo
    command: ["/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:nginx
 mysql:
   images:mysql:5.7

端口映射

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

services:
  test1:
    image: test1
    build:
      context: /root/docker
      dockerfile: Dockerfile
    command: ["/bin/sh","-c","sleep 100000"]
    container_name: leo1
    expose:
      - 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   leo1

services:
  test1:
    image: nginx
    container_name: webserver
    expose:
      - 1234
    ports:
      - "80:80"
[root@docker-node1 test]# curl 172.25.254.100

环境变量

services:
 web:
   images:mysql:5.7
   environment:
     MYSQL_ROOT_PASSWORD: leo
     
docker inspect

存储卷

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

services:
 test:
   image: busybox
   command: ["/bin/sh","-c","sleep 3000"]
   restart: always
   container_name: busybox1
   volumes:
     - /etc/passwd:/tmp/passwd:ro #只读挂在本地文件到指定位置

网络

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

services:
  test1:
    image: busybox:latest
    container_name: leo
    command: ["/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:latest
    container_name: leo
    command: ["/bin/sh","-c","sleep 100000"]
    network_mode: bridge #还可以指定none网络

 test1:
    image: busybox:latest
    container_name: leo
    command: ["/bin/sh","-c","sleep 100000"]
    networks:
      - mynet1
      - mynet2

networks:
  mynet1:
    driver: bridge

  mynet2:
    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: busybox
   container_name: busybox
   #network_mode: mynet2
   command: ["/bin/sh","-c","sleep10000000"]

2、网络

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

services:
  test:
    image: busybox:latest
    container_name: tset
    command: ["/bin/sh","-c","sleep 100000"]
    network_mode: default

networks:
  default:
    external: true
    name: bridge
容器建立后会使用宿主机上的默认 “bridge” 网络进行通信
services:
  test:
    image: busybox:latest
    container_name: tset
    command: ["/bin/sh","-c","sleep 100000"]
    network_mode: default

  test2:
    image: busybox:latest
    container_name: tset2
    command: ["/bin/sh","-c","sleep 100000"]
    networks:
      - mynet1


networks:
  default:
    external: true
    name: bridge

  mynet1:
    driver: bridge

services:
  test:
    image: busybox:latest
    container_name: tset
    command: ["/bin/sh","-c","sleep 100000"]
    network_mode: default

  test2:
    image: busybox:latest
    container_name: tset2
    command: ["/bin/sh","-c","sleep 100000"]
    networks:
      - mynet1
      - mynet2


networks:
  default:
    external: true
    name: bridge

  mynet1:
    driver: bridge

  mynet2:
    ipam:
      driver: default
      config:
        - subnet: 172.26.0.0/24
          gateway: 172.26.0.254

3、存储卷

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

services:
 test:
   image: busybox
   command: ["/bin/sh","-c","sleep 3000"]
   restart: always
   container_name: busybox1
   volumes:
     - 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 webserver
  bind *:80
  balance roundrobin
  server web1 webserver1:80 check inter 3 fall 3 rise 5
  server 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: haproxy
    image: haproxy:2.3
    networks:
      extrnal: null
      internel: null
    ports:
      - mode: ingress
        target: 80
        published: "80"
        protocol: tcp
    restart: always
    volumes:
      - type: bind	# 卷的类型为绑定主机目录
        source: /var/lib/docker/volumes/conf/haproxy.cfg	# 主机上的源文件路径
        target: /usr/local/etc/haproxy/haproxy.cfg	# 容器内的目标路径
        bind:
          create_host_path: true
  web1:
    container_name: webserver1
    expose:
      - "80"
    image: nginx:latest
    networks:
      internel: null
    restart: always
    volumes:
      - type: volume
        source: data_web1
        target: /usr/share/nginx/html
        volume: {}
  web2:
    container_name: webserver2
    expose:
      - "80"
    image: nginx:latest
    networks:
      internel: null
    restart: always
    volumes:
      - type: volume
        source: data_web2
        target: /usr/share/nginx/html
        volume: {}
networks:
  extrnal:
    name: test_extrnal
    driver: bridge
  internel:
    name: test_internel
    driver: bridge
volumes:
  data_web1:
    name: data_web1
  data_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.coloradmin.cn/o/2171898.html

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

相关文章

Linux系统进程控制

目录 一、进程创建 1.进程创建过程 2.写时拷贝 3.fork函数的两种常规用法 二、进程终止 1.进程终止的三种情况 2.进程退出信息 (1)退出码 (2)退出信号 3.进程终止的方式 三、进程等待 1.为什么要有进程等待&#xff1f…

成都睿明智科技有限公司赋能商家高效变现

在这个日新月异的数字时代,抖音电商正以不可阻挡之势崛起,成为众多品牌与商家竞相角逐的新战场。在这片充满机遇与挑战的蓝海中,成都睿明智科技有限公司如同一颗璀璨新星,凭借其专业的服务、创新的策略和敏锐的市场洞察&#xff0…

C++你不得不知道的(1)

C你不得不知道的&#xff08;1&#xff09; 【1】引例&#xff1a; 1、C语言在使用的过程中存在冲突问题&#xff01; 解决办法&#xff1a;使用域将想要使用的变量包括进去。 #include<stdio.h> int rand10; int main() {printf("%d\n",rand);return 0; }此…

VS Code激活python虚拟环境常见报错

VS Code激活python虚拟环境常见报错 问题1&#xff1a;执行激活 activate 报错 问题1&#xff1a;执行激活 activate 报错 解决&#xff1a; Win X *执行 set-executionpolicy remotesigned 再输入 Y

【智慧城市】新中地GIS开发实训项目:华农优秀学生学习成果展示(3)智游江城

华农GIS开发实训项目答辩③-智游江城/一个月学习成果展示 项目名称&#xff1a;智游江城 项目功能 主页面展示 菜单功能 控制台 3D城市 查询 导航 游览路线推荐 测量 资讯

Colorful/七彩虹将星X15 AT 23 英特尔13代处理器 Win11原厂OEM系统 带COLORFUL一键还原

安装完毕自带原厂驱动和预装软件以及一键恢复功能&#xff0c;自动重建COLORFUL RECOVERY功能&#xff0c;恢复到新机开箱状态。 【格式】&#xff1a;iso 【系统类型】&#xff1a;Windows11 原厂系统下载网址&#xff1a;http://www.bioxt.cn 注意&#xff1a;安装系统会…

DataWhale x南瓜书学习笔记 task04笔记

线性判别分析&#xff08;LDA&#xff09; 前提假设&#xff1a;各类样本的协方差矩阵相同且满秩LDA的思想&#xff1a;1.设法让训练样例集投影到一条直线上&#xff0c;2.同类样例的投影点尽可能接近&#xff0c;异类样例的投影点尽可能远离&#xff0c;3.在对新样本进行分类时…

嘻哈纸片人仿手绘插画!FLUX一键生成方法!

​ ​ ​ 如何生成这种嘻哈纸片人的仿手绘插画&#xff1f; 只需1个lora&#xff0c;3个步骤&#xff01; 接下来我们来具体的说一下操作方法以及lora使用注意 嘻哈纸片人lora 基于FLUX模型训练 在线使用&下载地址&#xff1a; https://www.liblib.art/modelinfo/53ee…

全新一区PID搜索算法+TCN-LSTM+注意力机制!PSA-TCN-LSTM-Attention多变量时间序列预测(Matlab)

全新一区PID搜索算法TCN-LSTM注意力机制&#xff01;PSA-TCN-LSTM-Attention多变量时间序列预测&#xff08;Matlab&#xff09; 目录 全新一区PID搜索算法TCN-LSTM注意力机制&#xff01;PSA-TCN-LSTM-Attention多变量时间序列预测&#xff08;Matlab&#xff09;效果一览基本…

网络与信息安全工程师(工信部教育与考试中心)

在当今数字化时代&#xff0c;大量的敏感信息与业务流程在网络上传输和处理&#xff0c;使得网络与信息安全成为保障企业运营、政务管理以及金融交易等关键领域不可忽视的一环。 因此&#xff0c;对网络安全专家的需求日益增长。 例如&#xff0c;金融机构、大型电信运营商以…

【AI战略思考5】工欲善其事,必先利其器。我的利器是什么?

目录 导言1.不要忽视时间本身复利的巨大威力2.只赚自己认知以内的钱&#xff0c;只把握自己能力以内的机会3.多做有难度的事来激发自己的潜力和提升自己4.学会抵制诱惑5.减少冗余思考和冗余操作 导言 工欲善其事&#xff0c;必先利其器。我的利器是什么&#xff1f; 虽然我中考…

从零开始搭建UVM平台(二)-加入factory机制

书接上回&#xff1a; 从零开始搭建UVM平台&#xff08;一&#xff09;-只有uvm_driver的验证平台 加入factory机制 前面搭建的平台其实一点都没有用到uvm的特性。 加入factory机制的明显两个优点&#xff1a;&#xff08;1&#xff09;不用自己手动例化类&#xff1b;&…

目标价已被华尔街投行大幅下调,Workday股票还能买入吗?

猛兽财经核心观点&#xff1a; &#xff08;1&#xff09;Needham已经将Workday的目标价下调至300美元&#xff0c;但维持“买入”评级。 &#xff08;2&#xff09;Workday第二季度的财务业绩虽然很强劲的&#xff0c;但面临客户群员工增长疲软挑战。 &#xff08;3&#xff0…

C语言语句、语句分类及注释

文章目录 一、语句和语句分类二、注释&#x1f355;注释是什么&#xff1f;为什么写注释&#xff1f;1. /**/的形式2. //的形式3. 注释会被替换 三、随机数的生成1.rand函数2.srand函数3.time函数4.设置随机数的范围 四、C99中的变长数组五、问题表达式解析表达式1表达式2表达式…

嵌入式的核心能力-Debug调试能力(一)

一、栈回溯 引入&#xff1a;调试程序时&#xff0c;经常会发生这类错误&#xff1a; 读写某个地址&#xff0c;程序报错&#xff1b;调用某个空函数&#xff0c;导致程序报错等等。 解决方法是&#xff0c;可以利用异常处理函数去打印出“发生错误瞬间”的所有寄存器地址 …

网络编程(1)——同步读写api

一、day1 学习了服务器和客户端socket的建立、监听以及连接。 &#xff08;1&#xff09;socket的监听和连接 服务端 1&#xff09;socket——创建socket对象。 2&#xff09;bind——绑定本机ipport。 3&#xff09;listen——监听来电&#xff0c;若在监听到来电&#x…

人脸遮挡检测系统源码分享

人脸遮挡检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vis…

基于微信小程序的特色乡村综合展示平台设计与实现(源码+文档+讲解开发)

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

C++入门基础知识89(实例)——实例14【创建各类三角形图案】

成长路上不孤单&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a; 【14后&#x1f60a;///C爱好者&#x1f60a;///持续分享所学&#x1f60a;///如有需要欢迎收藏转发///&#x1f60a;】 今日分享关于创建各类三角形图案的相关内容&#xff…

怎样用云手机进行TikTok矩阵运营?

在运营TikTok矩阵时&#xff0c;许多用户常常面临操作复杂、设备过多等问题。如果你也感到操作繁琐&#xff0c;不妨考虑使用云手机。云手机具备丰富的功能&#xff0c;能够帮助电商卖家快速打造高效的TikTok矩阵。接下来&#xff0c;我们将详细解析这些功能如何提升你的运营效…