Docker Compose应用实战

news2025/2/23 2:30:31

文章目录

  • 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 time

import redis
from flask import Flask

app = Flask(__name__)
cache = redis.Redis(host='redis', port=6379)

# 用户的每一次访问都记录到redis中并返回给页面显示出来
def get_hit_count():
    retries = 5
    while True:
        try:
            return cache.incr('hits')
        except redis.exceptions.ConnectionError as exc:
            if retries == 0:
                raise exc
            retries -= 1
            time.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 quit


w 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: nginx
  ports:
    - "80:80"

Version 2

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

version: '2'
services:
  web:
    image: nginx
    ports:
      - "80:80"
    depends_on:
      - redis
  redis:
    image: redis:alpine

Version 3

支持 Swarm 集成功能。

version: '3.8'
services:
  web:
    image: nginx
    ports:
      - "80:80"
    deploy:
      replicas: 3
  redis:
    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.coloradmin.cn/o/2258978.html

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

相关文章

el-table组件树形数据修改展开箭头

<style lang"scss" scoped> ::v-deep .el-table__expand-icon .el-icon-arrow-right:before {content: ">"; // 箭头样式font-size: 16px; }::v-deep .el-table__expand-icon{ // 没有展开的状态background-color: rgba(241, 242, 245, 1);color:…

5.2 JavaScript 案例 - 轮播图

JavaScript - 轮播图 文章目录 JavaScript - 轮播图基础模版一、刷新页面随机轮播图案例二、轮播图 定时器版三、轮播图完整版 基础模版 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta http-equiv"…

MongoDB与阿里云庆祝合作五周年,展望AI赋能新未来

12月3日&#xff0c;在印尼举行的阿里云合作伙伴大会2024上&#xff0c;MongoDB荣膺阿里云“2024技术创新成就奖”&#xff0c;该奖项旨在表彰与阿里云保持长期稳定合作&#xff0c;通过深度技术融合&#xff0c;在产品技术创新、行业区域深耕等领域取得卓越成就的伙伴。自2019…

数据结构(Queue队列)

前言&#xff1a; 在计算机科学中&#xff0c;数据结构是构建高效算法和程序的基础&#xff0c;而队列&#xff08;Queue&#xff09;作为一种经典的线性数据结构&#xff0c;具有重要的地位。与栈&#xff08;Stack&#xff09;不同&#xff0c;队列遵循“先进先出”&#xf…

EDA - Spring Boot构建基于事件驱动的消息系统

文章目录 概述事件驱动架构的基本概念工程结构Code创建事件和事件处理器创建事件总线创建消息通道和发送逻辑创建事件处理器消息持久化创建消息发送事件配置 Spring Boot 启动类测试消息消费运行项目 概述 在微服务架构和大规模分布式系统中&#xff0c;事件驱动架构&#xff…

仿iOS日历、飞书日历、Google日历的日模式

仿iOS日历、飞书日历、Google日历的日模式&#xff0c;24H内事件可自由上下拖动、自由拉伸。 以下是效果图&#xff1a; 具体实现比较简单&#xff0c;代码如下&#xff1a; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color;…

软考高级架构 - 10.5 软件架构演化评估方法

10.4 软件架构演化原则总结 本节提出了18条架构演化的核心原则&#xff0c;并为每条原则设计了简单而有效的度量方法&#xff0c;用于从系统整体层面提供实用信息&#xff0c;帮助评估和指导架构演化。 演化成本控制&#xff1a;成本小于重新开发成本&#xff0c;经济高效。进…

DocFlow票据AI自动化处理工具:出色的文档解析+抽取能力,提升企业文档数字化管理效能

目录 财务应付 金融信贷业务 近期&#xff0c;DocFlow票据自动化产品正式上线。DocFlow是一款票据AI自动化处理工具&#xff0c;支持不同版式单据智能分类扩展&#xff0c;可选功能插件配置流程&#xff0c;满足多样业务场景。 随着全球化与信息化进程&#xff0c;企业的文件…

C# 探险之旅:第二节 - 定义变量与变量赋值

欢迎再次踏上我们的C#学习之旅。今天&#xff0c;我们要聊一个超级重要又好玩的话题——定义变量与变量赋值。想象一下&#xff0c;你正站在一个魔法森林里&#xff0c;手里拿着一本空白的魔法书&#xff08;其实就是你的代码编辑器&#xff09;&#xff0c;准备记录下各种神奇…

有道云笔记批量导出

前言 最近使用有道云笔记遇到打开过慢&#xff0c;导致笔记丢失&#xff0c;需要会员才能找回之前笔记问题。 决定改用思源&#xff0c;程序中的格式比较难于通过复制保留&#xff0c;即使导出成word 或者pdf&#xff0c;需要一个专门工具导出成Markdown格式&#xff0c;批量…

离线无网环境中基于OpenEuler的everything ISO安装软件

文章目录 1.创建挂载点 2.挂载 ISO 文件: 3.配置 YUM 源 4.清理 YUM 缓存并生成新的缓存: 5.使用 YUM 安装软件包 要在 OpenEuler 系统中挂载ISO &#xff08;下载地址&#xff1a;https://repo.openeuler.openatom.cn/openEuler-20.03-LTS/ISO/x86_64/&#xff09;并使用…

2024最新树莓派4b安装ubuntu20.04.5-server版本全流程解决方案:从烧录到配置桌面到联网!!!

准备工作 硬件工具 树莓派4b&#xff0c;32GSD卡&#xff0c;读卡器 软件工具 ubuntu20.04.5镜像&#xff0c;SD卡格式化工具&#xff0c;烧录软件&#xff0c;远程连接工具。 下面是我通过百度网盘分享的文件&#xff1a;树莓派4bubuntu20.04链接&#xff1a;https://pan…

STM32 OLED屏幕驱动详解

一、介绍 OLED是有机发光二极管&#xff0c;又称为有机电激光显示&#xff08;Organic Electroluminescence Display&#xff0c; OLED&#xff09;。OLED由于同时具备自发光&#xff0c;不需背光源、对比度高、厚度薄、视角广、反应速度快、可用于挠曲性面板、使用温度范围广…

商业银行基于容器云的分布式数据库架构设计与创新实践

导读 本文介绍了某商业银行基于 TiDB 和 Kubernetes(简称 K8s) 构建的云化分布式数据库平台&#xff0c;重点解决了传统私有部署模式下的高成本、低资源利用率及运维复杂等问题。 通过引入 TiDB Operator 自动化管理与容器化技术&#xff0c;银行能够实现多个业务系统的高可用…

项目组件框架介绍[etcd]

文章目录 前言etcd安装Ubuntu 上通过包管理器安装通过源码安装配置 客户端开发包开发包的安装接口介绍添加一个键值对获取一个键值对租约保活机制监听 封装服务注册与发现服务注册服务发现 前言 Etcd 是一个 golang 编写的分布式、高可用的一致性键值存储系统&#xff0c;用于配…

网页爬虫技术全解析:从基础到实战

引言 在当今信息爆炸的时代&#xff0c;互联网上的数据量每天都在以惊人的速度增长。网页爬虫&#xff08;Web Scraping&#xff09;&#xff0c;作为数据采集的重要手段之一&#xff0c;已经成为数据科学家、研究人员和开发者不可或缺的工具。本文将全面解析网页爬虫技术&…

Jmeter如何对UDP协议进行测试?

Jmeter如何对UDP协议进行测试&#xff1f; 1 jmeter-plugins安装2 UDP-Protocol Support安装3 UDP协议测试 1 jmeter-plugins安装 jmeter-plugins是Jmeter的插件管理器&#xff1b;可以组织和管理Jmeter的所有插件&#xff1b;直接进入到如下页面&#xff0c;选择如图的选项进…

计算机网络之网络层超详细讲解

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 计算机网络之网络层超详细讲解 收录于专栏【计算机网络】 本专栏旨在分享学习计算机网络的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; …

微信小程序:实现节点进度条的效果;正在完成的节点有动态循环效果;横向,纵向排列

参考说明 微信小程序实现流程进度功能 - 知乎 上面的为一个节点进度条的例子&#xff0c;但并不完整&#xff0c;根据上述代码&#xff0c;进行修改完善&#xff0c;实现其效果 横向效果 代码 wxml <view classorder_process><view classprocess_wrap wx:for&quo…

如何不重启修改K8S containerd容器的内存限制(Cgroup方法)

1. 使用crictl 查看容器ID crictl ps2. 查看Cgroup位置 crictl inspect 容器ID3. 到容器Cgroup的目录下 使用上个命令就能找到CgroupPath 4 . 到cgroup目录下 正确目录是 : /sys/fs/cgroup/memory/kubepods.slice/kubepods-burstable.slice/kubepods-burstable-podf68e18…