本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
Amazon ECS 的綁定掛載範例
下列範例涵蓋為您的容器使用綁定掛載的常見使用案例。
若要為 Fargate 任務分配更多的暫時性儲存量
對於託管於使用平台版本 1.4.0
或更新版本 (Linux) 或者 1.0.0
(Windows) 的 Fargate 上的 Amazon ECS 任務,您可以為任務中的容器分配比預設暫時性儲存量更多的空間以供使用。此範例可以整合到其他範例中,為您的 Fargate 任務分配更多的暫時性儲存。
-
在任務定義中,定義
ephemeralStorage
物件。sizeInGiB
必須是21
和200
之間的整數並以 GiB 為單位來表示。"ephemeralStorage": { "sizeInGiB":
integer
}
若要為一個或多個容器提供空白的資料磁碟區
在某些情況下,您希望在任務中為容器提供一些暫存空間。例如,您可能有兩個資料庫容器,在任務期間需要存取相同的暫存檔案儲存位置。這可以使用綁定掛載來達成。
-
在任務定義
volumes
區段中,以名稱database_scratch
定義綁定掛載。"volumes": [ { "name": "
database_scratch
" } ] -
在
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 執行個體上託管的任務。
-
建立 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 && chownnode
:node
/var/log/exported USERnode
RUN touch /var/log/exported/examplefile VOLUME ["/var/log/exported"] -
在任務定義
volumes
區段中,以名稱application_logs
定義一個磁碟區。"volumes": [ { "name": "
application_logs
" } ] -
在
containerDefinitions
區段中,建立應用程式容器定義。如此一來,它們就可以掛載儲存。containerPath
值必須符合 DockerfileVOLUME
指令中指定的絕對路徑。"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 磁碟區。
-
在任務定義
volumes
區段,以name
和sourcePath
值定義綁定掛載。在下列範例中,主機 Amazon EC2 執行個體包含要掛載在容器內的/ecs/webdata
的資料。"volumes": [ { "name": "
webdata
", "host": { "sourcePath": "/ecs/webdata
" } } ] -
在
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 伺服器上。
-
在任務定義
volumes
區段中,以名稱webroot
和來源路徑/data/webroot
定義資料磁碟區。"volumes": [ { "name": "
webroot
", "host": { "sourcePath": "/data/webroot
" } } ] -
在
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 內建在映像中的磁碟區。
-
(選用) 若要共用內建在映像的磁碟區,請使用 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 建置。 -
建立任務定義,定義您容器的其他磁碟區及掛載點。在這個範例
volumes
區段中,您要建立一個名為empty
的空磁碟區,它是由 Docker 常駐程式管理。您還要定義一個稱為host_etc
的主機磁碟區。它會匯出主機容器執行個體的/etc
資料夾。{ "family": "test-volumes-from", "volumes": [ { "name": "empty", "host": {} }, { "name": "host_etc", "host": { "sourcePath": "/etc" } } ],
在容器定義區段中,建立一個容器,掛載之前定義的磁碟區。在此範例中,
web
容器掛載empty
和host_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
。否則,它結束時會停止整個任務。