Docker Compose – 一个扩展服务的Compose

Docker Compose – Docker Compose的扩展服务

原文:在Compose中扩展服务
https://docs.docker.com/compose/extends/

Paraphrase: 扩展Compose中的服务
https://docs.docker.com/compose/extends/

通过Docker Compose的extends关键字,可以在不同的文件中共享相同的配置,也可以在完全不同的项目中使用。扩展服务(Extending service)通常在多个服务器上重新使用已定义的服务时非常有用。只需要在一个地方定义服务,然后使用extends关键字,就可以在任何地方引用。

或者,您还可以在多个环境中部署具有稍微不同服务(或者修改一些设置)的同一应用程序。而且,您可以在无需复制粘贴的情况下进行设置。

深入理解設定

在使用 docker-compose.yml 定义服务时,您可以按以下方式声明对其他服务的扩展:

web:
  extends:
    file: common-services.yml
    service: webapp

通过此命令,Compose 将重用 common-services.yml 文件中的设置来定义 webapp 服务。假设 common-services.yml 的内容如下:

webapp:
  build: .
  ports:
    - "8000:8000"
  volumes:
    - "/data"

在这个例子中,使用docker-compose.yml文件中写入的内容进行构建将产生与手动构建相同的结果。相同之处在于在web部分定义的构建、端口和卷的设置。

让我们深入研究一下本地的docker-compose.yml配置文件的定义(或重新定义)。

web:
  extends:
    file: common-services.yml
    service: webapp
  environment:
    - DEBUG=1
  cpu_shares: 5

此外,还可以通过在web服务中链接其他服务进行描述。

web:
  extends:
    file: common-services.yml
    service: webapp
  environment:
    - DEBUG=1
  cpu_shares: 5
  links:
    - db
db:
  image: postgres

请参阅参考资料,了解有关 extends 用法的详细信息。

请提供一个句子进行翻译。

本例将重用快速入门指南中的应用程序(如果您不熟悉Compose,请先完成快速入门指南)。在这个示例中,我们将使用Compose进行本地开发,并假定将部署到生产环境。

本地环境和生产环境相似,但存在一些区别。在开发环境中,我们会将卷挂载以便能够修改应用程序代码。而在生产环境中,从外部看代码则是不可变的(不可更改的),旨在确保不会错误地进行更改。在开发环境中,我们使用本地的Redis容器,而在生产环境中,我们使用其他团队管理的名为redis-production.example.com的服务。

要设定此示例的extends,需要以下步骤:

    1. 使用Dockerfile定义Docker镜像的web应用程序,并使用common.yml定义Compose服务。

 

    使用常规的Compose文件docker-compose.yml定义开发环境。

extends を使って webサービスを取得(pull)
コードを読み込めるボリュームを設定
アプリケーションがローカルで使うための追加 Redis サービスを作成

3. 使用第三个Compose文件production.yml定义生产环境。

extends を使って web サービスを取得(pull)
web サービスが外部のプロダクション Redis サービスに接続できるよう定義

网页应用程序的定义

Web应用程序的定义如下:

    创建一个名为app.py的文件。

這個檔案將記述一個簡單的Python應用程式,使用Flask在HTTP上增加Redis計數器。

from flask import Flask
from redis import Redis
import os


app = Flask(__name__)
redis = Redis(host=os.environ['REDIS_HOST'], port=6379)


@app.route('/')
def hello():
   redis.incr('hits')
   return 'Hello World! I have been seen %s times.\n' % redis.get('hits')


if __name__ == "__main__":
   app.run(host="0.0.0.0", debug=True)

此代码中的环境变量 REDIS_HOST 定义了 Redis 的连接地址。

2. 在requirements.txt文件中定义Python的依赖关系。

flask
redis

3. 创建一个Dockerfile来构建包含应用程序的镜像。

FROM python:2.7
ADD . /code
WORKDIR /code
RUN pip install -r requirements.txt
CMD python app.py

创建一个名为common.yml的文件,用于设置Compose的配置。

这个设定定义了如何运行应用程序。

web:
  build: .
  ports:
    - "5000:5000"

典型的なのは、この設定を docker-compose.yml に落とし込む方法ですが、複数のファイルで extends を使って読み込むためには、ファイルを分ける必要があります。

开发环境的定义

    创建一个名为 docker-compose.yml 的文件。

extends选项将从前面一章创建的common.yml文件中获取web服务。

