当前位置: 首页 > news >正文

Docker Compose 使用

一、简介

Docker Compose 是一个工具,用于定义和运行多容器 Docker 应用程序。它允许用户使用 YAML 文件来配置应用程序需要的所有服务,然后使用一个命令来从 YAML 文件配置中创建并启动所有服务。其主要目的是为了简化了多容器 Docker 应用程序的部署和管理过程。

二、安装

Docker Compose可以在大多数Linux发行版上安装,包括Ubuntu、CentOS等。安装方法可能包括通过包管理器安装或直接下载二进制文件。在Windows系统上,Docker Compose通常随Docker Desktop一起安装,不需要单独安装。Linux系统上安装步骤如下:

  1. 下载当前稳定的Compose版本:
    curl -L "https://github.com/docker/compose/releases/download/v2.27.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
  2. 给予Docker Compose可执行权限:
    chmod +x /usr/local/bin/docker-compose
  3. 验证安装是否成功:
    docker-compose --version

三、Docker Compose使用

3.1 编写 docker-compose.yml 配置文件

创建一个名为docker-compose.yml的YAML文件,在其中定义要启动的服务、网络、卷等配置。下面是一个简单的 docker-compose.yml 配置文件示例:

version: '3'
services:web:build: .ports:- "5000:5000"volumes:- .:/code- logvolume01:/var/logdepends_on:- redisredis:image: redisvolumes:logvolume01: {}

这个配置文件定义了两个服务:web 和 redis,web服务是依赖redis服务的,先启动 redis服务,再启动 web。web 服务使用从当前目录中构建的镜像,并将容器的 5000 端口映射到主机的 5000 端口。redis 服务使用 Docker Hub 上的官方 Redis 镜像。

3.2 启动 docker-compose

执行 docker-compose up -d 命令来启动并运行整个应用程序。

四、Docker Compose常用命令

Docker Compose命令基本上和Docker相差不多,主要就是对Docker Compose生命周期控制、日志格式等相关命令。常用的命令如下:

  1. docker-compose up:启动所有服务。
  2. docker-compose up -d:在后台启动所有服务。
  3. docker-compose down:停止并删除所有容器、网络、卷和镜像。
  4. docker-compose ps:列出所有运行的容器。
  5. docker-compose logs:查看容器输出日志。
  6. docker-compose exec:在容器内部执行命令。
  7. docker-compose build:构建服务的镜像。
  8. docker-compose restart:重启服务。
  9. docker-compose start:启动服务。
  10. docker-compose stop:停止服务。
  11. docker-compose config:检查Docker Compose配置文件的语法。
  12. docker-compose push:推送服务镜像到仓库。
  13. docker-compose pull:从仓库拉取服务镜像。
  14. docker-compose top:显示由 Docker Compose 管理的所有容器的进程信息。

五、docker-compose.yml 配置文件解析

docker-compose.yml 文件是用于定义和运行多个 Docker 容器的 YAML 文件。它的通常组成部分有:服务定义、网络定义和数据卷定义等。以下是一个基本的 docker-compose.yml 文件示例:

# 指定Docker Compose 文件的版本
version: '3'# 必填部分,定义服务
services:web:image: nginxports:- "80:80"networks:- mynetworkdb:image: postgresenvironment:POSTGRES_PASSWORD: examplenetworks:- mynetwork# 可选部分,定义网络
networks: network_name:driver: bridge # 网络类型,默认为桥接网络# 可选部分,定义数据卷 
volumes: volume_name:driver: local # 数据卷驱动,默认为本地存储
5.1 version

指定Docker Compose文件的版本信息,定义关乎于docker的兼容性。随着 Docker Compose 的发展,出现了多个版本,每个版本都带来了新的特性和改进。以下是一些常见的 Docker Compose 文件版本号:

  • Version 1: 这是最早的版本,不支持数据卷、网络和构建参数配置。它不会利用 Docker 网络的优势,每个容器都位于默认的桥接网络上,并且需要使用 links 来启用容器之间的发现。
  • Version 2.x: 引入了对 Swarm 模式的支持,可以通过 docker stack 命令将 Compose 文件部署到 Swarm 集群中。它支持数据卷和网络的配置,默认情况下,每个容器都加入了应用范围的默认网络,并且可以在与服务名称相同的主机名下发现。
  • Version 3.x: 这是最新的版本,也是推荐使用的版本。它与 Docker Engine 的 Swarm 模式形成交叉兼容,并引入了一些新特性,例如配置命名空间、健康检查、秘密管理等。
