Docker Compose应用实战

文章目录

  • 1、使用Docker Compose必要性及定义
  • 2、Docker Compose应用参考资料
  • 3、Docker Compose应用最佳实践步骤
    • 1_概念
    • 2_步骤
  • 4、Docker Compose安装
  • 5、Docker Compose应用案例
    • 1_网站文件准备
    • 2_Dockerfile文件准备
    • 3_Compose文件准备
    • 4_使用docker-compose up启动容器
    • 5_访问
    • 6_常见操作补充
  • 6、Docker Compose的版本
    • 1_支持的版本
    • 2_常见示例
    • 3_关键点
  • 7、总结


1、使用Docker Compose必要性及定义

用容器运行一个服务,需要使用docker run命令。但如果我要运行多个服务呢?

假设我要运行一个web服务,还要运行一个db服务,那么是用一个容器运行,还是用多个容器运行呢?

一个容器运行多个服务会造成镜像的复杂度提高,docker倾向于一个容器运行一个应用

那么复杂的架构就会需要很多的容器,并且需要它们之间有关联(容器之间的依赖和连接)就更复杂了。

这个复杂的问题需要解决,这就涉及到了容器编排的问题了。

Compose 编排

  • 是对多个容器进行启动和管理的方法
  • 例如:LNMT,先启动MySQL,再启动Tomcat,最后启动Nginx

服务架构的演进

  • 单体服务架构
  • 分布式服务架构
  • 微服务架构
  • 超微服务架构

容器编排工具

  • docker machine

    • 在虚拟机中部署docker容器引擎的工具
  • docker compose

    • 是一个用于定义和运行多容器Docker的应用程序工具
  • docker swarm

    • 是Docker Host主机批量管理及资源调度管理工具
  • mesos+marathon

    • mesos 对计算机计算资源进行管理和调度
    • marathon 服务发现及负载均衡的功能
  • kubernetes

    • google开源的容器编排工具

2、Docker Compose应用参考资料

网址:https://docs.docker.com/compose/

在这里插入图片描述

YAML说明:https://yaml.org/


3、Docker Compose应用最佳实践步骤

1_概念

工程(project)

服务 (Service)

容器 (Container)


2_步骤

1 定义应用的Dockerfile文件,为了anywhere进行构建。

2 使用docker-compose.yaml定义一套服务,这套服务可以一起在一个隔离环境中运行。

3 使用docker-compose up就可以启动整套服务。


4、Docker Compose安装

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

img

下载

wget https://github.com/docker/compose/releases/download/v2.31.0/docker-compose-linux-x86_64

加入到全局可执行文件目录下

mv docker-compose-linux-x86_64 /usr/bin/docker-compose

授予执行权限

chmod +x /usr/bin/docker-compose

验证

[root@localhost ~]# docker-compose version
Docker Compose version v2.31.0
[root@localhost ~]# docker compose version
Docker Compose version v2.29.7

注意:docker 20.10 以上版本自动集成 v2 的 docker compose ( 没有连词符- )


5、Docker Compose应用案例

运行Python语言开发的网站

1_网站文件准备

创建工作目录

mkdir flaskproject
cd flaskproject/

准备网站文件

vim app.py

添加如下内容(python)

import timeimport redis
from flask import Flaskapp = Flask(__name__)
cache = redis.Redis(host='redis', port=6379)# 用户的每一次访问都记录到redis中并返回给页面显示出来
def get_hit_count():retries = 5while True:try:return cache.incr('hits')except redis.exceptions.ConnectionError as exc:if retries == 0:raise excretries -= 1time.sleep(0.5)@app.route('/')
def hello():count = get_hit_count()return 'Hello World! I have been seen {} times.\n'.format(count)

可以看到需要两个重要服务flask和redis,将所需资源写入文件中保存

vim requirements.txt

添加:

flask
redis

2_Dockerfile文件准备

编写Dockerfile文件

vim Dockerfile

内容如下:

FROM python:3.7-alpine
WORKDIR /code
ENV FLASK_APP app.py
ENV FLASK_RUN_HOST 0.0.0.0
RUN apk add --no-cache gcc musl-dev linux-headers
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
COPY . .
CMD ["flask", "run"]

3_Compose文件准备

编写compose文件,在不使用额外选项的情况下,名字只能叫这个

vim docker-compose.yaml

内容如下:

version: '3'
services:web:build: .ports:- "5000:5000"redis:image: "redis:alpine"
versionyaml语法格式版本
services工程中所包含的服务
webweb服务
build.基于当前目录下的Dockerfile文件来构建镜像
ports暴露容器5000端口到宿主机5000
redisredis服务,同时使用了image指定了镜像

注意启动顺序是从文件定义的内容自上而下的。


4_使用docker-compose up启动容器

经过如上操作,总共准备好了如下文件:

[root@localhost flaskproject]# ls
app.py  docker-compose.yaml  Dockerfile  requirements.txt

执行docker-compose.yamlup表示创建并启动容器,停止则使用down

如果不想容器在前台启动,加上-d选项。

docker-compose up

输出:

[+] Running 9/9✔ redis Pulled                                                                                                                                                                                            15.8s ✔ da9db072f522 Pull complete                                                                                                                                                                             3.5s ✔ dd8d46bd4047 Pull complete                                                                                                                                                                             3.5s ✔ 5057e26f1a86 Pull complete                                                                                                                                                                             3.8s ✔ be83d0fd33a3 Pull complete                                                                                                                                                                             4.6s ✔ b3d150cb1b6c Pull complete                                                                                                                                                                             9.0s ✔ 369ad5b9119b Pull complete                                                                                                                                                                             9.0s ✔ 4f4fb700ef54 Pull complete                                                                                                                                                                             9.1s ✔ 37d63ae71d35 Pull complete                                                                                                                                                                             9.1s 
[+] Running 0/0
[+] Building 33.9s (8/10)                                                                                                                                                                         docker:default => [web internal] load build definition from Dockerfile                                                                                                                                                    0.0s 
[+] Building 42.5s (12/12) FINISHED                                                                                                                                                               docker:default=> [web internal] load build definition from Dockerfile                                                                                                                                                    0.0s=> => transferring dockerfile: 339B                                                                                                                                                                        0.0s => [web internal] load metadata for docker.io/library/python:3.7-alpine                                                                                                                                    4.5s=> [web internal] load .dockerignore                                                                                                                                                                       0.0s=> => transferring context: 2B                                                                                                                                                                             0.0s=> [web internal] load build context                                                                                                                                                                       0.0s => => transferring context: 1.37kB                                                                                                                                                                         0.0s=> [web 1/6] FROM docker.io/library/python:3.7-alpine@sha256:f3d31c8677d03f0b3c724446077f229a6ce9d3ac430f5c08cd7dff00292048c3                                                                              7.7s=> => resolve docker.io/library/python:3.7-alpine@sha256:f3d31c8677d03f0b3c724446077f229a6ce9d3ac430f5c08cd7dff00292048c3                                                                                  0.0s=> => sha256:f3d31c8677d03f0b3c724446077f229a6ce9d3ac430f5c08cd7dff00292048c3 1.65kB / 1.65kB                                                                                                              0.0s=> => sha256:e6da3ee9bb64dd12b98fa609487f112fe1e365522e6e8345309db15c22a80a51 1.37kB / 1.37kB                                                                                                              0.0s=> => sha256:1bac8ae77e4af0b868b62a75115616a20e025e0451eeed05d94a4cfc4523e58a 6.87kB / 6.87kB                                                                                                              0.0s=> => sha256:96526aa774ef0126ad0fe9e9a95764c5fc37f409ab9e97021e7b4775d82bf6fa 3.40MB / 3.40MB                                                                                                              3.6s=> => sha256:9875af95546db78168a6761b7fa205ed1cd0c153cd89356c1512e551c12b2d5c 622.29kB / 622.29kB                                                                                                          2.5s => => sha256:4819c95424fc4a94767c9329b02238ebcce0bc682384cb671379bc1fb8a12b55 10.94MB / 10.94MB                                                                                                            6.0s => => sha256:148762f75a1f92cc9857e9c488bf95d5aac61e9905ec47a7408025b2dd5c3b7a 240B / 240B                                                                                                                  3.0s => => sha256:ea1518237b3753b3fe40ee773d77651704178d9baa72ae5012e13a992cfa6c63 2.85MB / 2.85MB                                                                                                              5.2s => => extracting sha256:96526aa774ef0126ad0fe9e9a95764c5fc37f409ab9e97021e7b4775d82bf6fa                                                                                                                   0.1s => => extracting sha256:9875af95546db78168a6761b7fa205ed1cd0c153cd89356c1512e551c12b2d5c                                                                                                                   0.4s => => extracting sha256:4819c95424fc4a94767c9329b02238ebcce0bc682384cb671379bc1fb8a12b55                                                                                                                   1.0s => => extracting sha256:148762f75a1f92cc9857e9c488bf95d5aac61e9905ec47a7408025b2dd5c3b7a                                                                                                                   0.0s => => extracting sha256:ea1518237b3753b3fe40ee773d77651704178d9baa72ae5012e13a992cfa6c63                                                                                                                   0.5s => [web 2/6] WORKDIR /code                                                                                                                                                                                 0.3s => [web 3/6] RUN apk add --no-cache gcc musl-dev linux-headers                                                                                                                                            16.1s => [web 4/6] COPY requirements.txt requirements.txt                                                                                                                                                        0.0s => [web 5/6] RUN pip install -r requirements.txt                                                                                                                                                          13.3s => [web 6/6] COPY . .                                                                                                                                                                                      0.0s => [web] exporting to image                                                                                                                                                                                0.5s => => exporting layers                                                                                                                                                                                     0.5s => => writing image sha256:631b987cf5ad154d30190d2cdac81aeb50eea7b99d7cbb4f0258f32012f1a5d4                                                                                                                0.0s 
[+] Running 4/2o docker.io/library/flaskproject-web                                                                                                                                                         0.0s ✔ Service web                     Built                                                                                                                                                                   42.6s ✔ Network flaskproject_default    Created                                                                                                                                                                  0.4s ✔ Container flaskproject-web-1    Created                                                                                                                                                                  0.1s ✔ Container flaskproject-redis-1  Created                                                                                                                                                                  0.1s 
Attaching to redis-1, web-1
redis-1  | 1:C 08 Dec 2024 17:00:37.695 # WARNING Memory overcommit must be enabled! Without it, a background save or replication may fail under low memory condition. Being disabled, it can also cause failures without low memory condition, see https://github.com/jemalloc/jemalloc/issues/1328. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
redis-1  | 1:C 08 Dec 2024 17:00:37.695 * oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
redis-1  | 1:C 08 Dec 2024 17:00:37.695 * Redis version=7.4.1, bits=64, commit=00000000, modified=0, pid=1, just started
redis-1  | 1:C 08 Dec 2024 17:00:37.695 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
redis-1  | 1:M 08 Dec 2024 17:00:37.695 * monotonic clock: POSIX clock_gettime
redis-1  | 1:M 08 Dec 2024 17:00:37.697 * Running mode=standalone, port=6379.
redis-1  | 1:M 08 Dec 2024 17:00:37.698 * Server initialized
redis-1  | 1:M 08 Dec 2024 17:00:37.698 * Ready to accept connections tcp
web-1    |  * Serving Flask app 'app.py'
web-1    |  * Debug mode: off
web-1    | WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
web-1    |  * Running on all addresses (0.0.0.0)
web-1    |  * Running on http://127.0.0.1:5000
web-1    |  * Running on http://172.18.0.2:5000
web-1    | Press CTRL+C to quitw Enable Watch

