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,需要以下步骤:
-
- 使用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