Docker实战——使用 Docker Compose 进行服务编排

目录

  • 安装配置 Docker Compose
    • 方法一:
    • 方法二:
  • 进行服务编排
    • 使用手动方式部署应用
      • 1、使用 Python 创建 Web 应用(创建文件“app.py”),文件内容如下:
      • 2、创建 “requirements.txt” 文件,由于在应用中使用了 Flask 和 Redis,因此在文件中输入以下内容:
      • 3、创建 “Dockerfile” 文件,并输入以下内容。
      • 4、使用 “docker build” 命令编译 Dockerfile 文件。
      • 5、由于应用中需要Redis 的支持,所以先启动一个 Redis 容器。
      • 6、使用 “docker run” 命令启动 Web 应用,并使用 --link 参数连接到 Redis 容器。
      • 7、打开浏览器访问宿主机的 5000 端口并刷新网页,便可以观察到计数器的自增效果,如图所示:
    • 使用 Docker Compose 部署应用
      • 1、在当前目录下创建 “docker-compose.yml” 文件,输入以下内容。
      • 2、通过 “docker-compose up ” 命令启动应用。
      • 3、打开浏览器访问宿主机的 5000 端口。这时可以观察到与上一节一样的效果。
      • 4、执行 “docker-compose ps” 命令查看此时启动的容器信息。
      • 5、执行 “docker-compose images” 命令可以
    • 使用 Docker Compose 进行服务的在线扩容/缩容
      • 1、扩容
      • 2、缩容
  • Docker Compose 中的网络
    • Docker Compose 中的默认网络环境
    • 在 Docker Compose 中自定义模块的网络环境

  在使用 Docker 部署应用时,可以通过定义 Dockerfile 文件来完成对应用服务的描述,之后使用 “docker build” “docker run” 等命令操作容器。
  但是,随着应用架构的不断复杂和微服务的应用,通常在一个系统中需要包含多个模块,而一般情况下这些模块都会被部署到不同的 Docker 容器中。如果每一个模块都通过手动方式来完成部署,则效率是非常低的,且也不利于系统的维护和扩展。
  使用 Docker Compose 可以非常方便地定义和运行复杂应用,他是 Docker 提供的一个服务编排工具。Docker Compose 不是通过 shell 脚本命令,而是通过 YML 描述文件来完成对 Docker 容器的管理。

安装配置 Docker Compose

  Docker Compose 依赖 Docker 的引擎来完成服务的编排,因此,在安装配置 Docker Compose 之前需要先安装好 Docker 引擎。

方法一:

登录官网地址下载指定版本,官网地址

方法二:

使用软件包方式安装

sudo apt search docker-compose
sudo apt install docker-compose
sudo docker-compose --version

在这里插入图片描述

进行服务编排

  Docker Compose 通过 YML 文件来管理一个复杂系统中的多个容器。在该文件中,所有的容器都是通过 Service 来定义的。Docker Compose 使用 docker-compose 脚本来完成服务的启动、停止、管理和扩容等。因此,Docker Compose 非常适合使用多个容器来应对复杂的应用场景。

使用手动方式部署应用

  使用手动方式部署应用,需要创建 Dockerfile 文件来描述应用。下面是具体操作步骤。

1、使用 Python 创建 Web 应用(创建文件“app.py”),文件内容如下:

from flask import Flask
from redis import Redis
import os
app = Flask(__name__)
redis = Redis(host='redis', port=6379)
@app.route('/')
def hello():
    redis.incr('hits')
    return 'I have been seen %s times.' % redis.get('hits')
if __name__ == "__main__":
    app.run(host="0.0.0.0", debug=True)

在这里插入图片描述

其中,
第 01 行,基于轻量级 Web 框架 Flask 来使用 python 语言快速实现一个网站或者 Web 服务。
第 02 行,使用python Redis 模块在 Python Web 模块中访问 Redis 数据库,将用户在 Web 界面上的刷新次数保存到 Redis 中。
第 06行,指定 Redis 数据库的地址信息,这里指定了运行 Redis 的主机名和端口号。
第 11 行,通过变量 “redis” 访问 Redis 数据库完成计数功能。
第 12行,是Web 界面上显示的内容,即用户刷新 Web 网页的次数。

2、创建 “requirements.txt” 文件,由于在应用中使用了 Flask 和 Redis,因此在文件中输入以下内容:

flask
redis

3、创建 “Dockerfile” 文件,并输入以下内容。