5_访问

img


6_常见操作补充

详见官网:https://docs.docker.com/compose/reference/

基本语法如下:

docker compose [OPTIONS] [COMMAND]
类型参数或指令说明
Options-f指定compose文件的路径和名称
-p指定project名称,project 就是当前compose文件中设置的多个service的集合,是逻辑概念
Commandsup创建并启动所有service容器
down停止并移除所有容器、网络
ps列出所有启动的容器
logs查看指定容器的日志
stop停止容器
start启动容器
restart重启容器
top查看运行的进程
exec在指定的运行中容器中执行命令

6、Docker Compose的版本

version 是 Docker Compose 文件中的一个顶级字段,用来指定 Compose 文件的版本。

它直接影响文件的语法规则和功能支持,以下是对 version 的详细介绍:


1_支持的版本

Docker Compose 支持多个版本,每个版本提供不同的功能。主要版本包括:

1.x

  • 使用的是较早的 Compose 文件格式。
  • 没有顶级 version 字段。
  • 功能较为有限。

2.x

  • 引入了更复杂的功能,如 volumesnetworksdepends_on
  • 必须在文件中声明 version,如:
version: '2'

3.x

  • 当前推荐的版本,支持更多 Docker 的现代功能,如 Swarm 和服务扩展。
  • 常见版本为 33.13.2 等,需声明为:
version: '3'
  • 特性:支持 deployconfigssecrets 等功能,专为 Swarm 模式优化。

选择 version 时,应根据以下因素进行判断:

1 Docker 和 Compose 的版本兼容性

  • 运行环境的 Docker 和 Docker Compose 必须支持指定的 Compose 文件版本。
  • 可以通过命令检查支持的版本:
docker-compose version
docker version

2 功能需求

  • 简单场景: 如果仅需要基本功能(如定义服务、端口、卷等),可以使用 version: '2'version: '3'
  • 复杂场景: 如果需要使用 Swarm 或高级功能(如 deploy 配置),则需要使用 version: '3.x'

2_常见示例

以下是不同版本的 Compose 文件示例:

Version 1(无 version 字段)

适用于最基础的环境,仅定义服务。

web:image: nginxports:- "80:80"

Version 2

支持卷、网络、依赖等功能。

version: '2'
services:web:image: nginxports:- "80:80"depends_on:- redisredis:image: redis:alpine

Version 3

支持 Swarm 集成功能。

version: '3.8'
services:web:image: nginxports:- "80:80"deploy:replicas: 3redis:image: redis:alpine
volumes:data:driver: local

3_关键点

1 向后兼容

  • Docker Compose 支持向后兼容:较新版本的 Compose 文件可以在支持旧版本的环境中运行,但反之不一定成立。
  • 如果不确定兼容性,使用较低版本(如 2.4)可以提高通用性。

2 语法限制

  • 不同 version 支持的功能不同,某些字段(如 deploy)仅在 version: '3.x' 中可用。

3 最新推荐

  • 当前推荐使用 version: '3.8',这是最新功能最完善的版本。

7、总结

docker compose 强吗? 很强,因为我们会发现不管多么复杂的应用,使用 docker compose 都可以轻松将其构建起来!

但是它其实功能还不是太全,比如不能跨 docker host 工作,在云原生领域中,真正强大的是kubernetes。


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

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

相关文章

51c大模型~合集88

我自己的原文哦~ https://blog.51cto.com/whaosoft/12805165 #Number Cookbook 数字比你想得更复杂——一文带你了解大模型数字处理能力的方方面面 目前大语言模型(Large Language Models, LLMs)的推理能力备受关注。从思维链(Chain of…

STP(生成树协议)

STP的基本概念 概述 STP是一个用于局域网中消除环路的协议。运行该协议的设备通过彼此交互信息而发现网络中的环路,并对某些接口进行阻塞以消除环路。STP在网络中运行后会持续监控网络的状态,当网络出现拓扑变更时,STP能够感知并且进行自动…

GLM-4-Plus初体验

引言:为什么高效的内容创作如此重要? 在当前竞争激烈的市场环境中,内容创作已成为品牌成功的重要支柱。无论是撰写营销文案、博客文章、社交媒体帖子,还是制作广告,优质的内容不仅能够帮助品牌吸引目标受众的注意力&a…

Jetpack Compose赋能:以速破局,高效打造非凡应用

Android Compose 是谷歌推出的一种现代化 UI 框架,基于 Kotlin 编程语言,旨在简化和加速 Android 应用开发。它以声明式编程为核心,与传统的 View 系统相比,Compose 提供了更直观、更简洁的开发体验。以下是对 Android Compose 的…

MinerU:PDF文档提取工具

目录 docker一键启动本地配置下载模型权重文件demo.py使用命令行启动GPU使用情况 wget https://github.com/opendatalab/MinerU/raw/master/Dockerfile docker build -t mineru:latest .docker一键启动 有点问题,晚点更新 本地配置 就是在Python环境中配置依赖和…

UE4_控件蓝图_制作3D生命血条

一:效果图如下: 二、实现步骤: 1、新建敌人 右键蓝图类 选择角色, 重命名为BP_Enemytest。 双击打开,配置敌人网格体 修改位置及朝向 效果如下: 选择合适的动画蓝图类: 人物就有了动作&#x…

【深度学习】深刻理解ViT

ViT(Vision Transformer)是谷歌研究团队于2020年提出的一种新型图像识别模型,首次将Transformer架构成功应用于计算机视觉任务中。Transformer最初应用于自然语言处理(如BERT和GPT),而ViT展示了其在视觉任务…

用于日语词汇学习的微信小程序+ssm

日语词汇学习小程序是高校人才培养计划的重要组成部分,是实现人才培养目标、培养学生科研能力与创新思维、检验学生综合素质与实践能力的重要手段与综合性实践教学环节。本学生所在学院多采用半手工管理日语词汇学习小程序的方式,所以有必要开发日语词汇…

ichunqiu-2024年春秋杯网络安全联赛夏季赛-brother

