Amazon ECSネットワークモードを検証してみるというよりも簡単に詳しくのような纏めてみる。
#1.host#
→ 80 ➡︎
一つのホストで同じポートを利用するタスクを複数起動することはできません。
既に 80番ポートで起動していたとします。
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8a2b3e44e650 nginx:latest "nginx -g 'daemon of…" 8 minutes ago Up 8 minutes ecs-task03-1-continer03-e49ee9ace5befbded001
5218a3f2e942 amazon/amazon-ecs-agent:latest "/agent" 4 hours ago Up 4 hours (healthy) ecs-agent
では、同じ80番ポートで起動してみよう。
このように、理由: ["RESOURCE:PORTS"]
となり、タスクの実行に失敗する。
詳細:APIエラーメッセージ
#2.bridge#
→ 80 ➡︎ 80 → 8080 ➡︎ 8888
ECSインスタンス(EC2)のENIを複数のタスクが共有で利用します。
通常のdockerのbridge(default)だと思えばいい。
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
06b03ada9531 nginx:latest "nginx -g 'daemon of…" 2 minutes ago Up 2 minutes 80/tcp ecs-task-d0306-1-continer0307-e8eafff7f9e89ffc9901
0486fed8a8a8 nginx:latest "nginx -g 'daemon of…" 2 minutes ago Up 2 minutes 80/tcp ecs-task-d0306-1-continer0306-d2b58bbdf4b5e0917900
8c96ab8d534b amazon/amazon-ecs-agent:latest "/agent" 6 hours ago Up 6 hours (healthy) ecs-agent
"Containers": {
"0486fed8a8a8f80458cb5f0c88711f06755e9624a583b7a8201bf63d77a0a091": {
"Name": "ecs-task-d0306-1-continer0306-d2b58bbdf4b5e0917900",
"EndpointID": "ed47b3b141de336c5467fc46a669886cc501797fb2aceac0135424c980787f00",
"MacAddress": "02:42:ac:11:00:02",
"IPv4Address": "172.17.0.2/16",
"IPv6Address": ""
},
"06b03ada953195a4c67dc1c987144328aaa9baf8ae11bccc51d7def154dac139": {
"Name": "ecs-task-d0306-1-continer0307-e8eafff7f9e89ffc9901",
"EndpointID": "cc475cb74d5f2c2c1d36ec84fba985d5aa966a377057ce82433c2313d7468bd7",
"MacAddress": "02:42:ac:11:00:03",
"IPv4Address": "172.17.0.3/16",
"IPv6Address": ""
}
#3.awsvpc#
→ 80 ENI ➡︎ 80 → 80 ENI ➡︎ 80
ENIごとにポートを指定できるので、bridgeのように同じホストが利用できなくなることはない。
ちなみに、ENIの数には注意する必要がある。
例えば、t2.micro で起動していたとする。なので、ENI の制限は 2。
詳細:Elastic Network Interfaces
Amazon EC2インスタンスには、それらに接続できるネットワークインターフェースの数に制限があり、プライマリネットワークインターフェースは1つとしてカウントされる。
まず1つ目のタスクを コンテナポート 80 で作成する。
ENI をのぞいてみるとENIが自動的に作成されたことがわかる。
作成したコンテナ以外に、今まであった amazon-ecs-agent、新しく amazon-ecs-pause が作成されたことがわかる。
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
25cc25fa9157 nginx:latest "nginx -g 'daemon of…" About an hour ago Up About an hour ecs-task-d01-1-continer-9cfadeeb8ba9faec1100
a2b51724dd8b amazon/amazon-ecs-pause:0.1.0 "./pause" About an hour ago Up About an hour ecs-task-d01-1-internalecspause-d4ba96ffa4d197ec2000
8c96ab8d534b amazon/amazon-ecs-agent:latest "/agent" About an hour ago Up About an hour (healthy) ecs-agent
プライベートIPに対して応答があることが確認できる。
curl http://10.0.2.226
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
新しいタスクを起動してみるとENIに制限理由: ["RESOURCE:ENI"]
でタスクの実行に失敗する。
詳細:APIエラーメッセージ
#リンク#
Amazon ECS 細かい箇所を整理してみた