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: