Amazon ECS 的綁定掛載範例 - Amazon Elastic Container Service

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

Amazon ECS 的綁定掛載範例

下列範例涵蓋為您的容器使用綁定掛載的常見使用案例。

若要為 Fargate 任務分配更多的暫時性儲存量

對於託管於使用平台版本 1.4.0 或更新版本 (Linux) 或者 1.0.0 (Windows) 的 Fargate 上的 Amazon ECS 任務,您可以為任務中的容器分配比預設暫時性儲存量更多的空間以供使用。此範例可以整合到其他範例中,為您的 Fargate 任務分配更多的暫時性儲存。

  • 在任務定義中,定義 ephemeralStorage 物件。sizeInGiB 必須是 21200 之間的整數並以 GiB 為單位來表示。

    "ephemeralStorage": { "sizeInGiB": integer }
若要為一個或多個容器提供空白的資料磁碟區

在某些情況下,您希望在任務中為容器提供一些暫存空間。例如,您可能有兩個資料庫容器,在任務期間需要存取相同的暫存檔案儲存位置。這可以使用綁定掛載來達成。

  1. 在任務定義 volumes 區段中,以名稱 database_scratch 定義綁定掛載。

    "volumes": [ { "name": "database_scratch" } ]
  2. containerDefinitions 區段中,建立資料庫容器定義。如此一來,它們就可以掛載磁碟區。

    "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" } ] } ]
若要將 Docker 文件中的路徑及其內容公開給容器

在此範例中,您有一個 Dockerfile,它會寫入您想要掛載在容器內的資料。此範例適用於 Fargate 或 Amazon EC2 執行個體上託管的任務。

  1. 建立 Dockerfile。下列範例使用公有 Amazon Linux 2 容器映像,並在我們想要在容器內部掛載的 /var/log/exported 目錄中建立名為 examplefile 的檔案。VOLUME 指令應該指定一個絕對路徑。

    FROM public.ecr.aws/amazonlinux/amazonlinux:latest RUN mkdir -p /var/log/exported RUN touch /var/log/exported/examplefile VOLUME ["/var/log/exported"]

    根據預設,磁碟區許可設定為 0755 和擁有者設定為 root。可以在 Docker 檔案中變更這些許可。在下列範例中,/var/log/exported 目錄的擁有者設定為 node

    FROM public.ecr.aws/amazonlinux/amazonlinux:latest RUN yum install -y shadow-utils && yum clean all RUN useradd node RUN mkdir -p /var/log/exported && chown node:node /var/log/exported USER node RUN touch /var/log/exported/examplefile VOLUME ["/var/log/exported"]
  2. 在任務定義 volumes 區段中,以名稱 application_logs 定義一個磁碟區。

    "volumes": [ { "name": "application_logs" } ]
  3. containerDefinitions 區段中,建立應用程式容器定義。如此一來,它們就可以掛載儲存。containerPath 值必須符合 Dockerfile VOLUME 指令中指定的絕對路徑。

    "containerDefinitions": [ { "name": "application1", "image": "my-repo/application", "cpu": 100, "memory": 100, "essential": true, "mountPoints": [ { "sourceVolume": "application_logs", "containerPath": "/var/log/exported" } ] }, { "name": "application2", "image": "my-repo/application", "cpu": 100, "memory": 100, "essential": true, "mountPoints": [ { "sourceVolume": "application_logs", "containerPath": "/var/log/exported" } ] } ]
若要為與主機 Amazon EC2 執行個體生命週期相關聯的容器提供空資料磁碟區

對於在 Amazon EC2 執行個體上託管的任務,您可以使用綁定掛載,並將資料與主機 Amazon EC2 執行個體的生命週期相關聯。您可以使用 host 參數並指定 sourcePath 值來達成此操作。位在 sourcePath 的任何檔案都會出現在值為 containerPath 的容器中。寫入 containerPath 值的任何檔案都會寫入主機 Amazon EC2 執行個體上的 sourcePath 值。

重要