FROM python
ADD . /code
WORKDIR /code
COPY app.py /code
RUN pip install -r requirements.txt
CMD ["python","app.py"]

4、使用 “docker build” 命令编译 Dockerfile 文件。

sudo docker build -t myapplication .

5、由于应用中需要Redis 的支持,所以先启动一个 Redis 容器。

sudo docker run --name myredis -d -p 6379:6379 redis

6、使用 “docker run” 命令启动 Web 应用,并使用 --link 参数连接到 Redis 容器。

sudo docker run --name myapp_using_redis -p 5000:5000 --link myredis:redis -d myapplication

7、打开浏览器访问宿主机的 5000 端口并刷新网页,便可以观察到计数器的自增效果,如图所示:

在这里插入图片描述
在这里插入图片描述

使用 Docker Compose 部署应用

  在上一节中,使用手动的方式完成了应用的部署和启动,实现了计数器的自增功能。在该应用中只包含了两个模块。
  随着系统架构的不断复杂和模块的不断增多,这样的手动方式会变得越来越不方便。并且,如果要实现扩容/缩容等操作,则手动方式无法很好的解决这样的问题。
  而使用 Docker Compose 则可以非常方便地解决这样的问题,其核心是定义一个 YML 文件来对即将部署的应用进行描述。此时的目录结构如下。
在这里插入图片描述
下面演示如何使用 Docker Compose 。

1、在当前目录下创建 “docker-compose.yml” 文件,输入以下内容。

version: "3"
services:
  web:
    build: .
    ports:
      - "5000:5000"
  redis:
    image: "redis"

在这里插入图片描述

其中:
从第02行开始,定义了该应用中所有包含的模块。这里定义应用包含两个模块——第03行的web 模块和第07行的 redis 模块。
第03-06行,定义了 web 模块。通过使用 build 命令在当前目录下编译 Dockerfile 文件,将生成的镜像保存到本地;并且在启动容器时,将宿主机的 5000 端口映射到容器的 5000 端口。
第 07 和 08 行定义了 redis 模块。通过参数 “image” 指定在启动容器时使用 “redis” 镜像。如果本地没有该镜像,则从镜像仓库中拉取该镜像。

2、通过 “docker-compose up ” 命令启动应用。

sudo docker-compose up -d

3、打开浏览器访问宿主机的 5000 端口。这时可以观察到与上一节一样的效果。

在这里插入图片描述
在这里插入图片描述

4、执行 “docker-compose ps” 命令查看此时启动的容器信息。

在这里插入图片描述

5、执行 “docker-compose images” 命令可以

在这里插入图片描述

使用 Docker Compose 进行服务的在线扩容/缩容

  使用 Docker Compose 可以非常方便地实现服务的在线扩容/缩容。
在这里插入图片描述

1、扩容

  以上一节中部署的引用为例,来演示如何使用 “docker-compose scale” 命令完成对服务的在线扩容/缩容。
执行下面的命令将服务中的 redis 模块扩展到3个容器中。

sudo docker-compose scale redis=3
sudo docker-compose ps

在这里插入图片描述
在这里插入图片描述
如图所示:这时 Docker Compose 启动了 3 个容器来运行 redis 模块,从而实现了负载均衡功能,以达到分摊请求压力的目的。

2、缩容

sudo docker-compose scale redis=2
sudo docker-compose ps

在这里插入图片描述

Docker Compose 中的网络

  在 Docker Compose 中提供了默认的网络环境,也可以在 docker-compose.yml 文集自定义网络环境。

Docker Compose 中的默认网络环境

  以上一节定义的 docker-compose.yml 文件为例,在执行 “docker-compose up” 命令启动应用时,会对 Docker Compose 网络环境执行以下的操作:
(1)使用 bridge 模式创建一个名为 “compose_default” 网络,如图所示:
在这里插入图片描述
(2)使用 web 模块的配置信息创建一个容器,并使用 “web” 作为容器的主机名加入 “compose_default” 网络。
(3)使用 redis 模块的配置信息创建一个容器,并使用 “redis” 作为容器的主机名加入 “compose_default” 网络。
完成上述步骤后,运行应用的所有容器,便可以通过主机名 “web” 和 “redis” 实现在 “compose_default” 网络环境中的容器相互访问了。例如,Python Web 应用 app.py 中的第 06 行代码,通过主机名 “redis” 访问 redis 模块。
在这里插入图片描述

  由于 Docker Compose 会使用 docker-compose.yml 文件中模块的名字作为容器的主机名,因此,在 docker-compose.yml 文件中模块的名字必须唯一。

