act-act about projects rss

How to assign a port mapping to a running docker container

Docker

ちょっと前にVPSサービスの乗り換えをしました。それまで、1つのVPS仮想ノードに複数のサービスを置いていたのですが、この乗り換えを機にDockerを使ってサービス毎にコンテナを用意し、各々の環境を切り離すようにしました。

その中で個人用の開発環境用のコンテナも作り、仕事以外の開発はそのDockerコンテナ上で行っているのですが、1つ問題がでてきました。それは、コンテナが公開したいポートが開発中に変わってきてしまうことです。

Dockr port mapping

Dockerは0.6.5からコンテナ起動時(docker run)に-pでホストとコンテナのポートのマッピングを指定するようになっています。

1
$ sudo docker run -d -p 127.0.0.1:4022:22 base/sshd /usr/sbin/sshd -D

上記例だと、ホストのポート4022を起動するコンテナのポート22にマッピングします。このように指定してコンテナを起動した後、コンテナ側にsshしたい場合は、

1
$ ssh localhost -p 4022

でできます。

上記はコンテナ起動時にポートマッピングを指定する方法です。しかし開発中は公開したいポートが変わることがあります。そうなるとコンテナ起動後にマッピングを追加したいのですが、良いやり方が見つからず。Stack Overflowに以下のようなエントリがあり、そこではPipeworkを使えばできるよ、となっていますが、ちょっと大仰かな、と。

Stone

ホストからコンテナへポートマッピングする目的で、Stoneを使ってみました。

1
$ sudo apt-get install -y stone

まず、コンテナのIPアドレスを確認します。

1
2
$ sudo docker inspect (コンテナID) | grep IPAddress
        "IPAddress": "172.17.0.61",

あとは、ホスト側でポートマッピングの定義を付けてStoneを起動します。今回はホストの8080をコンテナ(172.17.0.61)の8080にマッピングします。

1
2
3
4
$ sudo stone -d -p 172.17.0.61:8080 8080
Dec 30 11:04:53.613670 139907443791616 start (2.3e) [10686]
Dec 30 11:04:53.613776 139907443791616 Debug level: 1
Dec 30 11:04:53.615183 139907443791616 stone 3: 172.17.0.61:http-alt <- 0.0.0.0:http-alt

このように設定することで、ホストのポート8080→コンテナのポート8080へ転送されます。-pを付けて起動すると、パケットをダンプしてくれるので開発時は便利です。Ctrl+Cで中断すると、ポートマッピングは解除されます。

Conclusion

Dockerでホストからコンテナへのポートマッピングを追加する方法を紹介しました。Dockerは開発環境をクリーンに保つ用途にも使えて便利です。