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

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

在这个示例中:

  • 定义了两个服务:webapp
  • 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:多容器应用的管理利器

在现代应用开发中&#xff0c;微服务架构已成为主流。管理和编排多个容器应用变得至关重要。Docker Compose 是一个强大的工具&#xff0c;通过一个简单的 YAML 文件定义和运行多容器应用。本文将详细介绍 Docker Compose 的基本概念、安装、用法以及一个实际的示例&#xff0c…...

Leetcode - 133双周赛

目录 一&#xff0c;3190. 使所有元素都可以被 3 整除的最少操作数 二&#xff0c;3191. 使二进制数组全部等于 1 的最少操作次数 I 三&#xff0c;3192. 使二进制数组全部等于 1 的最少操作次数 II 四&#xff0c;3193. 统计逆序对的数目 一&#xff0c;3190. 使所有元素都…...

C++总结

...

汽车免拆诊断案例 | 2016 款吉利帝豪EV车无法加速

故障现象 一辆2016款吉利帝豪EV车&#xff0c;累计行驶里程约为28.4万km&#xff0c;车主反映车辆无法加速。 故障诊断 接车后路试&#xff0c;行驶约1 km&#xff0c;踩下加速踏板&#xff0c;无法加速&#xff0c;车速为20 km/h左右&#xff0c;同时组合仪表上的电机及控制…...

前端开发之webpack

安装与入门超详细&#xff01;webpack入门教程(一)-腾讯云开发者社区-腾讯云...

将内容复制到剪贴板?分享 1 段优质 JS 代码片段!

大家好&#xff0c;我是大澈&#xff01; 本文约 600 字&#xff0c;整篇阅读约需 1 分钟。 每日分享一段优质代码片段。 今天分享一段 JS 代码片段&#xff0c;使用 Clipboard API 实现将内容复制到剪贴板。 老规矩&#xff0c;先阅读代码片段并思考&#xff0c;再看代码解析…...

MAS0902量产工具分享,MAS0902A开卡教程,MAS0901量产工具下载

MAS0902和MAS1102都是基于SATA3.2技术开发的DRAM-less SSD控制芯片&#xff0c;简单来说就是SATA协议无缓存主控。下面是我摸索的麦光黑金300 240G SSD开卡修复简易教程&#xff0c;也就是MAS0902量产过程&#xff1a; 注意&#xff1a;开卡转接线必须要用ASM1153E或JMS578主控…...

从我邮毕业啦!!!

引言 时间过的好快&#xff0c;转眼间就要从北邮毕业了&#xff0c;距离上一次月度总结又过去了两个月&#xff0c;故作本次总结。 PS: https://github.com/WeiXiao-Hyy/blog整理了后端开发的知识网络&#xff0c;欢迎Star&#xff01; 毕业&#x1f393; 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…...

在线字节大端序小端序转换器

具体请前往&#xff1a;在线字节大端序小端序转换器...

css_17_背景属性鼠标属性

一.背景属性 -属性值&#xff1a;background-color&#xff08;设置背景颜色&#xff09; 默认背景颜色是 transparent。 -属性值&#xff1a;background-image&#xff08;设置背景图片&#xff09; url&#xff08;图片的地址&#xff09; -属性值&#xff1a;background-re…...

Python hash编码(go hash编码)

id"中国人" 首先&#xff0c;go语言hash: import (mmh3 "murmurhash3") mmh3.Murmurhash3([]byte(id)) 对应到Python hash编码&#xff0c;可以直接使用mmh3 import mmh3 mmh3.hash(id,signedFalse) 其源码可以表示为 def sum32WithSeed(datas, seed…...

004 插入排序(lua)

文章目录 123 1 -- Lua中没有类和方法的概念&#xff0c;所以我们将所有功能都写在一个脚本中 -- 交换数组中两个元素的功能 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 以及不同的操作系统组成的计算…...

高精度除法的实现

高精度除法与高精度加法的定义、前置过程都是大致相同的&#xff0c;如果想了解具体内容&#xff0c;可以移步至我的这篇博客&#xff1a;高精度加法计算的实现 在这里就不再详细讲解&#xff0c;只讲解主体过程qwq 主体过程 高精度除法的原理和小学学习的竖式除法是一样的。 …...

