コンテナ

dockerコンテナの中からiptablesでポートをフォアードする

下記のように-pオプションでコンテナの8080をホストOSの8080にマッピングして、コンテナの外からアクセスすることができます。

docker run -it -p 8080:8080 ubuntu:18.04 bash

コンテナで動かすプログラムが8080以外のポートをLinstenする場合は、下記のようにNET_ADMINを付与してiptablesでポートフォワードします。

例えば、下記のようなコマンドでnginxのデフォルト設定で8080ポートでアクセスできます。

docker run -it -p 8080:8080 --cap-add=NET_ADMIN ubuntu:18.04 bash
apt update && apt install -y nginx nmap
iptables -t nat -A PREROUTING -p tcp --dport 8080 -j REDIRECT --to-port 80
/usr/sbin/nginx -g 'daemon off;' -c /etc/nginx/nginx.conf

ホストOSから下記のようにアクセスできます。

$ curl -s -I http://localhost:8080
HTTP/1.1 200 OK
Server: nginx/1.14.0 (Ubuntu)
Date: Sat, 23 Jun 2018 07:32:07 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Sat, 23 Jun 2018 07:28:02 GMT
Connection: keep-alive
ETag: "5b2df682-264"
Accept-Ranges: bytes
$

下記でiptablesの設定を確認できます。

$ docker exec -it adoring_galileo iptables -L -t nat | head -3
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination
REDIRECT   tcp  --  anywhere             anywhere             tcp dpt:8080 redir ports 80
タイトルとURLをコピーしました