5.2 services

services 是一个顶级元素,docker-compose.yml 文件中的核心部分,它定义了应用程序中的各个服务及其配置。每个服务都是一个独立的容器,可以运行在不同的主机上。以下是 services 元素中常见的配置选项:

  • image: 指定服务使用的 Docker 镜像名称,可以是公共 Docker Hub 中的镜像,也可以是本地的自定义镜像。
  • build: 指定 Dockerfile 的路径,Docker Compose 将自动构建该服务的 Docker 镜像。
  • container_name: 指定容器的名称,如果不指定,Docker 会自动分配一个唯一的名称。
  • ports: 指定容器和宿主机之间的端口映射关系,格式为 宿主机端口:容器端口。
  • expose:声明容器暴露的端口。不会在主机和容器之间创建端口映射,而是仅仅在容器内部定义了一个端口,以便其他容器可以通过容器网络进行访问。
  • environment: 定义容器的环境变量,可以是数组或字典形式。
  • volumes: 指定容器和宿主机之间的数据卷映射关系,格式为 宿主机路径:容器路径。
  • networks: 指定容器所属的网络,可以是已存在的网络或者新建的网络。
  • depends_on: 指定服务之间的依赖关系,使得一个服务启动前必须先启动其依赖的服务。
  • links:链接到其它服务的中的容器,可以指定服务名称也可以指定链接别名。
  • restart: 指定容器退出后的重启策略,如 no, always, on-failure, unless-stopped。
  • command: 覆盖容器启动后要执行的命令。
  • healthcheck:定义容器的健康检查逻辑。通过这种方式,你可以确保容器在启动后能够正常运行,并且在出现问题时能够被及时发现和处理。
  • env_file:从文件添加环境变量。可以是单个值(env_file: .env)或列表的多个值。
  • secrets:用于定义敏感数据的部分。这些敏感数据通常是需要保密的信息,如数据库密码、API密钥等。
version: "3.9"# 定义服务
services:# 定义服务1service1: # 自定义服务名称image: postgresql # 使用的是postgresql镜像build:context: ./dir # Dockerfile 所在的上下文路径dockerfile: Dockerfile # Dockerfile 的名称,默认为 Dockerfilecontainer_name: my-postgresql-container # 指定自定义容器名ports:- "5005:5432" # 将主机的5005端口映射到容器的5432端口上expose:- "8080" # 暴露容器内部8080端口environment: # 环境变量- DB_HOST=${DB_HOST}- DB_USER=${DB_USER}- DB_PASSWORD=${DB_PASSWORD}volumes: # 数据卷挂载- /db-data:/var/lib/postgresql/data # 将主机根目录下的db-data目录挂载到容器的/var/lib/postgresql/data目录中networks: # 网络配置- my_network: aliased_web  # 服务在my_network网络中被赋予别名aliased_webdepends_on: # 依赖服务- service2 # 指定要依赖的服务名称links: # 链接服务- service3 # 指定要链接的服务名称restart: always # 重启策略command: ["echo", "Goodbye World"] # 会覆盖容器启动命令healthcheck:test: ["CMD", "curl", "-f", "http://localhost:5000/health"]interval: 30stimeout: 10sretries: 3start_period: 40senv_file:- ./config/envsecrets:- my_secret- my_other_secret# 定义服务2service2: image: nginx # 使用的是nginx镜像    volumes:- my_data:/data  # my_data卷被挂载到service2容器的/data路径# 定义数据卷,与services元素同级
volumes:my_data:# 定义网络,与services元素同级
networks:my_network:driver: bridgeipam:driver: defaultconfig:- subnet: 192.168.100.0/24# 定义密钥, 与services元素同级
secrets:my_secret:file: ./my_secret.txtmy_other_secret:external: true

相关文章:

Docker Compose 使用

一、简介 Docker Compose 是一个工具,用于定义和运行多容器 Docker 应用程序。它允许用户使用 YAML 文件来配置应用程序需要的所有服务,然后使用一个命令来从 YAML 文件配置中创建并启动所有服务。其主要目的是为了简化了多容器 Docker 应用程序的部署和…...

KEIL5.39 5.40 fromelf 不能生成HEX bug

使用AC6 编译,只要勾选了生成HEX。 结果报如下错误 暂时没有好的解决办法 1.替换法 2.在编译完后用命令生成HEX...

mongosh 和mongo 命令行连接MongoDB

