Docker Compose:多容器应用的管理利器
在现代应用开发中,微服务架构已成为主流。管理和编排多个容器应用变得至关重要。Docker Compose 是一个强大的工具,通过一个简单的 YAML 文件定义和运行多容器应用。本文将详细介绍 Docker Compose 的基本概念、安装、用法以及一个实际的示例,帮助您快速上手并高效地管理复杂的容器化应用。
一、Docker Compose 简介
Docker Compose 是 Docker 官方提供的工具,用于定义和运行多容器 Docker 应用。通过一个单独的文件(通常是 docker-compose.yml),可以描述应用的服务、网络和卷配置,并使用一个命令启动和管理整个应用。
二、安装 Docker Compose
如果您的系统上尚未安装 Docker Compose,可以按照以下步骤进行安装:
-
Linux 系统安装 Docker Compose:
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose sudo chmod +x /usr/local/bin/docker-compose -
验证安装是否成功:
docker-compose --version
三、Docker Compose 基本概念
-
服务 (Service): 在 Docker Compose 中,每个容器称为一个服务,定义了一个镜像、启动参数、依赖关系等信息。
-
网络 (Network): Docker Compose 默认会创建一个用户定义的网络,使得定义的服务可以相互访问。
-
卷 (Volume): 可以在 Docker Compose 中定义卷,用于持久化数据或共享数据。
-
环境变量 (Environment Variables): 可以在 Docker Compose 中设置服务的环境变量,用于配置服务的行为。
四、Docker Compose 示例
以下是一个简单的示例 docker-compose.yml 文件,演示了如何定义和运行一个 Web 应用(使用 Nginx 和 Node.js):
version: '3.8'services:web:image: nginx:latestports:- "80:80"volumes:- ./nginx.conf:/etc/nginx/nginx.confdepends_on:- appapp:image: node:12working_dir: /appvolumes:- .:/appcommand: npm start
在这个示例中:
- 定义了两个服务:
web和app。 web服务使用 Nginx 镜像,并映射主机的 80 端口到容器的 80 端口,并挂载了一个本地的nginx.conf文件到容器中的 Nginx 配置目录。app服务使用 Node.js 镜像,设置了工作目录和挂载当前目录到容器中,然后执行npm start命令。
五、使用 Docker Compose 命令
Docker Compose 提供了一系列命令来管理和操作多容器应用。以下是一些常用的命令:
-
启动应用:
docker-compose up添加
-d参数可以在后台运行:docker-compose up -d -
停止应用:
docker-compose down -
查看日志:
docker-compose logs <service_name> -
执行命令:
docker-compose exec <service_name> <command> -
查看运行的容器:
docker-compose ps
六、实战案例:部署一个多容器应用
接下来,我们通过一个实际案例,展示如何使用 Docker Compose 部署一个简单的多容器应用。假设我们要部署一个包含 MySQL、Nginx 和 Tomcat 的应用。
1. 创建项目目录结构
首先,创建一个项目目录并进入该目录:
mkdir my_docker_project
cd my_docker_project
在该目录下创建以下文件和目录:
my_docker_project/
├── docker-compose.yml
├── nginx/
│ └── nginx.conf
├── tomcat/
│ └── Dockerfile
└── mysql/└── init.sql
2. 编写 docker-compose.yml 文件
在 my_docker_project 目录下创建并编辑 docker-compose.yml 文件:
version: '3.8'services:nginx:image: nginx:latestports:- "80:80"volumes:- ./nginx/nginx.conf:/etc/nginx/nginx.confdepends_on:- tomcattomcat:build: ./tomcatports:- "8080:8080"depends_on:- mysqlmysql:image: mysql:5.7environment:MYSQL_ROOT_PASSWORD: root_passwordMYSQL_DATABASE: my_databasevolumes:- ./mysql/init.sql:/docker-entrypoint-initdb.d/init.sql
3. 配置 Nginx
在 nginx 目录下创建并编辑 nginx.conf 文件:
server {listen 80;location / {proxy_pass http://tomcat:8080;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;}
}
4. 配置 Tomcat
在 tomcat 目录下创建并编辑 Dockerfile 文件:
FROM tomcat:9-jdk11-openjdk
COPY ./webapp /usr/local/tomcat/webapps
5. 初始化 MySQL 数据库
在 mysql 目录下创建并编辑 init.sql 文件:
CREATE DATABASE my_database;
USE my_database;CREATE TABLE users (id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(255) NOT NULL,email VARCHAR(255) NOT NULL
);INSERT INTO users (name, email) VALUES
('John Doe', 'john@example.com'),
('Jane Doe', 'jane@example.com');
6. 启动多容器应用
完成上述配置后,返回项目根目录,使用以下命令启动应用:
docker-compose up -d
使用浏览器访问 http://localhost,可以看到通过 Nginx 反向代理访问 Tomcat 应用,并且 Tomcat 应用可以访问到 MySQL 数据库。
七、总结
通过本文的介绍,您应该能够理解 Docker Compose 的基本概念、安装方法以及如何编写和使用 docker-compose.yml 文件来管理多容器应用。Docker Compose 是一个强大的工具,能够极大地简化容器化应用的开发、部署和管理过程。希望本文对您有所帮助,如需进一步了解 Docker 和容器化技术,请继续关注我的CSDN博客,获取更多实用的技术教程和分享。
相关文章:
Docker Compose:多容器应用的管理利器
在现代应用开发中,微服务架构已成为主流。管理和编排多个容器应用变得至关重要。Docker Compose 是一个强大的工具,通过一个简单的 YAML 文件定义和运行多容器应用。本文将详细介绍 Docker Compose 的基本概念、安装、用法以及一个实际的示例,…...
Leetcode - 133双周赛
目录 一,3190. 使所有元素都可以被 3 整除的最少操作数 二,3191. 使二进制数组全部等于 1 的最少操作次数 I 三,3192. 使二进制数组全部等于 1 的最少操作次数 II 四,3193. 统计逆序对的数目 一,3190. 使所有元素都…...
C++总结
...
汽车免拆诊断案例 | 2016 款吉利帝豪EV车无法加速
故障现象 一辆2016款吉利帝豪EV车,累计行驶里程约为28.4万km,车主反映车辆无法加速。 故障诊断 接车后路试,行驶约1 km,踩下加速踏板,无法加速,车速为20 km/h左右,同时组合仪表上的电机及控制…...
前端开发之webpack
安装与入门超详细!webpack入门教程(一)-腾讯云开发者社区-腾讯云...
将内容复制到剪贴板?分享 1 段优质 JS 代码片段!
大家好,我是大澈! 本文约 600 字,整篇阅读约需 1 分钟。 每日分享一段优质代码片段。 今天分享一段 JS 代码片段,使用 Clipboard API 实现将内容复制到剪贴板。 老规矩,先阅读代码片段并思考,再看代码解析…...
MAS0902量产工具分享,MAS0902A开卡教程,MAS0901量产工具下载
MAS0902和MAS1102都是基于SATA3.2技术开发的DRAM-less SSD控制芯片,简单来说就是SATA协议无缓存主控。下面是我摸索的麦光黑金300 240G SSD开卡修复简易教程,也就是MAS0902量产过程: 注意:开卡转接线必须要用ASM1153E或JMS578主控…...
从我邮毕业啦!!!
引言 时间过的好快,转眼间就要从北邮毕业了,距离上一次月度总结又过去了两个月,故作本次总结。 PS: https://github.com/WeiXiao-Hyy/blog整理了后端开发的知识网络,欢迎Star! 毕业🎓 6月1号完成了自己的…...
gemini 1.5 flash (node项目)
https://www.npmjs.com/package/google/generative-ai https://ai.google.dev/pricing?hlzh-cn https://aistudio.google.com/app/apikey https://ai.google.dev/gemini-api/docs/models/gemini?hlzh-cn#gemini-1.5-flash https://ai.google.dev/gemini-api/docs/get-started…...
在线字节大端序小端序转换器
具体请前往:在线字节大端序小端序转换器...
css_17_背景属性鼠标属性
一.背景属性 -属性值:background-color(设置背景颜色) 默认背景颜色是 transparent。 -属性值:background-image(设置背景图片) url(图片的地址) -属性值:background-re…...
Python hash编码(go hash编码)
id"中国人" 首先,go语言hash: import (mmh3 "murmurhash3") mmh3.Murmurhash3([]byte(id)) 对应到Python hash编码,可以直接使用mmh3 import mmh3 mmh3.hash(id,signedFalse) 其源码可以表示为 def sum32WithSeed(datas, seed…...
004 插入排序(lua)
文章目录 123 1 -- Lua中没有类和方法的概念,所以我们将所有功能都写在一个脚本中 -- 交换数组中两个元素的功能 local function swap(arr, i, j) local temp arr[i] arr[i] arr[j] arr[j] temp end -- 插入排序算法的实现 local function insertionS…...
计算机网络 —— 基本概念
基本概念 1. 通信协议2. 面向连接 v.s. 面向无连接3. 电路交换 v.s. 分组交换4. 单工通信 v.s. 双工通信 1. 通信协议 通信协议就是计算机与计算机之间通过网络实现通信时事先达成的一种“约定”。这种“约定”使那些由不同厂商的设备、不同的CPU 以及不同的操作系统组成的计算…...
高精度除法的实现
高精度除法与高精度加法的定义、前置过程都是大致相同的,如果想了解具体内容,可以移步至我的这篇博客:高精度加法计算的实现 在这里就不再详细讲解,只讲解主体过程qwq 主体过程 高精度除法的原理和小学学习的竖式除法是一样的。 …...
STM32CUBEMX配置USB虚拟串口
STM32CUBEMX配置USB虚拟串口 cubemx上默认配置即可。 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 配置完后生成工程,主要就是要知道串口的收发接口就行了。 发送:CDC_Transmit_FS(),同时记得包含头文件#include “…...
安卓开发中margin和padding的区别
在 Android 开发中,margin 和 padding 都是用来定义视图(View)的空间属性,但它们的作用和应用场景有所不同: Margin(外边距): Margin 是视图与其他视图之间的空间。它定义了视图之间…...
Symfony事件调度系统:掌控应用程序生命周期的钥匙
Symfony事件调度系统:掌控应用程序生命周期的钥匙 引言 Symfony是一个高度灵活的PHP框架,用于构建各种规模的Web应用程序。它的核心特性之一是事件调度系统,该系统允许开发者在应用程序的生命周期中触发和监听事件。这种机制为开发者提供了…...
maven安装jar和pom到本地仓库
举例子我们要将 elastic-job-spring-boot-starter安装到本地的maven仓库,如下: <dependency><groupId>com.github.yinjihuan</groupId><artifactId>elastic-job-spring-boot-starter</artifactId><version>1.0.5&l…...
[leetcode]assign-cookies. 分发饼干
. - 力扣(LeetCode) class Solution { public:int findContentChildren(vector<int>& g, vector<int>& s) {sort(g.begin(), g.end());sort(s.begin(), s.end());int m g.size(), n s.size();int count 0;for (int i 0, j 0; i…...
DeepSeek幽灵引用问题怎么解决?3步排查+修复方案
DeepSeek幽灵引用问题怎么解决?3步排查修复方案 用DeepSeek写论文的都知道这个坑:它会编造看起来像模像样的参考文献。 格式规范、作者名像真的、期刊名也存在,但论文本身根本查不到。这就是"幽灵引用"。 我的论文里有38条参考文…...
鸿蒙中 应用的权限(一)
本文同步发表于我的微信公众号,微信搜索 程语新视界 即可关注,每个工作日都有文章更新 一、权限管控 什么是应用权限? 系统提供一种通用权限访问方式,允许应用访问系统资源(如通讯录)和系统能力ÿ…...
基于Matlab的不变矩算法实现数字验证码识别过程及其GUI界面构建
基于matlab不变矩算法实现数字验证码 过程:先对验证图像进行去噪、定位、归一化等预处理,然后计算待识别数字的不变矩,再进行特征匹配,得到识别结果。 以Matlab软件为开发平台来进行设计实现及仿真,并构建相应的GUI界面…...
【仅限首批200名开发者】MCP SDK 2026 LTS版预发布体验包泄露:含自动生成Binding DSL + 智能错误翻译引擎
第一章:MCP跨语言SDK开发范式的根本性演进传统SDK开发长期受限于语言绑定、协议耦合与生成工具链割裂,导致同一MCP(Model Control Protocol)服务需为Python、Go、TypeScript等语言分别维护独立代码库,版本同步滞后、错…...
M2LOrder模型快速部署对比:传统服务器 vs 星图GPU云平台
M2LOrder模型快速部署对比:传统服务器 vs 星图GPU云平台 最近在折腾M2LOrder这个模型,想把它部署起来跑点自己的任务。试了两种路子:一种是在自己的服务器上从零开始搞,另一种是直接用星图GPU云平台上的现成镜像。这体验差别&…...
Qwen3-0.6B-FP8与LSTM对比分析:适用于对话任务的模型架构演进
Qwen3-0.6B-FP8与LSTM对比分析:适用于对话任务的模型架构演进 聊起AI对话,大家可能觉得这是最近几年才火起来的新鲜事。但如果你稍微了解一点技术史,就会知道让机器“听懂人话”并“说人话”,这条路其实走了很久。从早期的规则匹…...
墨语灵犀效果深度评测:长文本理解、逻辑推理与代码生成能力
墨语灵犀效果深度评测:长文本理解、逻辑推理与代码生成能力 最近,一个名为“墨语灵犀”的模型在技术圈里讨论得挺多。大家聊得最多的,就是它处理长文章、做逻辑题和写代码的能力到底怎么样。光听别人说总觉得隔了一层,不如自己上…...
招聘系统如何扛住“校招/大促”流量峰值?——高并发下不宕机,保障万人级招聘季稳定
博主介绍: 所有项目都配有从入门到精通的安装教程,可二开,提供核心代码讲解,项目指导。 项目配有对应开发文档、解析等 项目都录了发布和功能操作演示视频;项目的界面和功能都可以定制,包安装运行ÿ…...
源码: 以下代码包含了一个数据库所有的 CRUD (增删改查)操作。 <div> <button id=“js_add_btn“>添 ...
路姿爬慰?? 文章目录- Conda是什么?不止是包管理器! - ?? Conda vs Pip vs UV:三分天下,各显神通 - ??? Conda开发项目常用命令速查手册 - ?? 常见“翻车”现场与救援指南 - ?? 离线部署:没有网络也能搭建环…...
AI 自动逆向 JS 加密!自动抓密钥、出报告,彻底解放双手,解决抓包数据包加密难题
0x01 简介 前端JS加密、混淆、数据包加密,一直是逆向分析的痛点,手动抠代码、断点调试耗时费力。AI_JS_DEBUGGER 基于Chrome开发者协议(CDP),以AI驱动实现全自动JS逆向分析,无需复杂操作,就能自…...