1.打开题目,看到题目我就想到了再后面加一个ls,结果回显了ls,然后又想到会不会是模板注入,尝试{{7*7}},然后页面返回了49,说明存在模板注入 如下,判定为模板注入 看一下系统环境配置 然后看可…

基于Qwen2-VL模型针对LaTeX OCR任务进行微调训练 - 数据处理

基于Qwen2-VL模型针对LaTeX OCR任务进行微调训练 - 数据处理 flyfish 基于Qwen2-VL模型针对LaTeX_OCR任务进行微调训练_-_LoRA配置如何写 基于Qwen2-VL模型针对LaTeX_OCR任务进行微调训练_-_单图推理 基于Qwen2-VL模型针对LaTeX_OCR任务进行微调训练_-_原模型_单图推理 基于Q…

QT从入门到精通——Qlabel介绍与使用

1. QT介绍——代码测试 Qt 是一个跨平台的应用程序开发框架,广泛用于开发图形用户界面(GUI)应用程序,也支持非图形应用程序的开发。Qt 提供了一套工具和库,使得开发者能够高效地构建高性能、可移植的应用程序。以下是…

Edge SCDN深度解析,边缘安全加速的创新实践

边缘安全加速(Edge Secure Content Delivery Network,SCDN)是酷盾安全推出的边缘集分布式 DDoS 防护、CC 防护、WAF 防护、BOT 行为分析为一体的安全加速解决方案。通过边缘缓存技术,智能调度使用户就近获取所需内容,为…

WebRTC Simulcast 大小流介绍与优化实践

Simulcast 是 WebRTC 中的一种标准化技术 ,简称大小流。通过 Simulcast,客户端可以同时发送同一视频的多个版本。每个版本都以不同的分辨率和帧率独立编码,带宽较多的拉流端可以接收较高质量的视频流,带宽有限的拉流端则可以接收较…

40分钟学 Go 语言高并发:服务监控与追踪

服务监控与追踪 一、知识要点总览 模块核心内容技术选型难度监控指标请求量、响应时间、错误率、资源使用Prometheus Grafana中链路追踪分布式调用链、性能瓶颈分析Jaeger, OpenTelemetry高日志处理日志收集、分析、存储ELK Stack中告警系统告警规则、通知渠道、告警分级Ale…

vue3 使用 konva

1&#xff1a;安装 npm install vue-konva konva --save 在main.ts 里面引入 import VueKonva from vue-konva; app.use(VueKonva); 2&#xff1a;效果图 3&#xff1a;直接粘贴复制就能用你 &#xff08;重要的地方做了备注&#xff09; <template><div st…

Spring Boot集成Knife4j文档工具

Knife4j 搭建 Knife4j环境的的搭建和Swagger一样都比较简单&#xff0c;只需要极简的配置即可。 maven依赖 我使用的是较高版本的基于openapi规范的依赖包&#xff0c;OpenAPI2(Swagger)规范是Knife4j之前一直提供支持的版本&#xff0c;底层依赖框架为Springfox。 此次在4…

keil5搜索框还有左侧文件状态栏不见的问题

点击上面的window&#xff0c;弹出 reset view to default &#xff0c;然后点击&#xff0c;再点击reset&#xff0c;就ok了

基于Mybatis,MybatisPlus实现数据库查询分页功能

基于Mybatis&#xff0c;MybatisPlus实现数据库查询分页功能 目录 基于Mybatis&#xff0c;MybatisPlus实现数据库查询分页功能使用Mybatis插件实现分页数据库准备分页插件配置和使用常用数据&#xff1a; 使用MybatisPlus插件实现分页数据库准备分页插件配置和使用自定义分页查…

HNU_多传感器(专选)_作业4(构建单层感知器实现分类)

1. (论述题)&#xff08;共1题&#xff0c;100分&#xff09; 假设平面坐标系上有四个点&#xff0c;要求构建单层感知器实现分类。 (3,3),(4,3) 两个点的标签为1&#xff1b; (1,1),(0,2) 两个点的标签为-1。 思路&#xff1a;要分类的数据是2维数据&#xff0c;需要2个输入…

内圆弧转子泵绘制工具开发

接着上期的Gerotor 泵的话题继续。最近有小伙伴找我开发一个内圆弧摆线泵的计算绘制工具&#xff0c;也就是把上次计算绘制的过程做成一个桌面应用工具&#xff0c;这样用起来会更方便、效率更高。那究竟是什么样的工具呢&#xff1f;一起来看看&#xff1a; 前面不是已经有了上…