Dockerのポート関連について調べたメモです。
-P
-p 'ホストポート:コンテナポート'
port:ホストポート:コンテナポート
)EXPOSE 命令だけは、実際にはポートを 公開publish しません。これは、どのポートを公開する意図なのかという、イメージの作者とコンテナ実行者の両者に対し、ある種のドキュメントとして機能します。コンテナの実行時に実際にポートを公開するには、 docker run で -p フラグを使い、公開用のポートと割り当てる( マップmap する)ポートを指定します
— https://docs.docker.jp/engine/reference/builder.html#expose
EXPOSEはホスト側のポート番号を開けるわけではないことに注意します。
ホスト側のポートを開けるにはdocker run
ならp
オプションまたはP
オプションで明示的に指定します。
httpdの例では以下のようになります。
$ sudo docker run -p '8000:80' httpd:latest
-P, –publish-all Publish all exposed ports to random ports
— docker run –help
-p, –publish list Publish a container’s port(s) to the host
— docker run –help
Dockerfileでports
プロパティを指定します。
version: '3'
services:
app:
image: httpd:latest
volumes:
- ./html:/var/www/html
ports:
- "8000:80"
httpd:latest
のEXPOSE
で80
が指定されています。
203.0.113.100
でコンテナを公開すると仮定して動作を確かめます。
$ docker run -d httpd:latest
上記コマンドではhttp://203.0.113.100
にアクセスできません1。
以下のとおりホスト
のポート番号80
が閉じていることがわかります。
$ nmap 127.0.0.1 -Pn -p 80
...
PORT STATE SERVICE
80/tcp closed http
...
http://203.0.113.100
にアクセスできるようにするには-p
オプションを使ってpublish
する必要があります。
ホストのポート80番をコンテナのポート80番に対応させてpublish
します。
$ docker run -d -p '80:80' httpd:latest
ホスト
でポート番号80の状態を確認します。
以下のとおりホスト
のポート番号80が開いているいることが分かります。
$ nmap 127.0.0.1 -Pn -p 80
...
PORT STATE SERVICE
80/tcp open http
...
docker run
のp
オプションやP
オプション、docker compose
のports
プロパティでホスト
のポートをpublish
すると、Dockerデーモンによってiptables
が変更されます。
$ docker run -d httpd:latest
$ iptables -L
....
Chain DOCKER (3 references)
target prot opt source destination
...
$ docker run -d -p '80:80' httpd:latest
$ iptables -L
...
Chain DOCKER (4 references)
target prot opt source destination
ACCEPT tcp -- anywhere xxxxxxxxxxxxxxxxxx tcp dpt:http
...
もちろんコンテナ内では、httpdがポート80番でリッスンしています。docker exec
でコンテナにログインして$ curl -v 127.0.0.1
でHTMLドキュメントを取得できます(curlはaptでインストールします)。 ↩
No comments yet.
改行と段落タグは自動で挿入されます。
メールアドレスは表示されません。