Docker Compose 基本概要

Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。使用 YAML 文件来配置多个应用程序的服务,包括生产、暂存、开发、测试以及 CI 工作流。

尝试构建 Docker Compose

一个简单的 Python Web 应用程序服务:使用 Flask 框架并在 Redis 中维护

基础素材

  • 项目创建一个目录 mkdir compose-test && cd compose-test

  • app.py 内容

    import time
    
    import redis
    from flask import Flask app = Flask(__name__)
    cache = redis.Redis(host='redis', port=6379) 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)
  • 创建 requirements.txt,为之后的 pip 使用

    flask
    redis

创建 Dockerfile

# syntax=docker/dockerfile:1

# Python 3.7 映像开始构建映像
FROM python:3.7-alpine # 设置环境变量
ENV FLASK_APP=app.py
ENV FLASK_RUN_HOST=0.0.0.0 # 安装 gcc 以及相关依赖
# set -e 表示之后任意命令错误立刻退出而不继续
# --no-cache 表示不使用缓存,相当与自己执行 apk update 绕过缓存的使用
RUN <<EOF
set -e
sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories
apk add --no-cache gcc musl-dev linux-headers
EOF # 设置工作区
WORKDIR /code # pip 安装相关 Python 包
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt -i https://mirrors.ustc.edu.cn/pypi/web/simple # 将项目中的当前目录复制到工作区
COPY . . # 添加容器正在监听端口并启动 flask run
EXPOSE 5000
CMD ["flask", "run"]

编写 docker-compose.yml 文件定义了两个服务:web, redis

version: "3.9"
services:
web:
build: .
ports:
- "8000:5000"
volumes:
- .:/code
environment:
FLASK_DEBUG: "true"
redis:
image: "redis:alpine"
  • ports 映射端口到宿主机
  • volumes 当前目录挂载到 /code 容器内部
  • environment 设置环境变量
  • FLASK_DEBUG 环境变量告诉 flask 在开发模式下运行并在更改时重新加载代码

最后使用 docker compose up 即可构建并运行服务

docker compose 命令

常用命令

  • docker compose up 根据 yml 文件构建服务并运行

    • -d 选项可以挂后台,类似 docker run -d 挂容器
  • docker compose ps 查看活跃服务

  • docker compose run 允许为服务运行一次性命令

  • docker compose stop 停止服务

  • docker compose down 关闭所有内容,完全删除容器

    • --volumes 移除容器使用的数据卷

最重要命令 docker compose --help

环境变量

.env 文件:存储环境变量,有点 requirements.txt 对于 pip 的感觉

  • 该文件应放在文件旁边的项目目录的根目录下 docker-compose.yml
  • 使用 --env-file 选项指定文件位置
  • docker-compose.yml 的 env_file 属性指定文件位置

docker-compose.yml 使用 environment 属性定义环境变量

web:
environment:
- DEBUG=1

docker-compose.yml 中对于环境变量是可以直接使用 shell 中的环境变量

优先级(由高到低):

  • 在 CLI 中 docker compose 的 -e 选项
  • shell 自带
  • docker-compose.yml 的 environment 属性
  • 命令行的 --env-file
  • docker-compose.yml 的 env_file 属性
  • docker-compose.yml 同级目录的 .env 文件
  • 镜像的 ENV 设置

使用环境文件

  • # 注释符

  • \ 转义字符

  • 通过键值方式,其中值可以使用单引号或双引号,比如 VAL=EMV

  • 双引号支持转义,比如 \n

  • 四种作用方法

    • 直接使用变量 ${VAR}
    • 默认值 ${VAR:-default} 如果 VAR 没有被设置且非空,就使用 default
    • 必须值 ${VAR:?error} 如果 VAR 没有被设置且非空,以 error 退出
    • 替代值 ${VAR:+replacement} 如果 VAR 被设置且非空,使用 replacement 替代
    • 其中不涉及非空状态使用去除 :

参考资料

其中 Docker Compose 文件标准 https://docs.docker.com/compose/compose-file/

