枯れた技術の水平思考

世の中わからないことだらけだ.少し確かなことは検証をしたことだけ

dockerでEXPOSEしているポートがglobal側からも見えてしまう問題と対策

docker 便利ですよね、とにかくイメージつくって runさせればどこでも同じものが動かせるので。

Docker Meetup Tokyo #6 に応募してみたりもしました。

それはさておき、globalにはEXPOSEしたくないけどホストマシンのなかでEXPOSEしたいコンテナってありますよね。

でも、CentOSのfirefalld環境では以下のコマンドでEXPOSEしたコンテナのポートが外部からさらけ出されます

現象の確認

[bash] [root@dockerhost ~]# docker run -Pd bootjp/smoocy [root@dockerhost ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 5174b7e01c8b bootjp/smoocy "apache2-foreground" 2 seconds ago Up 1 seconds 0.0.0.0:32768->80/tcp hopeful_morse

local machine

$ sudo nmap -sS dockerhost Password:

Starting Nmap 6.47 ( http://nmap.org ) at 2016-02-21 18:15 JST Nmap scan report for dockerhost (...) Host is up (0.016s latency). Not shown: 996 filtered ports PORT STATE SERVICE 22/tcp open ssh 80/tcp open http 443/tcp open https 32768/tcp open filenet-tms

[/bash]

 対策

run する際に --net オプションをつける(推奨)

例) --net=host 日本語ドキュメントを参照ください [bash] docker run --net=host -p6379:6379 redis [/bash]

run する際に docker0のブリッジのipで走らせる(非推奨)

[bash] [root@dockethost ~]# docker run -pd 172.17.0.1:9000:80 bootjp/smoocy

[root@dockethost ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 346b0782e928 bootjp/smoocy "apache2-foreground" 35 seconds ago Up 34 seconds 172.17.0.1:9000->80/tcp sad_raman 5174b7e01c8b bootjp/smoocy "apache2-foreground" 10 minutes ago Up 10 minutes 0.0.0.0:32768->80/tcp hopeful_morse

疎通確認

[root@smoocy ~]# curl -v 172.17.0.1:9000 * About to connect() to 172.17.0.1 port 9000 (#0) * Trying 172.17.0.1... * Connected to 172.17.0.1 (172.17.0.1) port 9000 (#0) > GET / HTTP/1.1 > User-Agent: curl/7.29.0 > Host: 172.17.0.1:9000 > Accept: / > < HTTP/1.1 200 OK < Date: Sun, 21 Feb 2016 09:25:59 GMT < Server: Apache/2.4.10 (Debian) PHP/7.0.3 < X-Powered-By: PHP/7.0.3 < Vary: Accept-Encoding < Cache-Control: max-age=2592000 < Expires: Tue, 22 Mar 2016 09:25:59 GMT < X-XSS-Protection: 1; mode=block < X-Frame-Options: DENY < X-Content-Type-Options: nosniff < Content-Length: 3351 < Content-Type: text/html; charset=UTF-8

localmachine

$ sudo nmap -sS dockerhost Password:

Starting Nmap 6.47 ( http://nmap.org ) at 2016-02-21 18:24 JST Nmap scan report for dockerhost (...) Host is up (0.0063s latency). Not shown: 996 filtered ports PORT STATE SERVICE 22/tcp open ssh 80/tcp open http 443/tcp open https 32768/tcp open filenet-tms

Nmap done: 1 IP address (1 host up) scanned in 5.78 seconds

[/bash]

docker runするときに -p でdocker0 のIPアドレスを指定してポートフォワードするようにして解決しました。