port forward to docker container on CentOS7
CentOS7は、いろいろとインフラ周りのソフトが変更されている。
いろいろ苦しいけど、iptables が、firewalld になったため、dockerのport forwardもそのままでは効かない。
試しに、nginx(default port 80)をdocker host の8889で受けたい場合に、以下のようにrunするとエラーとなる。
$ docker run -d -p 8889:80 nginx 5364117838e173061751559155d86402053383366e6d2d44bbfdd5fe2de5410c Error response from daemon: Cannot start container 5364117838e173061751559155d86402053383366e6d2d44bbfdd5fe2de5410c: failed to create endpoint elated_saha on network bridge: COMMAND_FAILED: '/sbin/iptables -w2 -t nat -A DOCKER -p tcp -d 0/0 --dport 8889 -j DNAT --to-destination 172.17.0.9:80 ! -i docker0' failed: iptables: No chain/target/match by that name.
docker が、iptables じゃなくて、firewalldも使ってくれるといいんだけど、とりあえず現状は未対応。
ということで、対応。
まずは、port forwardなしでdocker runする。
$ docker run -d --name sample nginx 5864caa67138805c4689351c2d252e36589b548f154d4d3c6e42f0578be2155c $ docker inspect sample | grep IPA "SecondaryIPAddresses": null, "IPAddress": "172.17.0.9", "IPAddress": "172.17.0.9",
port forwardは、firewall-cmd で以下のように実行する。
$ sudo firewall-cmd --add-forward-port=port=8889:proto=tcp:toport=80:toaddr=172.17.0.9 $ sudo firewall-cmd --list-all public (default) interfaces: sources: services: dhcpv6-client http ssh ports: masquerade: no forward-ports: port=8889:proto=tcp:toport=80:toaddr=172.17.0.9 icmp-blocks: rich rules: