メニュー
Amazon EC2 Container Service
開発者ガイド (API Version 2014-11-13)

タスクでのデータボリュームの使用

Amazon ECS タスク定義でのデータボリュームの使用には、いくつかのユースケースがあります。一般的な例としては、コンテナで使用する永続データボリュームを提供すること、空の非永続データボリュームを定義し、同じコンテナインスタンス上の複数のコンテナにマウントすること、定義したデータボリュームを同じコンテナインスタンス上の異なるコンテナにある別々の場所で共有することなどがあります。

注記

devicemapper を使用するオペレーティングシステム (Amazon Linux および Amazon ECS に最適化された AMI など) では、Docker デーモンの開始時に使用可能なファイルシステムのみを Docker コンテナに使用できます。クラウドブートフックを使用すると、Docker デーモンを開始する前に、ファイルシステムをマウントできます。または、ファイルシステムをマウントした後に、Docker デーモンと Amazon ECS コンテナエージェントを再び開始して、ファイルシステムをコンテナのボリュームマウントで使用できるようにします。

コンテナに永続データボリュームを提供するには

ボリュームを sourcePath 値で定義していると、そのボリュームを参照しているすべてのコンテナが停止した後もデータボリュームは保持されます。sourcePath に存在するファイルは、containerPath 値のコンテナに渡されます。データボリュームをマウントするコンテナを実行して、containerPath に書き込まれたファイルは、コンテナインスタンスの sourcePath 値に書き込まれます。

重要

Amazon ECS は、コンテナインスタンス間でデータボリュームを同期しません。永続データボリュームを使用するタスクは、使用可能なキャパシティーのあるクラスター内のコンテナインスタンスに配置できます。タスクを停止して再び開始した後に永続データボリュームが必要な場合は、タスクの開始時に毎回、AWS CLI の start-task コマンドを使用して同じコンテナインスタンスを指定する必要があります。

  1. タスク定義の volumes セクションで、name および sourcePath 値を使用して、データボリュームを定義します。

    Copy
    "volumes": [ { "name": "webdata", "host": { "sourcePath": "/ecs/webdata" } } ]
  2. containerDefinitions セクションで、定義したボリュームの名前を参照する mountPoints と、コンテナにボリュームをマウントするための containerPath 値を使用して、コンテナを定義します。

    Copy
    "containerDefinitions": [ { "name": "web", "image": "nginx", "cpu": 99, "memory": 100, "portMappings": [ { "containerPort": 80, "hostPort": 80 } ], "essential": true, "mountPoints": [ { "sourceVolume": "webdata", "containerPath": "/usr/share/nginx/html" } ] } ]

コンテナに空の非永続データボリュームを提供するには

場合によっては、コンテナで同じ空のデータボリュームを共有する必要があるが、タスクが終了した後にデータが保持されなくても構わないことがあります。たとえば、タスクの実行中に同じスクラッチファイルの保存場所にアクセスする必要のある 2 つのデータベースコンテナがあるとします。

  1. タスク定義の volumes セクションで、名前を database_scratch としてデータボリュームを定義します。

    注記

    database_scratch ボリュームのソースパスを指定しないため、Docker デーモンによってそのボリュームが管理されます。このボリュームを参照しているコンテナがないと、Amazon ECS コンテナエージェントのタスククリーンアップサービスによって、そのボリュームは最終的に削除されます (デフォルトでは、コンテナが終了してから 3 時間後に削除されますが、この期間はエージェント変数 ECS_ENGINE_TASK_CLEANUP_WAIT_DURATION で設定できます)。詳細については、「Amazon ECS コンテナエージェントの設定」を参照してください。このデータを保持する必要がある場合は、ボリュームの sourcePath 値を指定します。

    Copy
    "volumes": [ { "name": "database_scratch", "host": {} } ]
  2. containerDefinitions セクションで、非永続データボリュームをマウントするようにデータベースコンテナ定義を作成します。

    Copy
    "containerDefinitions": [ { "name": "database1", "image": "my-repo/database", "cpu": 100, "memory": 100, "essential": true, "mountPoints": [ { "sourceVolume": "database_scratch", "containerPath": "/var/scratch" } ] }, { "name": "database2", "image": "my-repo/database", "cpu": 100, "memory": 100, "essential": true, "mountPoints": [ { "sourceVolume": "database_scratch", "containerPath": "/var/scratch" } ] } ]

定義したボリュームを複数のコンテナにマウントするには

