1. docker-composeの概要
docker-compose
dokcer
公式のオーケストレーションツールとして、シンプルなテンプレートファイルを作成することで、docker
コンテナーベースのアプリケーションクラスターをすばやく作成および管理できます。docker
コンテナクラスタの迅速なオーケストレーションを実現します。Dockerfile
テンプレートファイルを使用すると、ユーザーが個別のアプリケーションコンテナーを簡単に定義できることがわかります。ただし、日常業務では、特定のタスクを完了するために複数のコンテナが互いに連携する必要がある状況に遭遇することがよくあります。たとえば、Webプロジェクトを実装するには、web
サーバーコンテナー自体に加えて、バックエンドデータベースサービスコンテナーを追加し、さらに負荷分散コンテナーを含める必要がある場合があります。
そして、Composeはそのようなニーズを満たすことができ、ユーザーは個別のdocker-compose.yml
テンプレートファイルを介してYAML格式
関連するアプリケーションコンテナーのセットをプロジェクトとして定義できますproject
)
Composeには2つの重要な概念があります。
1)サービスサービス:アプリケーションコンテナーには、同じイメージを実行する複数のコンテナーインスタンスを実際に含めることができます。
2)プロジェクト:docker-compose.ymlファイルで定義された、関連付けられたアプリケーションコンテナーのグループで構成される完成したビジネスユニット。
2. docker-composeインストール
Docker-composeバイナリファイルをダウンロードして実行権限を追加する
[root@docker ~]# wget https://github.com/docker/compose/releases/download/1.23.2/docker-compose-`uname -s`-`uname -m`- O /usr/local/bin/docker-compose
[root@docker ~]# chmod +x /usr/local/bin/docker-compose
[root@docker ~]# docker-compose --version
docker-compose version
docker-compose version 1.23.2, build 1110ad01
docker-py version: 3.6.0
CPython version: 3.6.7
OpenSSL version: OpenSSL 1.1.0f 25 May 2017
3.作成コマンド
以下のためにCompose
、ほとんどのコマンドの目的は、プロジェクト自体のいずれかになります、それはまた、サービスまたはコンテナプロジェクトとして指定することができます。特別な説明がない場合、コマンドオブジェクトはプロジェクトになります。つまり、プロジェクト内のすべてのサービスがコマンドの影響を受けます。docker-compose
コマンドの基本的な形式は次のとおりです。
Usage:
docker-compose [-f <arg>...] [options] [COMMAND] [ARGS...]
docker-compose -h|--help
Options:
-f, --file FILE 指定使用的Compose模板文件,默认为docker-compose.yml,可多次指定;
-p, --project-name NAME 指定项目名称,默认将使用所在目录名称作为项目名 ;
--verbose 输出更多调试信息;
-v, --version 打印版本信息;
Commands:
build 构建项目中的服务容器
help 获得一个命令的帮助
images 列出所有镜像
kill 通过发送SIGKILL信号来强制停止服务容器
logs 查看服务器容器的输出
pause 暂停一个服务容器
port 打印某个容器的端口所映射的公共端口
ps 列出项目中目前的所有容器
pull 拉取服务依赖的镜像
push 推送服务依赖的镜像
restart 重启项目中的服务
rm 删除所有的服务器容器(停止状态中的)
run 在指定服务上执行一个命令
scale 设置指定服务运行的容器个数
start 启动已经存在的服务容器
stop 停止已经处于运行状态的容器,但不删除它
top 展示运行的进程
unpause 恢复处于暂停状态中的服务
up 自动完成包括构建镜像、创建服务、启动服务并关联服务相关容器的一系列操作
version 打印docker-compose的版本信息
4.テンプレートファイルを作成する
テンプレートファイルは使用Compose
の中心であり、多くのデザインキーワードキーワードがあります。デフォルトのテンプレートファイル名はdocker-compose.yml
で、形式はYAML
formatです。例:
version: "2"
service:
webapp:
image: examplses/web
ports:
- "80:80"
volumes:
- "/data"
各サービスはimage
、build
必要なイメージまたはコマンドを指定して、イメージをDockerfile
自動的に構築および生成する必要があることに注意してください)。build
命令を使用するとDockerfile
、で設定されたオプション(例:CMD、EXPOSE、VOLUME、ENV
など)は、docker-compose.yml
再設定せずに自動的に取得されます。テンプレートの主な手順と機能は次のとおりです。
1)ビルド手順
指定したDockerfile
フォルダーのパスは、絶対パスまたは相対docker-compose.yml
ファイルパスにすることができます。)Compose
それを使用してこのイメージを自動的に構築し、次にこのイメージを使用します。
build: /path/to/build/dir
2)cap_add、cap_drop
コンテナcapacity
割り当てのカーネル機能を指定します。たとえば、コンテナにすべての機能を持たせるには、次のように指定できます。
cap_add:
- ALL
削除する機能NET_ADMIN
は、次のように指定できます。
cap_drop:
- NET_ADMIN
3)コマンド
コンテナーの開始後に実行されるデフォルトのコマンドをオーバーライドします。
command: echo "hello world"
4)cgroup_parent
親cgroupグループを指定すると、グループのリソース制限が継承されます。たとえば、cgroup
グループは次のように作成されcgroups_1
ます。
cgroup_parent: cgroups_1
5)container_name
コンテナ名を指定します。デフォルトでは、「プロジェクト名_サービス名_シリアル番号」の形式が使用されます。たとえば、次のとおりです。
container_name: docker-web-container
指定容器名称后,该服务将无法进行扩展,因为Docker不允许多个容器具有相同的名称。
6)デバイス
デバイスマッピング関係を指定します。次に例を示します。
devices:
- "/dev/ttyUSB1:/dev/ttyUSB0"
7)dns
カスタムDNSサーバー。値またはリストを使用できます。次に例を示します。
dns: 8.8.8.8
dns:
- 8.8.8.8
- 114.114.114.114
8)dns_search
DNS検索ドメインを構成します。値またはリストを使用できます。次に例を示します。
dns_search: example.com
dns_search:
- domain1.example.com
- domain2.example.com
9)dockerfile
必要に応じて、コンパイルされたイメージの追加のDockerfileファイルを指定します。これは、この命令で指定できます。たとえば、
この命令はイメージでは使用できません。そうでない場合、Composeは最終的なサービスイメージを生成する命令を認識しません。
dockerfile: Dockerfile-alternate
10)env_file
ファイルから環境変数を取得します。これは、個別のファイルパスまたはリストにすることができます。
作成テンプレートファイルがdocker-compose -f FILEで指定されている場合、env_file内の変数のパスはテンプレートファイルのパスに基づきます。変数の名前と環境ディレクティブの間に矛盾がある場合は、規則が優先され、後者が優先されます。
env_file: .env
env_file:
- ./common.env
- ./apps/web.env
- ./opt/secrets.env
环境变量文件中每一行都必须符合格式,支持#开头的注释行:
11)環境
環境変数を設定します。配列または辞書形式を使用できます。指定された名前のみの変数は、Composeを実行しているホストの対応する変数の値を自動的に取得します。これを使用して、不要なデータの開示を防ぐことができます。たとえば、次のとおりです。
environment:
RACK_ENV: development
SESSION_SECRET
或者:
environment:
- RACK_ENV=development
- SESSION_SECRET
12)公開する
ポートは公開されていますが、ホストマシンにはマッピングされておらず、リンクされたサービスによるアクセスのみが許可されています。次のように、内部ポートのみをパラメータとして指定できます。
expose:
- "3000"
- "8000"
13)延長
他のテンプレートファイルに基づいて展開します。たとえば、次のように、すでにwebappサービスがあり、基本的なテンプレートファイルをcommon.ymlとして定義しています。
# common.yml
webapp:
build: ./webapp
environment:
- DEBUG=false
- SEND_EMAILS=false
新しいdevelopment.ymlファイルを記述し、common.ymlのwebappサービスを使用して展開します。
#development.yml
web:
extends:
file: common.yml
service: webapp
ports:
- "8000:8000"
links:
- db
environment:
- DEBUG=true
db:
image: postgres
development.ymlは、common.ymlのwebappサービスと環境変数の定義を自動的に継承します。extendsを使用するときは、次の点に注意してください。
1. AがBに依存し、BがCに依存し、CがAに依存するなど、循環依存を回避する
2. extendsは、リンクおよびvolume_fromで定義されたコンテナーおよびデータボリュームリソースを継承しません。
通常の状況では、基本テンプレートで共有できるミラー変数と環境変数のみを定義し、アプリケーション変数、リンク、データボリューム、およびその他の情報を拡張テンプレートで指定することをお勧めします。
14)external_links
docker-compose.ymlの外部コンテナー、またはComposeで管理されていない外部コンテナーへのリンク。パラメータの形式はリンクに似ています
external_links:
- redis_1
- project_db_1:mysql
- project_db_1:postgresql
15)extra_hosts
Dockerの–add-hostパラメータと同様に、追加のホスト名マッピング情報を指定します。次に例を示します。
extra_hosts:
- "googledns:8.8.8.8"
- "dockerhub:52.1.157.61"
会在启动后的服务容器中/etc/hosts文件中添加以下2个条目:
8.8.8.8 googledns
52.1.157.61 dockerhub
16)イメージ
イメージ名またはイメージIDを指定します。イメージがローカルに存在しない場合、Composeはイメージをプルしようとします。
image: centos
image: nginx
17)ラベル
Dockerメタデータ情報をコンテナーに追加します。たとえば、コンテナに補助情報を追加できます。
labels:
com.startupteam.description: "webapp for a startup team"
com.startupteam.department: "devops department"
com,startupteam.release: "rc3 for v1.0"
18)リンク
他のサービスのコンテナにリンクします。エイリアスとしてサービス名を使用します)、または「サービス名:サービスエイリアス」などの「サービス名:サービスエイリアス」を使用します)。
links:
- db
- db:database
- redis
使用的别名会将自动在服务容器中的/etc/hosts里创建。例如:
172.17.2.186 db
172.17.2.186 database
172.17.2.187 redis
所连接容器中相应的环境变量也将创建
19)log_driver
Dockerの–log-driverパラメーターと同様に、ログドライバーのタイプを指定します。現在、3種類のログドライバーがサポートされています。
log_driver: "json-file"
log_driver: "syslog"
log_driver: "none"
20)log_opt
ログ駆動関連のパラメーター。たとえば、次のとおりです。
log_driver: "syslog"
log_opt:
syslog-address: "tcp://192.168.0.42:123"
21)net
ネットワークモードを設定します。パラメーターは、Dockerクライアントの--netパラメーターに似ています。
net: "bridge"
net: "none"
net: "container:[name or id]"
net: "host"
22)pid
ホストシステムとプロセスの名前空間を共有します。コンテナー間、およびコンテナーとホストシステムの間のオプションを開き、プロセスIDによってアクセスおよび操作できます。
pid: "host"
23)ポート
ポート情報を公開します。「ホスト:コンテナー」形式を使用するか、コンテナーのポートを指定します。ホストはランダムにポートを選択します):
ports:
- "3000"
- "8000:8000"
- "49100:22"
- "127.0.0.1:8081:8081"
当使用"HOST:CONTAINER"格式来映射端口时,如果你使用的容器端口小于60并且没有放到引号里,可能会得到错误结果,因为YAML会自动解析xx:yy这种数字格式为60进制。为了避免这种问题的出现,建议数字串都用引号包括起来的字符串格式。
24)security_opt
コンテナテンプレートラベルのデフォルト属性を指定します)メカニズム(ユーザー、ロール、タイプ、レベルなど)。たとえば、構成ラベルのユーザー名とロール名は次のとおりです。
security_opt:
- label:user:USER
- label:role:ROLE
25)ulimits
コンテナのulimits制限値を指定します。たとえば、プロセスの最大数を65535に指定し、ファイルハンドル数にソフト制限20000を指定します。アプリケーションはいつでも変更でき、ハード制限を超えることはできません。
ulimits:
nproc:65535
nofile:
soft:20000
hard:40000
26)ボリューム
データボリュームのパス設定。ホストパスHOST:CONTAINER)を設定するか、アクセスモードHOST:CONTAINER:ro)を追加できます。この命令のパスは相対パスをサポートしています。たとえば、次のとおりです。
volumes:
- /var/lib/mysql
- cache/:/tmp/cache
- ~/configs:/etc/configs/:ro
27)volumes_driver
新しいバージョンのDockerは、データボリューム用のプラグインドライバーをサポートしています。ユーザーはサードパーティのドライバーを使用してデータボリュームを作成し、名前を使用してそれにアクセスできます。このとき、volumes_driverを使用してドライブを指定できます。
volume_driver: mydriver
28)volumes_from
別のサービスまたはコンテナからデータボリュームをマウントします。
volumes_from:
- service_name
- container_name