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$ sudo docker inspect (コンテナID) | grep IPAddress
2 "IPAddress": "172.17.0.61",
あとは、ホスト側でポートマッピングの定義を付けてStoneを起動します。今回はホストの8080をコンテナ(172.17.0.61)の8080にマッピングします。
1$ sudo stone -d -p 172.17.0.61:8080 8080
2Dec 30 11:04:53.613670 139907443791616 start (2.3e) [10686]
3Dec 30 11:04:53.613776 139907443791616 Debug level: 1
4Dec 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は開発環境をクリーンに保つ用途にも使えて便利です。