Docker:容器编排 Docker Compose

news2024/11/5 8:39:12

Docker:容器编排 Docker Compose

    • docker-compose
    • docker-compose.yml
      • services
      • image
      • command
      • environment
      • networks
      • volumes
      • ports
      • healthcheck
      • depends_on
    • 命令
      • docker compose up
      • docker compose down
      • 其它


docker-compose

多数情况下,一个服务需要依赖多个服务,而这多个服务需要部署在不同的容器内部,这就涉及到多个容器的启动问题。比如容器之间的依赖关系,镜像版本,启动命令等等问题。

这导致多容器启动会比较麻烦,为此Docker官方推出了开源项目docker-compose,其使用python编写,实现多个容器的启动问题。

docker-compose的使用,基于docker-compose.yml文件,只要会编写这个文件,就可以命令一次性快速启动多个容器。


docker-compose.yml

后续称docker-compose.yml.yml文件。

services

.yml文件中,用services表示服务,一个services下可以有多个容器。

services:
  service_1:
    ...
  service_2:
    ...
  service_3:
    ...

# 一行注释

其中service_1service_2service_3是三个服务,其实就是三个容器。

docker中,推荐使用两个空格换行缩进,使用#注释。


image

  • 功能:指定容器运行的镜像

每个service中,必须带有image选项,容器必须基于镜像创建。

语法:

services:
  服务名:
    image: 镜像名:tag

示例:

services:
  service_1:
    image: redis
  service_2:
    image: mysql:5.7
  service_3:
    image: nginx

指定镜像时,可以通过:tag指定版本。以上代码,可以同时启动三个容器。

.yml文件所处目录下,使用docker compose up -d可以快速启动容器,这个命令在稍后讲解。

在这里插入图片描述

通过输出,可以看到三个容器创建成功了,但是docker ps只能看到两个容器。这是因为mysql容器在创建时必须指定一个环境变量,配置root的密码。

容器名称为compose-service_1-1compose-service_2-1,前面的compose的当前的目录名称,中间是服务名称,也就是指定的services,最后是一个编号。

启动的容器命名规则如下:

所处目录名-服务名-编号

command

  • 功能:指定容器启动时执行的命令

语法:

services:
  服务名:
    command: 命令 选项1 选项2

services:
  服务名:
    command: ["命令", "选项1", "选项2"]

指定指令时,可以直接将完整的指令写在command后面,也可以按照数组形式[],一个一个输入选项。

示例:

services:
  service_1:
    image: redis
    command: ls -l -a
  service_2:
    image: redis
    command: ["ls", "-l", "-a"]

environment

  • 功能:指定容器的环境变量

语法:

services:
  服务名:
    environment:
      env1: value1
      env2: value2
      env3: value3

services:
  服务名:
    environment:
      - env1=value1
      - env2=value2
      - env3=value3

指定环境变量有两种语法,第一种是直接在environment后面添加key:value形式的环境变量,另一种是- key=value的形式。

比如mysql启动时,就需要指定环境变量,来设置root用户的密码:

services:
  service_1:
    image: mysql:5.7
    environment:
      - MYSQL_ROOT_PASSWORD=123456

启动mysql服务:

在这里插入图片描述

这一次mysql就启动成功了,因为环境变量配置成功。


networks

  • 功能:指定容器的网络

语法:

services:
  服务名:
    networks:
      - 网络

networks:
  网络:
  	driver: 网络类型
  网络:
  	driver: 网络类型

在服务中,可以通过networks指定要使用的网络,以- 网络名的形式。

  • 创建网络:

如果网络不存在,可以在services同级的区域,创建一个networks指定要创建的网络。通过driver指定网络的类型,如果不指定,那么默认为bridge网络。

示例:

services:
  service_1:
    image: nginx
    networks:
      - test_net

networks:
  test_net:

以上代码,创建了一个网络test_net,这个网络没用进行任何属性配置,默认为bridge网络。虽然没用进行属性配置,test_net:的冒号依然不能省略。

