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…...
多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...
idea大量爆红问题解决
问题描述 在学习和工作中,idea是程序员不可缺少的一个工具,但是突然在有些时候就会出现大量爆红的问题,发现无法跳转,无论是关机重启或者是替换root都无法解决 就是如上所展示的问题,但是程序依然可以启动。 问题解决…...
手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...
【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密
在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...
关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...
ios苹果系统,js 滑动屏幕、锚定无效
现象:window.addEventListener监听touch无效,划不动屏幕,但是代码逻辑都有执行到。 scrollIntoView也无效。 原因:这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作,从而会影响…...
USB Over IP专用硬件的5个特点
USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中,从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备(如专用硬件设备),从而消除了直接物理连接的需要。USB over IP的…...
2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)
安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...
Vue 模板语句的数据来源
🧩 Vue 模板语句的数据来源:全方位解析 Vue 模板(<template> 部分)中的表达式、指令绑定(如 v-bind, v-on)和插值({{ }})都在一个特定的作用域内求值。这个作用域由当前 组件…...
