Dockerによる仮想コンテナを試してみる(3日目)~ ポートマッピングとボリュームとか~
貴重な貴重な日曜日の20時、そろそろ月曜日の足音が聞こえてくる日曜日の20時、私はごちゃごちゃしていた自身のテリトリーを改造して、なんとも快適な環境を整えました。
もう座椅子に座ってしまうと全く動けなくなる駄目男ゾーンができあがったので、折角ですからDockerのお勉強をします。しないと寝てしまいそうです。
今日の範囲はホストとコンテナのポートマッピングと、ボリュームのマウントです。
Dockerについては今回で終わりにして、次回からはAnsibleについてお勉強したいと思います。
で、ゆくゆくはDocker+Ansibleでサーバ管理できそうなところまで持っていきたいな…とかなんとか考えています。
以前の記事はこちら。
Dockerによる仮想コンテナを試してみる(1日目) - 黒縁眼鏡は海を飛ぶ
Dockerによる仮想コンテナを試してみる(1.5日目)~ dockerコンテナに入る編~ - 黒縁眼鏡は海を飛ぶ
Dockerによる仮想コンテナを試してみる(2日目)~ Dockerfileを使ってみる編~ - 黒縁眼鏡は海を飛ぶ
ホストとコンテナ間ポートマッピング
dockerコンテナを作成した時点で、そのコンテナにはIPアドレスが自動で割り振られます。
ホストからコンテナにアクセスする際は特に問題ないのですが、外部からアクセスしたい(例えばコンテナのapacheで公開しているページにアクセスしたい)時があったりすると、ホストのポートとコンテナのポートを紐付けてあげないといけません。
apacheを実行するためのDockerfileを作っておきます。
Dockerfileと同階層にhtml
ディレクトリがあり、その下にindex.html
を配置しています。
(Dockerfileと同階層にindex.html
を配置してみたのですが、どうにもエラーが出てbuild
に失敗してしまいます…)
FROM centos:centos6 MAINTAINER ryoana RUN yum -y update RUN yum -y install httpd ENV LANG C ADD ./html /var/www/html EXPOSE 80 CMD ["/usr/sbin/httpd", "-D", "FOREGROUND"]
そしてbuild
します。
# docker build -t centos6/apache:1.0 .
ごちゃごちゃと処理が走りますので、しばらく掃除でもして待ちましょう。
imageの作成に成功したら、早速コンテナを作ってみましょう。 ここで、ホストのポートにコンテナの80番ポートを紐付けます。
##ホストのポートを指定しない場合 # docker run -d -p 80 centos6/apache:1.0 ##ホストの8080番ポートを指定する場合 # docker run -d -p 8080:80 centos6/apache:1.0
コンテナの状態を確認するために、docker ps
を叩いてみてください。
PORTS
行に紐付いているポート情報が記載されているかと思います。(0.0.0.0:8080->80tcp)
紐付けたポートの情報を確認し、別の端末のブラウザからアクセスできるか確認してみましょう。
公式ドキュメント?によると、特定のポートを指定するのはよろしくないようです。。。
データボリュームのマウントとか
データボリュームってなんだ?っていうところからのスタートなのですが、ただのディレクトリではないみたいです。
* コンテナ間での共有が可能
* imageを更新してもデータボリュームは更新されない
とかなんとか色々と効用があるようです。
とりあえず、まずはやってみましょう。
# docker run -it --name test -v /test_volume centos:centos6 /bin/bash
起動した/
直下に/test_volume
なるディレクトリが生成されていることが確認できるかと思います。
また、df
コマンドなんかでも確認することができます。
次に、ホストの特定のディレクトリをコンテナ内のディレクトリにマウントすることもできます。
# docker run -it --name test -v /src/test:/opt/test centos:centos6 /bin/bash
ホストの/src/test
ディレクトリがコンテナ内のopt/test
にマウントされていることが確認できます。
上記ではデフォルトのcentosイメージを使ってコンテナを作成していますが、アプリ用のイメージを使ったりすることで、ホストで作成したアプリをコンテナ内部で実行してテストができちゃったりするみたいです。
便利ですね。
ホスト・コンテナ間でのボリューム共有を見てきましたが、コンテナ・コンテナ間はどうでしょう。
そんな時に--volumes-from
オプションを使います。
## データボリュームを追加したコンテナを作成する。 # docker run -d --name test -v /test_volume centos6/apache:1.0 ## 上記で作成したボリュームを別コンテナ上にマウントする。 # docker run -it --name test2 --volumes-from test centos:centos6 /bin/bash
上記のようにすることで、test2
コンテナからも/test_volume
ディレクトリが確認できます。
ボリュームを共有していたりすると、コンテナやボリュームを削除することはできません。
ということで、何回かにわけてDockerについてお勉強してきました。
まだまだ調べられていなかったり、試しきれていないことがたくさんあるのですが、とりあえずはここまで。
来週かけてAnsibleのお勉強をして、また戻ってきたいと思います。
(1日目の課題とか全く解決できてないし…)
さーて今からアニメ見るぞー!