输出结果:

在这里插入图片描述

服务启动后,多出一个compose_test_net网络,这就是刚才创建的网络。

这个网络名称是自动生成的,如果想要自己指定网络名,可以在创建网络时通过name属性指定:

networks:
  网络:
    name:网络名
  • 加入网络:

如果想要加入一个现有的网络,不能写为如下格式:

services:
  服务名:
    networks:
      - 现有网络名

就算是现有网络,也要在services同级的networks下指明:

services:
  service_1:
    networks:
      - 网络A
networks:
  网络A:
    external: true
    name: 现有网络名

services同级的networks下,不仅可以创建一个新的网络,还可以通过external: true来指定一个已有网络,表示当前网络复用了已有网络,在name中指定已有网络名。

  • 默认网络:

如果指定的网络类型为hostnone或者默认桥接网络bridge,不能写为如下格式:

services:
  服务名:
    networks:
      - host
  服务名:
	networks:
      - none
  服务名:
    networks:
      - bridge

使用hostnone网络需要指定network_mode

services:
  服务名:
    network_mode: host
  服务名:
    network_mode: none
  服务名:
    network_mode: bridge

volumes

  • 功能:指定容器的存储卷

语法:

volume:
  存储卷名:
  
services:
  服务名:
    volumes:
      - type: volume
        source: 存储卷名
        target: 容器内绑定地址
      - type: bind
        source: 宿主机绑定地址
        target: 容器内绑定地址

通过volumes绑定存储卷,在下一级缩进中,指定要绑定的存储卷。

可以一次性绑定多个存储卷,使用-区分不同存储卷的属性。

- type: volume
  source: 存储卷名
  target: 容器内绑定地址

type指定存储卷的类型,如果类型为volume卷,那么source填入存储卷的名称,target填入容器中存储卷要绑定的地址。

这个存储卷名可以是一个已有的存储卷,如果存储卷不存在,可以在services同级缩进之前,创建一个存储卷:

volume:
  存储卷名:

这和网络类似,不指定任何参数默认创建一个volume类型存储卷。

- type: bind
  source: 宿主机绑定地址
  target: 容器内绑定地址

如果使用绑定卷,那么source变为宿主机地址,target依然是容器内部的地址。

示例:

volumes:
  test-vm:

services:
  service_1:
    image: nginx
    volumes:
      - type: volume
        source: test-vm
        target: /var/lib/html

以上.yml创建了一个存储卷test-vm,并在service_1使用了这个存储卷。

输出结果:

在这里插入图片描述

服务启动后,多出了一个compose_test-vm存储卷,也就是目录名-存储卷名的格式。

  • 短语法

除此之外,存储卷还有短语法:

services:
  服务名:
    volumes:
      - "存储卷名称:容器路径" # 数据卷
      - "宿主机路径:容器路径" # 绑定卷

ports

  • 功能:指定容器的端口映射

语法:

services:
  服务名:
    ports:
      - "A"       # 容器的端口A 映射到 宿主机的端口A 
      - "A-B"     # 容器A-B的端口 映射到 宿主机A-B的端口
      - "A:B"     # 容器的端口B 映射到 宿主机的端口A
      - "A-B:C-D" # 容器C-D的端口 映射到 宿主机A-B的端口
      - "A:B/udp" # 容器的端口B 映射到 宿主机的端口A 使用UDP协议
      - "A:B/tcp" # 容器的端口B 映射到 宿主机的端口A 使用TCP协议

其中ABCD等符号都代指端口号。


healthcheck

  • 功能:检查容器健康状态

语法:

services:
  服务名:
    healthcheck:
      test: 测试命令
      interval: 探测间隔
      timeout: 超时时间
      retries: 检测次数

所谓的健康检查healthcheck,其实就是执行一个测试命令,如果命令执行成功,那么这个容器就算健康。

test指定要测试的命令,每次检测最多等timeout时间,如果超出时间视为检测失败,最多重复检测retries次,每次间隔interval