STM32CUBEMX配置USB虚拟串口

STM32CUBEMX配置USB虚拟串口 cubemx上默认配置即可。 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 配置完后生成工程&#xff0c;主要就是要知道串口的收发接口就行了。 发送&#xff1a;CDC_Transmit_FS()&#xff0c;同时记得包含头文件#include “…...

安卓开发中margin和padding的区别

在 Android 开发中&#xff0c;margin 和 padding 都是用来定义视图&#xff08;View&#xff09;的空间属性&#xff0c;但它们的作用和应用场景有所不同&#xff1a; Margin&#xff08;外边距&#xff09;&#xff1a; Margin 是视图与其他视图之间的空间。它定义了视图之间…...

Symfony事件调度系统:掌控应用程序生命周期的钥匙

Symfony事件调度系统&#xff1a;掌控应用程序生命周期的钥匙 引言 Symfony是一个高度灵活的PHP框架&#xff0c;用于构建各种规模的Web应用程序。它的核心特性之一是事件调度系统&#xff0c;该系统允许开发者在应用程序的生命周期中触发和监听事件。这种机制为开发者提供了…...

maven安装jar和pom到本地仓库

举例子我们要将 elastic-job-spring-boot-starter安装到本地的maven仓库&#xff0c;如下&#xff1a; <dependency><groupId>com.github.yinjihuan</groupId><artifactId>elastic-job-spring-boot-starter</artifactId><version>1.0.5&l…...

[leetcode]assign-cookies. 分发饼干

. - 力扣&#xff08;LeetCode&#xff09; 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…...

HTML 语义化

目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案&#xff1a; 语义化标签&#xff1a; <header>&#xff1a;页头<nav>&#xff1a;导航<main>&#xff1a;主要内容<article>&#x…...

【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15

缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下&#xff1a; struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...

Spring Boot 实现流式响应(兼容 2.7.x)

在实际开发中&#xff0c;我们可能会遇到一些流式数据处理的场景&#xff0c;比如接收来自上游接口的 Server-Sent Events&#xff08;SSE&#xff09; 或 流式 JSON 内容&#xff0c;并将其原样中转给前端页面或客户端。这种情况下&#xff0c;传统的 RestTemplate 缓存机制会…...

HTML 列表、表格、表单

1 列表标签 作用&#xff1a;布局内容排列整齐的区域 列表分类&#xff1a;无序列表、有序列表、定义列表。 例如&#xff1a; 1.1 无序列表 标签&#xff1a;ul 嵌套 li&#xff0c;ul是无序列表&#xff0c;li是列表条目。 注意事项&#xff1a; ul 标签里面只能包裹 li…...

dedecms 织梦自定义表单留言增加ajax验证码功能

增加ajax功能模块&#xff0c;用户不点击提交按钮&#xff0c;只要输入框失去焦点&#xff0c;就会提前提示验证码是否正确。 一&#xff0c;模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...

Neo4j 集群管理:原理、技术与最佳实践深度解析

Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...

云原生玩法三问:构建自定义开发环境

云原生玩法三问&#xff1a;构建自定义开发环境 引言 临时运维一个古董项目&#xff0c;无文档&#xff0c;无环境&#xff0c;无交接人&#xff0c;俗称三无。 运行设备的环境老&#xff0c;本地环境版本高&#xff0c;ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...

Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换

目录 关键点 技术实现1 技术实现2 摘要&#xff1a; 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式&#xff08;自动驾驶、人工驾驶、远程驾驶、主动安全&#xff09;&#xff0c;并通过实时消息推送更新车…...

脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)

一、OpenBCI_GUI 项目概述 &#xff08;一&#xff09;项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台&#xff0c;其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言&#xff0c;首次接触 OpenBCI 设备时&#xff0c;往…...

从面试角度回答Android中ContentProvider启动原理

Android中ContentProvider原理的面试角度解析&#xff0c;分为​​已启动​​和​​未启动​​两种场景&#xff1a; 一、ContentProvider已启动的情况 1. ​​核心流程​​ ​​触发条件​​&#xff1a;当其他组件&#xff08;如Activity、Service&#xff09;通过ContentR…...