Amazon ECS 不會在 Amazon EC2 執行個體之間同步您的儲存。使用持久性儲存的任務可以放置在您有可用容量之叢集中的任何 Amazon EC2 執行個體。如果您的任務在停止和重新啟動後需要持久性儲存,請務必使用 AWS CLI start-task 命令在任務啟動時指定相同的 Amazon EC2 執行個體。也可使用 Amazon EFS 磁碟區以供持久性儲存。如需詳細資訊,請參閱搭配 Amazon ECS 使用 Amazon EFS 磁碟區

  1. 在任務定義 volumes 區段,以 namesourcePath 值定義綁定掛載。在下列範例中,主機 Amazon EC2 執行個體包含要掛載在容器內的 /ecs/webdata 的資料。

    "volumes": [ { "name": "webdata", "host": { "sourcePath": "/ecs/webdata" } } ]
  2. containerDefinitions 區段中定義容器,並使用 mountPoints 值來參考綁定掛載名稱,使用 containerPath 值在容器上掛載綁定掛載。

    "containerDefinitions": [ { "name": "web", "image": "public.ecr.aws/docker/library/nginx:latest", "cpu": 99, "memory": 100, "portMappings": [ { "containerPort": 80, "hostPort": 80 } ], "essential": true, "mountPoints": [ { "sourceVolume": "webdata", "containerPath": "/usr/share/nginx/html" } ] } ]
在不同位置的多個容器中掛載已定義的磁碟區

您可以在任務定義中定義資料磁碟區,並將該磁碟區掛載到不同容器的不同位置。例如,您的主機容器有一個位於 /data/webroot 的網站資料夾。建議您以唯讀方式將該資料磁碟區掛載到有不同文件根目錄的兩個不同 Web 伺服器上。

  1. 在任務定義 volumes 區段中,以名稱 webroot 和來源路徑 /data/webroot 定義資料磁碟區。

    "volumes": [ { "name": "webroot", "host": { "sourcePath": "/data/webroot" } } ]
  2. containerDefinitions 區段中,使用 mountPoints 值為每個 Web 伺服器定義容器,這些值會建立 webroot 磁碟區與指向該容器文件根目錄之 containerPath 值的關聯性。

    "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 掛載來自其他容器的磁碟區

針對在 Amazon EC2 執行個體上託管的任務,您可以在容器上定義一或多個磁碟區,然後在相同的任務中的不同的容器定義中使用 volumesFrom 參數,將所有來自 sourceContainer 的磁碟區掛載在其原始定義的掛載點。volumesFrom 參數適用於在任務定義中定義的磁碟區,以及使用 Dockerfile 內建在映像中的磁碟區。

  1. (選用) 若要共用內建在映像的磁碟區,請使用 Dockerfile 中的 VOLUME 指令。以下範例 Dockerfile 使用 httpd 映像,然後新增磁碟區,再將之掛載到 Apache 文件根中的 dockerfile_volume。該資料夾由 httpd Web 伺服器使用。

    FROM httpd VOLUME ["/usr/local/apache2/htdocs/dockerfile_volume"]

    您可以使用此 Dockerfile 建立映像,並將之推送到儲存庫,例如 Docker Hub,然後在您的任務定義中使用。下列步驟中使用的範例my-repo/httpd_dockerfile_volume映像是使用上述 Dockerfile 建置。

  2. 建立任務定義,定義您容器的其他磁碟區及掛載點。在這個範例 volumes 區段中,您要建立一個名為 empty 的空磁碟區,它是由 Docker 常駐程式管理。您還要定義一個稱為 host_etc 的主機磁碟區。它會匯出主機容器執行個體的 /etc 資料夾。

    { "family": "test-volumes-from", "volumes": [ { "name": "empty", "host": {} }, { "name": "host_etc", "host": { "sourcePath": "/etc" } } ],

    在容器定義區段中,建立一個容器,掛載之前定義的磁碟區。在此範例中,web 容器掛載 emptyhost_etc 磁碟區。這是使用由 Dockerfile 中的磁碟區建立的映像的容器。

    "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 容器上。這包括在 Dockerfile 中指定的磁碟區,該磁碟區用於建置 my-repo/httpd_dockerfile_volume 映像。

    { "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 } ] }

    執行此任務時,兩個容器會掛載磁碟區,而 busybox 容器中的 command 會將日期和時間寫入檔案。這個檔案在每個磁碟區資料夾中稱為 date。然後,在 web 容器所顯示的網站上,就能看到這些資料夾。

    注意

    由於 busybox 容器執行快速命令,然後結束,所以在容器定義中必須設為 "essential": false。否則,它結束時會停止整個任務。