示例:

services:
  service_1:
    image: mysql:5.7
    environment:
      - MYSQL_ROOT_PASSWORD=123456
    healthcheck:
      test: mysql --user=root --password='123456' -e "SELECT 1;"
      interval: 3s
      timeout: 5s
      retries: 5

这是一个mysql容器的健康检测,执行一个查询语句SELECT 1,这个语句没有任何意义,只要执行成功说明用户名密码,以及mysql都是正常的。

最多检测五次,每次五秒,多次检测间隔三秒。

在这里插入图片描述

启动之后,通过docker ps查看容器,发现STATUS栏多出一个小括号(health: starting),表示这个容器正在检测健康。

在这里插入图片描述

一段时间后,健康状态变为healthy,表示健康检测完成,这个容器是健康的。


depends_on

  • 功能:设置容器间的依赖关系

语法:

services:
  服务名:
    depends_on:
      - 服务名
      - 服务名

depends_on后面,以列表的形式写出依赖的服务,只有依赖的服务都启动了,才会启动该服务。

除此之外,还可以指定健康检查:

services:
  服务名:
    depends_on:
      服务名:
        condition: service_healthy
      服务名:
        condition: service_started

如果设置condition: service_started,表示只要容器启动了那么当前服务就可以开始。如果设置condition: service_healthy,表示容器启动后还要通过健康检查,只有检查结果为healthy才能启动当前容器。

示例:

services:
  redis:
    image: redis
    depends_on:
      mysql:
        condition: service_healthy
  mysql:
    image: mysql:5.7
    environment:
      - MYSQL_ROOT_PASSWORD=123456
    healthcheck:
      test: mysql --user=root --password=123456 -e "SELECT 1;"
      interval: 3s
      timeout: 5s
      retries: 5

以上.yml,启动了一个redismysql容器,其中redis依赖mysql,并且需要mysql进行健康检查。

启动结果:

在这里插入图片描述

首先mysql进入了waiting状态,这是正在进行健康检查,redis容器已经创建完毕,但是还没有启动。

在这里插入图片描述

当检测完mysql状态为healthyredis才进入start状态,说明确实先启动了mysql后启动redis


命令

docker compose的命令使用一致的格式:

docker compose [option] command [args...]

选项:

  • -f:指定文件,如果不指定,默认为当前目录下的docker-compose.yml文件
  • -p:指定项目名称,如果不指定,默认以当前目录名作为项目名称

docker compose up

  • 功能:拉取镜像,创建服务,启动服务,完成创建容器的所有步骤
docker compose up [option]

选项:

  • -d:在后台运行容器,常用选项

先测试一下-f选项:

在这里插入图片描述

在当前目录下,有一个other文件,可以通过-f来指定通过这个文件启动容器。默认情况下会默认去找名为docker-compose.yml的文件来启动容器,通过-f可以改变文件。

在这个过程中,创建的两个容器分别叫做compose-mysql-1compose-redis-1,这是因为当前的目录名称为compose,容器名默认为项目名-服务名-编号,如果不指定项目名称,以目录名称为项目名称。

可以通过-p选项指定项目名:

在这里插入图片描述

此处指定项目名称为new_name,那么两个容器名的前缀也就变为了new_name-xxx


docker compose down

  • 功能:删除由docker compose创建的服务
docker compose down [option]

选项:

  • -v:删除容器的同时删除存储卷

其它

除去以上两个最重要的命令,还有很多其它的命令:

命令功能
docker compose build构建服务
docker compose config规范的格式来显示服务配置
docker compose cp在本地系统和服务容器直接拷贝文件
docker compose create创建服务的容器
docker compose down停止所有容器,并删除容器
docker compose events从服务器获取实时事件
docker compose exec在容器中执行命令
docker compose images列出所有容器使用的镜像
docker compose kill强制停止服务的容器
docker compose logs显示日志
docker compose ls显示所有项目
docker compose pause暂停服务
docker compose port列出所有的端口映射
docker compose ps该命令可以列出项目中目前的所有容器
docker compose pull拉取服务镜像
docker compose push推送服务镜像
docker compose restart重启或者重启某个服务
docker compose rm删除服务停止的容器
docker compose run在指定服务容器上执行相关的命令
docker compose start启动当前停止的某个容器
docker compose stop停止当前运行的某个容器
docker compose top显示运行的进程
docker compose unpause恢复服务

