多容器应用程序

多容器应用程序

目录

  • 概述
  • 试一试
    • 设置
    • 构建镜像
    • 运行容器
    • 使用 Docker Compose 简化部署

概述

启动单容器应用程序很容易。例如,一个执行特定数据处理任务的 Python 脚本可以在包含所有依赖项的容器中运行。类似地,服务于静态网站并带有一个小 API 端点的 Node.js 应用程序可以有效地容器化并包含所有必要的库和依赖项。然而,随着应用程序的增长,将它们作为单个容器进行管理变得越来越困难。

假设数据处理 Python 脚本需要连接到数据库。突然之间,你不仅要管理脚本,还要在同一个容器中管理数据库服务器。如果脚本需要用户登录,你还需要一个认证机制,这会进一步增加容器的大小。

一个关于容器的最佳实践是,每个容器应只做一件事并且做好这件事。虽然有例外,但应避免让一个容器做多件事情。

现在你可能会问,“我需要单独运行这些容器吗?如果我单独运行它们,如何将它们连接在一起?”

虽然 docker run 是启动容器的一个方便工具,但随着应用栈的增长,用它来管理变得困难。原因如下:

  • 想象一下在开发、测试和生产环境中运行几个不同配置的 docker run 命令(前端、后端和数据库)。这很容易出错且耗时。
  • 应用程序通常依赖于彼此。手动按特定顺序启动容器并管理网络连接随着栈的扩展变得困难。
  • 每个应用程序都需要自己的 docker run 命令,使得难以单独扩展各个服务。扩展整个应用程序意味着可能浪费资源在不需要扩展的组件上。
  • 持久化每个应用程序的数据需要单独的卷挂载或每个 docker run 命令中的配置。这会造成分散的数据管理。
  • 为每个应用程序设置环境变量通过单独的 docker run 命令是繁琐且容易出错的。

这时 Docker Compose 可以帮助解决这些问题。

Docker Compose 将整个多容器应用程序定义在一个名为 compose.ymlYAML 文件中。这个文件指定了所有容器的配置,它们的依赖项、环境变量,甚至是卷和网络。通过使用 Docker Compose

  • 你不需要运行多个 docker run 命令。你只需在一个 YAML 文件中定义整个多容器应用程序。这样可以集中配置并简化管理。
  • 你可以按特定顺序运行容器并轻松管理网络连接。
  • 你可以简单地在多容器设置中扩展或缩减单个服务。这允许基于实时需求进行高效分配。
  • 你可以轻松实现持久卷。
  • 你可以在 Docker Compose 文件中一次性设置环境变量。

通过使用 Docker Compose 运行多容器设置,你可以构建具有模块化、可扩展性和一致性的复杂应用程序。

试一试

在这个实践指南中,你将首先看到如何使用 docker run 命令构建和运行基于 Node.js 的计数器 web 应用程序、一个 Nginx 反向代理和一个 Redis 数据库。然后你会看到如何使用 Docker Compose 简化整个部署过程。

设置

获取示例应用程序。如果你有 Git,你可以克隆示例应用程序的仓库。否则,你可以下载示例应用程序。选择以下选项之一。

使用 Git 克隆

在终端中使用以下命令克隆示例应用程序仓库。

git clone https://github.com/dockersamples/nginx-node-redis

进入 nginx-node-redis 目录:

cd nginx-node-redis

在这个目录中,你会找到两个子目录 - nginxweb

下载并安装 Docker Desktop

构建镜像

进入 nginx 目录,通过运行以下命令构建镜像:

docker build -t nginx .

进入 web 目录,运行以下命令构建第一个 web 镜像:

docker build -t web .

运行容器

在运行多容器应用程序之前,你需要创建一个网络,以便它们通过该网络进行通信。可以使用 docker network create 命令来创建网络:

docker network create sample-app

运行以下命令启动 Redis 容器,并将其连接到先前创建的网络,并创建一个网络别名(对于 DNS 查找非常有用):

docker run -d --name redis --network sample-app --network-alias redis redis

运行以下命令启动第一个 web 容器:

docker run -d --name web1 -h web1 --network sample-app --network-alias web1 web

运行以下命令启动第二个 web 容器:

docker run -d --name web2 -h web2 --network sample-app --network-alias web2 web

运行以下命令启动 Nginx 容器:

docker run -d --name nginx --network sample-app -p 80:80 nginx

注意
Nginx 通常用作 web 应用程序的反向代理,将流量路由到后端服务器。在这种情况下,它将流量路由到 Node.js 后端容器(web1web2)。

运行以下命令验证容器是否已启动:

docker ps

你将看到类似以下的输出:

CONTAINER ID   IMAGE     COMMAND                  CREATED              STATUS              PORTS                NAMES
2cf7c484c144   nginx     "/docker-entrypoint.…"   9 seconds ago        Up 8 seconds        0.0.0.0:80->80/tcp   nginx
7a070c9ffeaa   web       "docker-entrypoint.s…"   19 seconds ago       Up 18 seconds                            web2
6dc6d4e60aaf   web       "docker-entrypoint.s…"   34 seconds ago       Up 33 seconds                            web1
008e0ecf4f36   redis     "docker-entrypoint.s…"   About a minute ago   Up About a minute   6379/tcp             redis

Docker Dashboard 中查看,可以看到容器并深入了解它们的配置。

打开浏览器并访问 http://localhost 查看站点。多次刷新页面查看处理请求的主机和请求总数:

web2: Number of visits is: 9
web1: Number of visits is: 10
web2: Number of visits is: 11
web1: Number of visits is: 12

注意
你可能注意到 Nginx 作为反向代理,可能会以轮询方式在两个后端容器(web1web2)之间分配传入请求。这意味着每个请求可能会被轮流指向不同的容器。输出显示两个容器的连续递增,并且实际的计数器值在响应发送回客户端后才更新。

使用 Docker Dashboard 删除容器,选择容器并选择删除按钮。

使用 Docker Compose 简化部署

Docker Compose 提供了一种结构化和简化的方式来管理多容器部署。如前所述,使用 Docker Compose,你不需要运行多个 docker run 命令。你只需在一个名为 compose.ymlYAML 文件中定义整个多容器应用程序。让我们看看它是如何工作的。

导航到项目目录的根目录。在这个目录中,你会找到一个名为 compose.yml 的文件。这个 YAML 文件定义了组成应用程序的所有服务及其配置。每个服务都指定了它的镜像、端口、卷、网络及其功能所需的任何其他设置。

使用 docker compose up 命令启动应用程序:

docker compose up -d --build

运行此命令后,你应该看到类似以下的输出:

Running 5/5
✔ Network nginx-nodejs-redis_default    Created                                                0.0s
✔ Container nginx-nodejs-redis-web1-1   Started                                                0.1s
✔ Container nginx-nodejs-redis-redis-1  Started                                                0.1s
✔ Container nginx-nodejs-redis-web2-1   Started                                                0.1s
✔ Container nginx-nodejs-redis-nginx-1  Started

Docker Dashboard 中查看,可以看到容器并深入了解它们的配置。

你可以使用 Docker Dashboard 选择应用栈并选择删除按钮来移除容器。

在这个指南中,你学习了如何使用 Docker Compose 更轻松地启动和停止多容器应用程序。

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

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

相关文章

免费体验软件开发生产线 CodeArts

软件开发生产线 CodeArts 一站式、全流程、安全可信的软件开发生产线,开箱即用,内置华为多年研发最佳实践,助力效能倍增和数字化转型 免费试用体验版套餐,50人内免费试用 功能特性 Scrum和看板需求模型 代码托管 代码检查&am…

GIS开发如何高质量就业?这几点是关键!

高质量就业,包含薪资和其他福利待遇,在讨论如何高质量就业之前,我们先来看下GIS开发岗位的前景、薪资水平如何?最后讨论一下GIS开发工程师到底需要学习哪些技术? 01 GIS开发岗位呈持续上升趋势 从GIS开发岗位趋势也可…

Java知识点整理 11— 后端 Spring Boot 万用初始化模板使用

一. 模块简介 annotation:自定义注解aop:请求日志和权限校验common:通用类config:配置类constant:常量 controller:控制层esdao:方便操作ESexception:异常类job:定时任务…

Facebook广告投放的6个误区,老手也会犯

一、没有目标 无论是投放哪种产品,我们始终都需要明确,广告的目标是什么。 因为Facebook广告的形式和类型,也经常会有变化,例如近期Facebook推出的360视频广告,以及之后即将推出的LIVE,Mid-Roll视频插播广…

美国电商选品、大促、趋势、案例,掌慧科技首期NewsBreak沙龙干货满满

今年第一季度,美国电商销售额达到了2681.2亿美元,相较上一年同期的2471.8亿美元增长8.5%。同时,该季度美国电商销售额在零售业总销售额中的占比为22.2%,高于上一年同期的21.2%。美国在2023年下半年通胀得到良好控制,20…

CleanMyMac2024破解版下载链接!你的Mac清洁利器!

嘿,亲爱的朋友们,今天我要跟大家分享一款我最近超级依赖的电脑清理神器—CleanMyMac2024破解版!如果你还在为电脑运行缓慢、存储空间不够而烦恼,那你一定不能错过它! 🔥 为什么选择CleanMyMac2024破解版&am…