Mongoshell MongoDB的Shell工具mongosh是一个全功能的JavaScript和Node.js的14.x REPL与MongoDB的部署交互环境。我们通过它可以直接对数据库进行查询和操作。这个工具是需要在安装玩MongoDB后单独安装的。 与传统的mongo方式连接MongoDB更加丰富。 官网 https://www.mongodb.…...

DOM 改变节点

DOM 改变节点 文档对象模型(DOM)是 HTML 和 XML 文档的编程接口。它提供了对文档的结构化表示,并定义了一种方式,允许程序和脚本动态地访问和更新文档的内容、结构和样式。在网页开发中,DOM 操作是核心技能之一&#…...

【面试题分享】重现 string.h 库常用的函数

文章目录 【面试题分享】重现 string.h 库常用的函数一、字符串复制1. strcpy(复制字符串直到遇到 null 终止符)2. strncpy(复制固定长度的字符串) 二、字符串连接1. strcat(将一个字符串连接到另一个字符串的末尾&…...

6.21 移动语义与智能指针

//先构造,再拷贝构造//利用"hello"这个字符串创建了一个临时对象//并复制给了s3//这一步实际上new了两次String s3 "hello"; 背景需求: 这个隐式创建的字符串出了该行就直接销毁掉,效率比较低 可以让_pstr指向这个空间…...

Kimi还能对学术论文进行润色?我来教你!

学境思源,一键生成论文初稿: AcademicIdeas - 学境思源AI论文写作 一、引言 在学术界,论文的质量往往决定了研究的可信度和影响力。Kimi作为一款人工智能助手,可以为学术论文的润色提供有效的帮助。本文将详细介绍如何利用Kimi进…...

智汇云舟成为中煤集团中煤智能创新联盟成员单位

6月21日,第八届世界智能产业博览会平行会议暨中煤智能创新联盟交流会在天津水游城丽筠酒店顺利举行。智汇云舟受邀参与,并由中国中煤能源集团授予荣誉证书,正式成为中煤智能创新联盟成员单位。会议上,清华大学、中国矿业大学&…...

【文心智能体大赛】迎接属于你的休闲娱乐导师!

迎接属于你的休闲娱乐导师! 前言创建智能体发布智能体最后结语 前言 文心智能体平台AgentBuilder 是百度推出的基于文心大模型的智能体(Agent)平台,支持广大开发者根据自身行业领域、应用场景,选取不同类型的开发方式&…...

AI:音乐创作的未来还是毁灭的序曲?

AI:音乐创作的未来还是毁灭的序曲? 随着人工智能(AI)技术的飞速发展,它已经渗透到了我们生活的方方面面,包括音乐领域。然而,AI在音乐创作中的角色引发了广泛的讨论和争议。一些人认为AI为音乐…...

如何通过AI进行智能日志异常检测

智能日志异常检测是一种利用人工智能(AI)技术来自动识别日志数据中异常模式或行为的方法。传统日志监控依赖于预定义规则,而智能日志异常检测可以适应不同的日志模式和异常类型,提高检测准确性和效率。下面是一个完整的步骤指南&a…...

C++ GPU编程(英伟达CUDA)

安装编译环境 https://developer.download.nvidia.com/compute/cuda/12.5.0/local_installers/cuda_12.5.0_555.85_windows.exe CMakeLists.txt cmake_minimum_required(VERSION 3.10)set(CMAKE_CXX_STANDARD 17) set(CMAKE_BUILD_TYPE Release) #set(CMAKE_CUDA_ARCHITECTUR…...

肾虚学习实验第T1周:实现mnist手写数字识别

>- **🍨 本文为[🔗365天深度学习训练营](https://mp.weixin.qq.com/s/0dvHCaOoFnW8SCp3JpzKxg) 中的学习记录博客** >- **🍖 原作者:[K同学啊](https://mtyjkh.blog.csdn.net/)** 目录 一、前言 作为一名研究牲&#xff0…...

Python | Leetcode Python题解之第162题寻找峰值

题目: 题解: class Solution:def findPeakElement(self, nums: List[int]) -> int:n len(nums)# 辅助函数,输入下标 i,返回 nums[i] 的值# 方便处理 nums[-1] 以及 nums[n] 的边界情况def get(i: int) -> int:if i -1 or…...

定个小目标之刷LeetCode热题(26)

这道题属于一道简单题&#xff0c;可以使用辅助栈法&#xff0c;代码如下所示 class Solution {public boolean isValid(String s) {if (s.isEmpty())return false;// 创建字符栈Stack<Character> stack new Stack<Character>();// 遍历字符串数组for (char c : …...

网络爬虫设置代理服务器

目录 1&#xff0e;获取代理 IP 2&#xff0e;设置代理 IP 3. 检测代理 IP 的有效性 4. 处理异常 如果希望在网络爬虫程序中使用代理服务器&#xff0c;就需要为网络爬虫程序设置代理服务器。 设置代理服务器一般分为获取代理 IP 、设置代理 IP 两步。接下来&#xff0c;分…...

3、matlab单目相机标定原理、流程及实验

1、单目相机标定流程及步骤 单目相机标定是通过确定相机的内部和外部参数&#xff0c;以便准确地在图像空间和物体空间之间建立映射关系。下面是单目相机标定的流程及步骤&#xff1a; 搜集标定图像&#xff1a;使用不同角度、距离和姿态拍摄一组标定图像&#xff0c;并确保标…...

【gdb 如何生成并查看core dump】

生成core dump 使用ulimit命令来设置core dump文件的大小。 ulimit -c unlimitedcore dump位置 如果程序崩溃&#xff0c;系统会生成一个名为core的文件。可以通过以下命令查看core文件位置&#xff0c; cat /proc/sys/kernel/core_pattern查看core dump gdb /path/to/you…...

极简短视频查看、删除应用

本地短视频服务器 背景&#xff1a;我的NAS中存放了很多短视频&#xff0c;多到很多没看过&#xff0c;于是写了这个程序来随机查看并删除短视频 运行&#xff1a; 安装依赖后运行main.py 直接使用docker&#xff1a; docker pull realwang/short_video docker run -d -p 3000:…...

【秋招刷题打卡】Day01-自定义排序

Day01-自定排序 前言 给大家推荐一下咱们的 陪伴打卡小屋 知识星球啦&#xff0c;详细介绍 >笔试刷题陪伴小屋-打卡赢价值丰厚奖励 < ⏰小屋将在每日上午发放打卡题目&#xff0c;包括&#xff1a; 一道该算法的模版题 (主要以力扣&#xff0c;牛客&#xff0c;acwin…...

设计模式和设计原则回顾

设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

【Linux】shell脚本忽略错误继续执行

在 shell 脚本中&#xff0c;可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行&#xff0c;可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令&#xff0c;并忽略错误 rm somefile…...

STM32+rt-thread判断是否联网

一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

基于服务器使用 apt 安装、配置 Nginx

&#x1f9fe; 一、查看可安装的 Nginx 版本 首先&#xff0c;你可以运行以下命令查看可用版本&#xff1a; apt-cache madison nginx-core输出示例&#xff1a; nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...

Objective-C常用命名规范总结

【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名&#xff08;Class Name)2.协议名&#xff08;Protocol Name)3.方法名&#xff08;Method Name)4.属性名&#xff08;Property Name&#xff09;5.局部变量/实例变量&#xff08;Local / Instance Variables&…...

【机器视觉】单目测距——运动结构恢复

ps&#xff1a;图是随便找的&#xff0c;为了凑个封面 前言 在前面对光流法进行进一步改进&#xff0c;希望将2D光流推广至3D场景流时&#xff0c;发现2D转3D过程中存在尺度歧义问题&#xff0c;需要补全摄像头拍摄图像中缺失的深度信息&#xff0c;否则解空间不收敛&#xf…...

【磁盘】每天掌握一个Linux命令 - iostat

目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat&#xff08;I/O Statistics&#xff09;是Linux系统下用于监视系统输入输出设备和CPU使…...

django filter 统计数量 按属性去重

在Django中&#xff0c;如果你想要根据某个属性对查询集进行去重并统计数量&#xff0c;你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求&#xff1a; 方法1&#xff1a;使用annotate()和Count 假设你有一个模型Item&#xff0c;并且你想…...

MODBUS TCP转CANopen 技术赋能高效协同作业

在现代工业自动化领域&#xff0c;MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步&#xff0c;这两种通讯协议也正在被逐步融合&#xff0c;形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明

AI 领域的快速发展正在催生一个新时代&#xff0c;智能代理&#xff08;agents&#xff09;不再是孤立的个体&#xff0c;而是能够像一个数字团队一样协作。然而&#xff0c;当前 AI 生态系统的碎片化阻碍了这一愿景的实现&#xff0c;导致了“AI 巴别塔问题”——不同代理之间…...