这些命令看似很多,但是其实和docker container的命令是高度重合的。使用docker container执行命令时,只作用于指定容器,但是docker compose的命令,作用于服务内的所有容器。

例如top

在这里插入图片描述

执行时会把所有服务内部的进程都列举出来。

logs命令:

在这里插入图片描述

其会输出所有服务的日志,包括mysqlredis


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

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

相关文章

.net Core 使用Panda.DynamicWebApi动态构造路由

我们以前是通过创建controller来创建API,通过controller来显示的生成路由,这里我们讲解下如何不通过controller,构造API路由 安装 Panda.DynamicWebApi 1.2.2 1.2.2 Swashbuckle.AspNetCore 6.2.3 6.2.3添加ServiceAction…

交换机如何实现2.5G网络传输速率和网络变压器有关吗

华强盛电子导读:I19926430038 交换机实现2.5G网络传输速率涉及多个因素,其中包括硬件设计、端口支持、传输介质以及网络协议等。网络变压器在其中扮演了一个重要的角色,但并不是唯一的因素。 1. **硬件设计**:交换机需要有支持2.…

Chrome 130 版本开发者工具(DevTools)更新内容

Chrome 130 版本开发者工具(DevTools)更新内容 一、网络(Network)面板更新 1. 重新定义网络过滤器 网络面板获新增了一些过滤条件,这些过滤条件是根据反馈重新设计的,特定于类型的过滤条件保持不变&…

JAVA设计模式之【建造者模式】

1 定义 建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 2 类图 产品类(Product):表示被创建的复杂…

百度如何打造AI原生研发新范式?

👉点击即可下载《百度AI原生研发新范式实践》资料 2024年10月23-25日,2024 NJSD技术盛典暨第十届NJSD软件开发者大会、第八届IAS互联网架构大会在南京召开。本届大会邀请了工业界和学术界的专家,优秀的工程师和产品经理,以及其它行…

算法|牛客网华为机试31-40C++

牛客网华为机试 上篇:算法|牛客网华为机试21-30C 文章目录 HJ31 单词倒排HJ32 密码截取HJ33 整数与IP地址间的转换HJ34 图片整理HJ35 蛇形矩阵HJ36 字符串加密HJ37 统计每个月兔子的总数HJ38 求小球落地5次后所经历的路程和第5次反弹的高度HJ39 判断两个IP是否属于同…

UI自动化测试 —— CSS元素定位实践!

前言 自动化测试元素定位是指在自动化测试过程中,通过特定的方法或策略来准确识别和定位页面上的元素,以便对这些元素进行进一步的操作或断言。这些元素可以是文本框、按钮、链接、图片等HTML页面上的任何可见或不可见的组件。 在自动化测试中&#xf…

【实战篇】requests库 - 有道云翻译爬虫 【附:代理IP的使用】

目录 〇、引言一、目标二、请求参数分析三、响应分析四、编写爬虫脚本【隧道代理的使用】 〇、引言 无论是学习工作、旅游出行、跨境电商、日常交流以及一些专业领域都离不开翻译工具的支持。本文就带大家通过爬虫的方式开发一款属于自己的翻译工具~ 一、目标 如下的翻译接口…

Spring框架的声明式事务

目录 一.配置文件的方式 1.配置文件 2.业务层 3.持久层 4.测试类 5.运行 6.查看数据库 7.出现异常运行 二.半注解的方式 1.配置文件 2.db.properties 3.持久层 4.业务层 5.测试类 6.运行 7.查看数据库 8.加上异常 三.纯注解的方式 1.持久层 2.业务层 3.配置…