web:
  extends:
    file: common.yml
    service: web
  volumes:
    - .:/code
  links:
    - redis
  environment:
    - REDIS_HOST=redis
redis:
  image: redis

web サービスに新しく追加定義しているのは:

    • 外にある common.yml から web の基本設定を取得する。

 

    • 基本設定 common.yml の設定に volumes と links を追加する。

 

    環境変数 REDIS_HOST に redis コンテナのリンク先を設定する。この環境では Docker Hub から radis イメージを取得して使う。

2.docker-compose up の実行。

Compose は web と redis コンテナの作成、リンク、起動を一緒に行います。アプリケーション・コードのある場所は、web コンテナの中にマウントします。

您将在app.py文件的消息中确认代码是否已经加载。显示将从”Hello world!”变为”Hello from Compose!”。

请不要忘记重新加载浏览器以确认更改!

生产环境的定义

几乎完成了,接下来我们要定义生产环境:

    创建一个名为production.yml的文件。

与 docker-compose.yml 相同,extends 选项会获取 common.yml 的 web 服务。

web:
  extends:
    file: common.yml
    service: web
  environment:
    - REDIS_HOST=redis-production.example.com

执行以下命令 docker-compose -f production.yml up。

Compose会创建web容器并连接到由REDIS_HOST环境变量设置的Redis。这个变量指的是生产环境的Rails实例。

备忘录:尝试在浏览器中显示此网络应用程序时会出现错误。原因是因为名为 redis-production.example.com 的 Redis 服务器不存在。

使用extends关键字可以从其他配置文件同时加载服务。在应用程序开发期间,可以在common.yml中对web服务进行必要的更改。Compose在docker-compose执行时,可以选择适合开发和生产两种环境的正确配置。这样就不再需要手动复制粘贴或手动同步每个环境了。

参考资料

在任何服务中,extends 可以与其他设置密钥一起使用。它始终需要两个键,file 和 service,就像在字典中期望的那样。

file键用于指定要读取的文件。可以使用绝对路径或相对路径进行指定。相对路径是指相对于当前文件位置的路径。

service关键字用于指定服务的扩展名称,类似于web或database。

我们还可以将自身扩展到其他对象上。扩展没有限制。由于Compose不支持循环引用,因此如果存在循环引用,docker-compose将会中断处理。

添加和替换设定

Compose 会将原始服务设置本地复制,但会排除 links 和 volumes_from。这是为了明确服务之间的依赖关系,当读取当前文件时。同时,即使引用的文件损坏并且无法返回结果,您也可以在本地定义它们。

如果原始服务和本地服务对于相同选项进行了定义,那么会”覆盖”本地值或者”扩展”原始服务的定义。这种行为与其他设置选项不同。

只有一个值的选项,如image、command、mem_limit,会覆盖旧值。这是默认的行为,下面将列出所有例外情况。

# オリジナルのサービス
command: python app.py

# ローカルのサービス
command: python otherapp.py

# 結果
command: python otherapp.py

在构建和映像的情况下,如果定义了原始服务,Compose 将丢弃其他设置。

# オリジナルのサービス
build: .

# ローカルのサービス
image: redis

# 結果
image: redis

# オリジナルのサービス
image: redis

# ローカルのサービス
build: .

# 結果
build: .

由于 ports、expose、external_links、dns和dns_search都有多个选项,因此Compose会将每个值连接起来。

# オリジナルのサービス
export:
  - "3000"

# ローカルのサービス
expose:
  - "4000"
  - "5000"

# 結果
expose:
  - "3000"
  - "4000"
  - "5000"

在环境和标签的情况下,Compose 将优先合并本地定义的值。

# オリジナルのサービス
environment:
  - FOO=original
  - BAR=original

# ローカルのサービス
environment:
  - BAR=local
  - BAZ=local

# 結果
environment:
  - FOO=original
  - BAR=local
  - BAZ=local

最后,Compose将首先合并(整合)在本地定义的值,而后合并卷(volume)和设备(devices)。

# オリジナルのサービス
volumes:
  - /original-dir/foo:/foo
  - /original-dir/bar:/bar

# ローカルのサービス
volumes:
  - /local-dir/bar:/bar
  - /local-dir/baz/:baz

# 結果
volumes:
  - /original-dir/foo:/foo
  - /local-dir/bar:/bar
  - /local-dir/baz/:baz
广告
将在 10 秒后关闭
bannerAds