kubernetes-filebeat

1. deploy 文件 curl -L -O https://raw.githubusercontent.com/elastic/beats/8.14/deploy/kubernetes/filebeat-kubernetes.yamlapiVersion: v1 kind: ServiceAccount metadata:name: filebeatnamespace: kube-systemlabels:k8s-app: filebeat --- apiVersion: rbac.authori…

声波的种类

声波可以根据不同的特性进行分类,主要包括频率和传播方式两个方面: ### 按频率分类: 1. **次声波**:频率低于20Hz的机械波,这类波通常不能被人耳感知。 2. **可闻声波**:频率在20Hz至20kHz之间的机械波&am…

C++ | Leetcode C++题解之第160题相交链表

题目: 题解: class Solution { public:ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {if (headA nullptr || headB nullptr) {return nullptr;}ListNode *pA headA, *pB headB;while (pA ! pB) {pA pA nullptr ? headB : p…

【区分vue2和vue3下的element UI Skeleton 骨架屏组件,分别详细介绍属性,事件,方法如何使用,并举例】

在区分Vue 2的Element UI和Vue 3的Element Plus中的Skeleton骨架屏组件时,我们需要注意到Element UI本身并不直接提供Skeleton组件,而Element Plus则直接提供了这一组件。因此,我将分别介绍Element Plus中的Skeleton组件以及如何在Vue 2项目中…

Python自动化(9)——log模块

Python自动化(9)——log模块 log模块实际上就是将所有print输出的信息收集起来,可以实现在pyqt5界面上显示,并且支持将所有的输出保存为文本文件的模块。 实际上还可以做得更加通用,例如增加一些前缀以区分不同的任务,不同的线程。…

[AIGC] 数位动态规划详解

动态规划(DP)是计算机科学中使用的一种寻找大多数最优路径问题的乐高算法技术。而“数位动态规划”(Digit DP)是动态规划的一个特例,主要用于解决数位问题。 文章目录 1. 什么是数位问题?2. 什么是数位动态…

【fiddler】fiddler抓取websocket

1.先了解websocket流 下载4.5版本以上的fiddler 如图所示:在rules--customize rules 里面插入以下代码: static function OnWebSocketMessage(oMsg: WebSocketMessage) { // Log Message to the LOG tab FiddlerApplication.Log.LogString(oMsg.ToStr…

鸿蒙开发下拉选项框在表单递交的处理

下拉选项框 <select name"identity"><option value"0">顾 客</option><option value"1">行 政</option><option value"2" >保 洁</option></select>在表单数据中没有找到identit…

Win11 Docker Desktop下部署springboot jar

1.将springboot程序使用maven package打包出jar。 2.创建dockerfile&#xff0c;为了本地打包时方便&#xff0c;这里的dockerfile有小变动。 # Docker Desktop下部署springboot jar FROM openjdk:8 VOLUME /tmp EXPOSE 8601 ARG JAR_FILEtarget/webflux-hello-0.0.1-SNAPSHO…

全球叉车巨头科朗遭网络攻击,工厂生产被迫中断

科朗员工们表示&#xff0c;本次事件最令人沮丧的是公司缺乏透明度和沟通意愿。 起初&#xff0c;员工被告知如果想在缺勤日获得报酬&#xff0c;需要申请失业或使用已积存的带薪休假和年假。 然而&#xff0c;外媒BleepingComputer得知&#xff0c;这一政策有所改变&#xf…

2024年7月计划(ue5肉鸽视频完成)

试过重点放在独立游戏上&#xff0c;有个indienova独立游戏团队是全职的&#xff0c;由于他们干了几个月&#xff0c;节奏暂时跟不上&#xff0c;紧张焦虑了。五一时也有点自暴自弃了&#xff0c;实在没必要&#xff0c;按照自己的节奏走即可。精力和时间也有限&#xff0c;放在…

AVL树插入详解

1.什么是AVL树 二叉搜索树可以提高搜索的效率&#xff0c;但是如果数据有序或者接近有序&#xff0c;就会退化为单边树&#xff0c;查找效率相当于在顺序表中查找数据&#xff0c;时间复杂度会退化到O(n)。AVL树解决了这个问题&#xff0c;通过保证每个节点的左右子树高度之差…

重学java 83.Java注解

As a failure,I met my last sound. —— 24.6.24 一、注解的介绍 1.引用数据类型: 类、数组、接口、枚举、注解 jdk1.5版本的新特性 一个引用数据类型 和类,接口,枚举是同一个层次的 引用数据类型:类、数组、接口、枚举、注解 2.作用: ① 说明&#xff1a;对代码进行说明,生…

elementui组件库实现电影选座面板demo

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Cinema Seat Selection</title><!-- 引入E…