Docker Compose 基本概要的更多相关文章

  1. Docker compose学习笔记

    一.compose compose 作用 你的应用可能需要很多个服务,比如web服务,数据库服务,缓存服务等等.我们可以把这些服务放到单独的容器里面,如果手工去配置这些服务会有些麻烦,docker c ...

  2. docker compose 笔记

    https://www.youtube.com/watch?v=Uez88TWOECg 是基于这个视频做的笔记. Docker Compose: Compose is a tool for defin ...

  3. 利用docker compose启动gitlab及runner

    添加docker compose配置文件 新建文件docker-compose.yml,输入如下内容: gitlab: image: 'gitlab/gitlab-ce:latest' contain ...

  4. Docker Compose to CoreOS

    taken from https://docs.docker.com/compose/install/ the only thing is that /usr is read only, but /o ...

  5. Docker Compose—简化复杂容器应用的利器

    Compose是用于定义和运行复杂Docker应用的工具.你可以在一个文件中定义一个多容器的应用,然后使用一条命令来启动你的应用,然后所有相关的操作都会被自动完成. 1. 安装Docker和Compo ...

  6. .NET遇上Docker - 使用Docker Compose组织Ngnix和.NETCore运行

    本文工具准备: Docker for Windows Visual Studio 2015 与 Visual Studio Tools for Docker 或 Visual Studio 2017 ...

  7. Docker Compose容器编排

    Compose是Docker官方的开源项目,可以实现对Docker容器集群的快速编排.Compose 中有两个重要的概念:服务(service):一个应用的容器,实际上可以包括若干运行相同镜像的容器实 ...

  8. Docker(四):Docker 三剑客之 Docker Compose

    前两篇文章我们介绍了 Dockerfile 的使用Docker(二):Dockerfile 使用介绍,我们知道使用一个 Dockerfile 模板文件可以定义一个单独的应用容器,如果需要定义多个容器就 ...

  9. Spring Boot 2.0(五):Docker Compose + Spring Boot + Nginx + Mysql 实践

    我知道大家这段时间看了我写关于 docker 相关的几篇文章,不疼不痒的,仍然没有感受 docker 的便利,是的,我也是这样认为的,I know your felling . 前期了解概念什么的确实 ...

  10. Docker学习笔记 - Docker Compose 脚本命令

    Docker Compose 配置文件包含 version.services.networks 三大部分,最关键的是 services 和 networks 两个部分, version: '2' se ...

随机推荐

  1. 论GNU、Linux和GNU/Linux之间的关系

    相信很多人看到了这个标题就会产生疑问,这篇文章到底要讲什么东西?在回答这个问题之前,我先提出几个问题? 1. 什么是Linux? 2. 什么是GNU? 3. GNU/Linux是什么玩意儿? 在回答了 ...

  2. 一文搞懂 ARM 64 系列: 一文搞懂 ARM 64 系列: 函数调用传参与返回值

    函数调用涉及到传参与返回值,下面就来看下ARM 64中,参数与返回值的传递机制. 1 整数型参数传递 这里的整数型并不单指int类型,或者NSInteger类型,而是指任何能够使用整数表示的数据类型, ...

  3. HDFS 常用操作命令

    HDFS 文件操作命令 注,其实常用命令不用网上搜,和linux下的命令很类似,触类旁通,直接在linux 上 hadoop fs 看一下就行了,不需要刻意去记 我把 linux 上的 help 列举 ...

  4. 如果你也用过 struts2.简单介绍下 springMVC 和 struts2 的区别有哪些?

    a.springmvc 的入口是一个 servlet 即前端控制器,而 struts2 入口是一个 filter 过虑器. b.springmvc 是基于方法开发(一个 url 对应一个方法),请求参 ...

  5. javascript 生成器和迭代器

    前置知识 生成器函数会返回一种称为Generator的迭代器 迭代器是一个对象,定义一个序列,并在终止时返回一个返回值 Symbol.iterator为每一个对象定义了默认的迭代器,可以被for..o ...

  6. mongodb插入文档,更新文档和检索文档

    import com.mongodb.client.*; import com.mongodb.client.MongoClient; import com.mongodb.client.model. ...

  7. Lakehouse 还是 Warehouse?(2/2).md

    这篇博文包括 Onehouse 首席执行官 Vinoth Chandar 于 2022 年 3 月在奥斯汀数据委员会发表的重要演讲的后半部分.本文是第 2 部分,比较了架构的功能和性价比特征.最后,它 ...

  8. Vector | Graph:蚂蚁首个开源Graph RAG框架设计解读

    检索增强生成(RAG:Retrieval Augmented Generation)技术旨在把信息检索与大模型结合,以缓解大模型推理"幻觉"的问题.近来关于RAG的研究如火如荼,支 ...

  9. ITMS-90717: 无效的应用程序商店图标

    PS导入照片 图像->模式->索引颜色 透明度去掉打勾保存即可

  10. maven项目创建默认目录结构

    maven项目创建默认目录结构命令 项目文件夹未创建情况下 mvn \ archetype:generate \ -DgroupId=com.lits.parent \ -DartifactId=my ...