黒縁眼鏡は海を飛ぶ

IT中心にそこはかとなく

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日目の課題とか全く解決できてないし…)

さーて今からアニメ見るぞー!