如果想在 Docker Compose 中覆盖默认的网络配置,则可以在 docker-compose.yml 文件中通过指定参数 “networks” 的值来实现,如以下代码所示:
在这里插入图片描述

在 Docker Compose 中自定义模块的网络环境

  Docker Compose 除提供默认的网络环境外,也允许用户自定义各个模块的网络环境,这样用户可以实现更加复杂的网络。每一个模块也可以通过参数 “networks” 连接到网络环境中。
  以下 docker-compose.yml 是 Docker 官网提供的一个示例。
在这里插入图片描述
   在这个文件中一共包含 3 个模块:proxy、app 和 db。其中,proxy 和 db 模块属于不同的网络环境,即 proxy 模块属于 “frontend” 网络,而 db 属于 “backend” 网络。这两个网络彼此隔离,不能进行相互访问。但是,在 app 模块中通过参数networks 指定了 “frontend” 网络和 “backend” 网络,即 app 模块及可以访问 proxy 模块,也可以访问 db 模块。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

根据关键词过滤内容

package com.example.test.utils;import java.util.*;/*** Author leo* Date 2024/3/6 10:41* description: 敏感词工具类* Title: MgcUtils* Package org.jeecg.modules.yygl.dbwgl*/ public class MgcUtils {private static Map<String, Object> dictionaryMap null;p…

EasyX的学习2

消息处理——漂亮的按钮(鼠标) 用到的函数 1.消息结构体变量类型&#xff1a;使用ExMessage ExMessage msg{ 0 }; 定义一个变量名为msg的ExMessage结构体变量并初始化为0 2.获取消息函数&#xff1a;peekmessage函数 //获取消息 peekmessage(&msg, EX_MOUSE); 两个参…

阿里云几核服务器够用?内存多少合适?

阿里云服务器配置怎么选择&#xff1f;CPU内存、公网带宽和系统盘怎么选择&#xff1f;个人开发者或中小企业选择轻量应用服务器、ECS经济型e实例&#xff0c;企业用户选择ECS通用算力型u1云服务器、ECS计算型c7、通用型g7云服务器&#xff0c;阿里云服务器网aliyunfuwuqi.com整…

Git分布式管理-头歌实验远程版本库

Git的一大特点就是&#xff0c;能为不同系统下的开发者提供了一个协作开发的平台。而团队如果要基于Git进行协同开发&#xff0c;就必须依赖远程版本库。远程版本库允许&#xff0c;我们将本地版本库保存在远端服务器&#xff0c;而且&#xff0c;不同的开发者也是基于远程版本…

算法Day04_203.移除链表元素

推荐阅读 算法day01_ 27. 移除元素、977.有序数组的平方 算法day02_209.长度最小的子数组 算法day03_ 59.螺旋矩阵II 目录 推荐阅读203.移除链表元素题目思路解法暴力解法虚拟头结点解法 203.移除链表元素 题目 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删…

Python爬虫实战第三例【三】【上】

零.实现目标 爬取视频网站视频 视频网站你们随意&#xff0c;在这里我选择飞某速&#xff08;狗头保命&#xff09;。 例如&#xff0c;作者上半年看过的“铃芽之旅”&#xff0c;突然想看了&#xff0c;但是在正版网站看要VIP&#xff0c;在盗版网站看又太卡了&#xff0c;…

大模型快速实现python3+html内容在线渲染

需求&#xff1a; 有一份数据需要通过前端在线展示给用户&#xff0c;不需要复杂的样式交互&#xff0c;后端服务是基于Python3实现的API接口&#xff0c;对前端技术不是很了解&#xff0c;需要快速实现该需求。类似样式即可&#xff1a; 思路&#xff1a; 如果页面不复杂&am…

【MySQL】深入解析日志系统:undo log、redo log、bin log

文章目录 前言1、undo log1.1、undo log 是什么1.2、事务回滚 2、redo log2.1、redo log 是什么2.2、redo log 刷盘2.3、redo log 硬盘文件 3、bin log3.1、bin log 是什么3.2、bin log 和 redo log 区别3.3、bin log 刷盘3.4、两阶段提交 前言 MySQL数据库提供了功能强大的日…

一文了解74HCT14D的引脚图、符号、封装、数据手册及应用

74HCT14D 是一款采用硅栅 C2MOS 技术制造的高速 CMOS 施密特逆变器。它实现了类似于等效 LSTTL 的高速操作&#xff0c;同时保持 CMOS 的低功耗。该器件可用作电平转换器&#xff0c;用于将 TTL 或 NMOS 连接到高速 CMOS。 输入与 TTL、NMOS 和 CMOS 输出电压电平兼容。所有输入…

CSS实现选中卡片样式操作

图一默认自动选中&#xff0c;并且不可取消选中&#xff0c;当选择其他卡片才可点击下一步 在 “ src/assets ” 路径下存放 save.png&#xff0c;代表选中的状态 <div class"cards"><ul class"container"><li v-for"image in image…

今天BOSS约了个面试,HR直接发我一道面试题

前言 在电商、外卖、预约服务等场景中&#xff0c;订单超时自动取消是一个常见的业务需求。这一功能不仅提高了系统的自动化程度&#xff0c;还为用户提供了更好的体验。需求如下&#xff1a; TODO如果用户在生成订单后一定时间未支付&#xff0c;则系统自动取消订单。接下来…

大路灯哪个品牌好用?5款超火大路灯推荐,帮你全面了解大路灯!

大路灯是一种用于提供良好照明环境的电器&#xff0c;通过专业的技术&#xff0c;将光线用过折射、反射、过滤&#xff0c;最终呈现柔和明亮的光线。但市面上的大路灯琳琅满目&#xff0c;有些大路灯存在虚标数据和配置的问题&#xff0c;夸大宣传过后导致很多人入手&#xff0…

Android中的传感器类型和接口名称

本文将介绍传感器坐标轴、基础传感器和复合传感器&#xff08;动作传感器、姿势传感器、未校准传感器和互动传感器&#xff09;。 1. 传感器坐标轴 许多传感器的传感器事件值在相对于设备静止的特定坐标系中表示。 1.1 移动设备坐标轴 Sensor API 仅与屏幕的自然方向相关&a…

leetcode:88. 合并两个有序数组

原题地址&#xff1a;https://leetcode.cn/problems/merge-sorted-array/description/ 题目描述 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2&#xff0c;另有两个整数 m 和 n &#xff0c;分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 nums1 中&a…

VSCode安装

前言 Visual Studio Code 是一个轻量级功能强大的源代码编辑器&#xff0c;支持语法高亮、代码自动补全&#xff08;又称 IntelliSense&#xff09;、代码重构、查看定义功能&#xff0c;并且内置了命令行工具和 Git 版本控制系统。适用于 Windows、macOS 和 Linux。它内置了对…

网络原理初识(1)

目录 一、网络发展史 1、独立模式 2、网络互联 3、局域网LAN 局域网组建的方式 1、基于网线直连 2、基于集线器组建 3、基于交换机组建 4、基于交换机和路由器组建 4、广域网WAN 二、网络通信基础 1、IP地址 2、端口号 3、认识协议 4、五元组 一、网络发展史 1、独立模式 …

rabbitmq3

指定通过通道将消息发送给哪个消息队列 同一个通道可以向不同的队列发送消息的&#xff0c;如果你绑定的队列和发布消息的队列不一致也是可以的&#xff0c;这个才是真正的发布消息去具体的某一个队列&#xff1a; 如果队列没有持久化&#xff0c;就不会把这个消息队列保存在磁…

对象得定义与使用(动力节点老杜)

对象思想 1.什么是面向过程&#xff0c;什么是面向对象&#xff1f; 换而言之&#xff0c;面向对象思想实际就是将整体分成一个个独立的单元&#xff0c;每个单元都有自己得任务和属性&#xff0c;所有单元结合在一起完成一个整体。如果某个单元出现了问题还可以及时处理&…

微软研究深度报告:Sora文转视频AI模型全景剖析及未来展望

论文由微软研究团队撰写&#xff0c;这篇论文深入探讨了Sora的发展背景、核心技术、新兴应用场景、现有的局限性以及未来的发展机会&#xff0c;基于公开资料和团队自行进行的逆向工程分析。文中详尽且逻辑清晰&#xff0c;建议细读全文以获得深入了解。 原文&#xff1a;Sora…

nginx生成自签名SSL证书

备注&#xff1a;nginx自生成的ssl证书在浏览器访问时会提示此证书不受信用 1.安装nginx nginx必须有"--with-http_ssl_module"模块 查看nginx安装的模块&#xff1a; [rootmaster1 key]# nginx -V nginx version: nginx/1.24.0 built by gcc 4.8.5 20150623 (Red …