电脑开机显示无信号然后黑屏怎么办?

当我们打开电脑时,遇到电脑屏幕出现了无信号并且黑屏,常常会让我们感到困扰。很多朋友都会遇到显示器无信号的情况,其实这种故障是很好解决的,但是电脑小白,并不知道电脑屏幕显示无信号然后黑屏了要怎么去修复。不用担…

Ubuntu-22.04 虚拟机安装

1. Ubuntu安装方式 1.1. 基于物理介质安装 光盘安装:通过将 Ubuntu 镜像刻录到光盘,在计算机 BIOS/UEFI 中设置光盘为第一启动项,然后按照安装程序的提示进行语言选择、分区、用户信息设置等操作来完成安装。这种方式需要有光盘刻录设备和空…

51c~Pytorch~合集3

我自己的原文哦~ https://blog.51cto.com/whaosoft/12320861 一、pytorch开发基础相关 首先 PyTorch 的安装可以根据官方文档进行操作:(根据自己cuda版本不同 安装版本也不太一样啊 自己注意) ​​https://pytorch.org/​​ pip install…

vue3.5+版本 defineProps响应式解构,保留数据响应式

正确写法:直接通过 defineProps 结构可以保留响应式 let {num:numNew} defineProps({num: {} }) console.log(具有响应式,numNew); 错误写法:这样会丢失响应式 const props defineProps({num: {} }) let {num:numNew} props console.log(会丢失响…

讲讲⾼并发的原则?

大家好,我是锋哥。今天分享关于【讲讲⾼并发的原则?】面试题。希望对大家有帮助; 讲讲⾼并发的原则? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 高并发是指系统在同一时间内能够处理大量请求的能力。要有效地管理…

基于python flask的知乎问答文本分析与情感预测系统

摘要 本项目旨在构建一个基于Python Flask框架的知乎问答文本分析与情感预测系统。该系统的主要功能包括从知乎平台获取问答内容、对文本进行自然语言处理、情感分析以及结果的可视化展示。通过这个系统,用户可以方便地输入特定问题,系统将自动抓取相关…

【连续多届检索,ACM出版】第四届大数据、人工智能与风险管理国际学术会议 (ICBAR 2024,11月15-17)--冬季主会场

第四届大数据、人工智能与风险管理国际学术会议 (ICBAR 2024)--冬季主会场 2024 4th International Conference on Big Data, Artificial Intelligence and Risk Management 会议官网:www.icbar.net 2024 4th International Conference on Big Data, Artificial I…

HarmonyOS NEXT 应用开发实战(十、从零设计一款个人中心页面详细示例)

随着HarmonyOS的不断发展,越来越多的开发者开始关注这个平台上的应用开发。本篇文章将详细讲解如何从零开始设计一款个人中心页,并在代码中实现其相关功能。 1. 项目结构设计 首先,我们需要设计一个合理的项目结构。我们将个人中心页面分为几…

Socket篇(网络通信)

目录 一、UDP 通信 1. 简介 2. UDP 编程的两个实现类 DatagramSocket DatagramPacket 3. 代码示例 示例一:一发/一收 发送端 接收端 示例二:多发/多收 发送端 接收端 示例三:多发/多收 发送端 接收端一 接收端二 示例四&…

江协科技STM32学习- P31 I2C通信协议

🚀write in front🚀 🔎大家好,我是黄桃罐头,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流 🎁欢迎各位→点赞👍 收藏⭐️ 留言📝​…

Docker部署Portainer CE结合内网穿透实现容器的可视化管理与远程访问

文章目录 前言1. 本地安装Docker2. 本地部署Portainer CE3. 公网远程访问本地Portainer-CE3.1 内网穿透工具安装3.2 创建远程连接公网地址4. 固定Portainer CE公网地址前言 本篇文章介绍如何在Ubuntu中使用docker本地部署Portainer CE可视化管理工具,并结合cpolar实现公网远程…