タスク定義でデータボリュームを定義し、そのボリュームをさまざまなコンテナのさまざまな場所にマウントできます。たとえば、ホストコンテナにウェブサイトのデータフォルダー /data/webroot があり、さまざまなドキュメントルートのある 2 つの異なるウェブサーバーに、そのデータボリュームを読み取り専用としてマウントするとします。

  1. タスク定義の volumes セクションで、名前を webroot、ソースパスを /data/webroot としてデータボリュームを定義します。

    Copy
    "volumes": [ { "name": "webroot", "host": { "sourcePath": "/data/webroot" } } ]
  2. containerDefinitions セクションで、各ウェブサーバーのコンテナを定義しています。各コンテナの mountPoints で、webroot ボリュームを、そのコンテナのドキュメントルートを参照する containerPath 値に関連付けます。

    Copy
    "containerDefinitions": [ { "name": "web-server-1", "image": "my-repo/ubuntu-apache", "cpu": 100, "memory": 100, "portMappings": [ { "containerPort": 80, "hostPort": 80 } ], "essential": true, "mountPoints": [ { "sourceVolume": "webroot", "containerPath": "/var/www/html", "readOnly": true } ] }, { "name": "web-server-2", "image": "my-repo/sles11-apache", "cpu": 100, "memory": 100, "portMappings": [ { "containerPort": 8080, "hostPort": 8080 } ], "essential": true, "mountPoints": [ { "sourceVolume": "webroot", "containerPath": "/srv/www/htdocs", "readOnly": true } ] } ]

volumesFrom を使用して別のコンテナからボリュームをマウントするには

あるコンテナに 1 つ以上のボリュームを定義し、同じタスクの異なるコンテナ定義で volumesFrom パラメーターを使用して、sourceContainer のすべてのボリュームを、最初に定義されていたマウントポイントにマウントできます。volumesFrom パラメーターは、タスク定義で定義されたボリューム、および Dockerfile でイメージに組み込まれたボリュームに適用されます。

  1. (オプション) イメージに組み込まれたボリュームを共有するには、そのボリュームを VOLUME 命令で宣言してイメージを構築する必要があります。以下の例の Dockerfile では、httpd イメージを使用し、ボリュームを追加し、 Apache ドキュメントルートにある dockerfile_volume (httpd ウェブサーバーによって使用されるフォルダー) にマウントしています。

    Copy
    FROM httpd VOLUME ["/usr/local/apache2/htdocs/dockerfile_volume"]
    この Dockerfile からイメージを構築し、Docker Hub などのリポジトリにプッシュして、タスク定義で使用できます。以下の手順で例として使用する my-repo/httpd_dockerfile_volume イメージは上記の Dockerfile から構築しました。

  2. コンテナの他のボリュームとマウントポイントを定義するタスク定義を作成します。この例の volumes セクションでは、Docker デーモンによって管理される空のボリューム empty を作成しています。また、ホストコンテナインスタンスに /etc をエクスポートするホストボリューム host_etc も定義しています。

    Copy
    { "family": "test-volumes-from", "volumes": [ { "name": "empty", "host": {} }, { "name": "host_etc", "host": { "sourcePath": "/etc" } } ],
    コンテナ定義セクションで、先ほど定義したボリュームをマウントするコンテナを作成します。この例の web コンテナ (Dockerfile で指定されたボリュームで構築されたイメージを使用) は empty ボリュームと host_etc ボリュームをマウントします。
    Copy
    "containerDefinitions": [ { "name": "web", "image": "my-repo/httpd_dockerfile_volume", "cpu": 100, "memory": 500, "portMappings": [ { "containerPort": 80, "hostPort": 80 } ], "mountPoints": [ { "sourceVolume": "empty", "containerPath": "/usr/local/apache2/htdocs/empty_volume" }, { "sourceVolume": "host_etc", "containerPath": "/usr/local/apache2/htdocs/host_etc" } ], "essential": true },
    volumesFrom を使用して、web コンテナに関連付けられているすべてのボリュームをマウントする、別のコンテナを作成します。web コンテナのすべてのボリュームは busybox コンテナ (my-repo/httpd_dockerfile_volume イメージの構築に使用された Dockerfile で指定されたボリュームを含む) にも同様にマウントされます。
    Copy
    { "name": "busybox", "image": "busybox", "volumesFrom": [ { "sourceContainer": "web" } ], "cpu": 100, "memory": 500, "entryPoint": [ "sh", "-c" ], "command": [ "echo $(date) > /usr/local/apache2/htdocs/empty_volume/date && echo $(date) > /usr/local/apache2/htdocs/host_etc/date && echo $(date) > /usr/local/apache2/htdocs/dockerfile_volume/date" ], "essential": false } ] }
    このタスクが実行されると、2 つのコンテナでボリュームがマウントされ、busybox コンテナで command が各ボリュームフォルダーの date という名前のファイルに日付と時刻を書き込みます。その後、この情報は web コンテナによって表示されるウェブサイトで見ることができます。

    注記

    busybox コンテナはクイックコマンドを実行して終了するため、終了時にタスク全体を停止しないように、コンテナ定義で "essential": false として設定する必要があります。