フロッピーディスクの残骸

フロッピーディスクを分解するのって楽しいよね

今更始めるDockerの勉強

Docker

KVMやらESXiばっか触ってたせいか、
Dockerは食わず嫌いみたいな感じで触ってなかったんだけど、
そうも言ってられない時代になったし、DockerのInvitation Codeも届いたので
そろそろ本腰入れて勉強を始めようかなと思う。
一昔前だと、boot2dockerやらdocker-machineやら入れなくて
「いろいろめんどくせえなあー」と思ってたけど
資料見返したらそんなこともなかったのね。

Fork爆弾投下

まずやってみたくなるのが、Fork爆弾。

$ docker pull centos:latest
$ docker run -t -i centos:latest /bin/bash
# :(){ :|:& };:

やってみたら、実行したコンテナはフリーズしたけど、ホストには影響が無かった。
すばらしい。仮想環境で動作させてるから当たり前っちゃ当たり前なんだけど。

Dockerfileを書く

大抵のものはDocker Hubにあるんで、そっからpullしてきて利用したらよろしい。
んだけど、勉強だと思って簡単なものを書いてみる。

vimを入れる

Dockerfileはこんな感じ

FROM centos:7
RUN yum update -y
RUN yum install -y vim

下記でビルドを行う

docker build -t yuya/vim ./

イメージを起動

docker run -t -i yuya/vim /bin/bash

ここでvimコマンドが使えるようになっているはず。
こんな感じで書けばいいのね。

WordpressをDockerで動かす

こんなんでいけます。

$ docker pull wordpress
$ docker pull mysql
$ docker run --name mysql -e MYSQL_ROOT_PASSWORD=bakabakaahoaho -d mysql
$ docker run --name wordpress --link mysql:mysql -p 80:80 -d wordpress

mysqlwordpressをpullしておいて、最初にmysqlのコンテナを起動します。
WordpressはDBに接続できて初めて使えるので、最初にDBを起動させないとダメですよん。
オプションのおさらい

-e 環境変数を設定
--link コンテナ同士の連携
-p ポートマッピング
-d バックグラウンドで動作させる

書いた記事が消えないかとかその辺りは少し心配ですが、
docker imageを消さなければデータは残りますんで安心してください。
とは言っても、アプリケーションが動作するコンテナ内にはデータを置かないスタンスなので、
データはどこか別の場所に配置したいですね。

wordpressなら/var/www/html mysqlなら/var/lib/mysqlかな?
この辺りのディレクトリをどっかからマウントしておいて利用できればOKなはず。
と調べてたらDocker Volumeなるものがあった。

Docker Volume

基本的にはアプリケーションが動作するコンテナ内にデータを置かないのがDockerらしい。
なので、データを配置するためのVolumeを作成してそれをマウントするか、ホストのディレクトリをマウントして利用するかのどちらかになる。

今回は、Volume作ってそれをマウントしようと思う。
Docker beta for Macだと、xhyve上で動作するので、マウントするディレクトリの実体が探せなかったので・・・^^;

/var/lib/mysqlの配置先を変更

まずはvolumeを作成

$ docker volume create --name mysql_volume

-v オプションつけてコンテナ起動

$ docker run -d --name mysql -v mysql_volume:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=password mysql
動作チェックのためwordpressも
$ docker run --name wp-test --link mysql:mysql -p 80:80 -d wordpress

一応、Wordpressが動作していることを確認する。

mysql_volumeにDB入ってるの?

mysql_volumeを作ったけど、ここに実際にDBの実体があるかどうか確認したい。
なので、mysql_volumeを他のコンテナにマウントして実体を確認する。 centos7のコンテナを起動

$ docker run --name datavolume3 -i -v mysql_volume:/hogehoge -t centos:7 /bin/bash
# cd /hogehoge

お、いろいろ入ってる。
じゃあ、これがちゃんと共有されてるのか確認しましょう!

# rm /hogehoge/*

消えた。
そしてwordpressも表示されなくなった。
ちゃんと共有できてるじゃん。

といろいろ試してたんだけど、両方のコンテナにマウントできているかはdocker inspectで確認できる。
sourceが一緒ですね。

$ docker inspect mysql | jq ".[0].Mounts"
[
  {
    "Name": "mysql_data",
    "Source": "/var/lib/docker/volumes/mysql_volume/_data",
    "Destination": "/var/lib/mysql",
    "Driver": "local",
    "Mode": "z",
    "RW": true,
    "Propagation": "rprivate"
  }
]

----
$ docker inspect datavolume3 | jq ".[0].Mounts"
[
  {
    "Name": "mysql_data",
    "Source": "/var/lib/docker/volumes/mysql_volume/_data",
    "Destination": "/hogehoge",
    "Driver": "local",
    "Mode": "z",
    "RW": true,
    "Propagation": "rprivate"
  }
]

と、wordpressも同じようにvolumeをマウントして使えばいけるはず。

docker-compose

mysqlのROOTのパスワードは環境変数で持っている。
今は環境変数が1つだからいいけど、今後増えたらコマンドラインから実行する時が面倒になる。
そこで利用するのがdocker-composeだ。
docker-composeを使えば、複数のコンテナから構成されるサービスを簡単に管理できる。
例えば、下記のdocker-compose.ymlを準備する。

mysql:
  image: mysql
  ports:
    - "3306:3306"
  environment:
    MYSQL_ROOT_PASSWORD: password

wordpress:
  image: wordpress
  links:
    - mysql:mysql
  ports:
    - "80:80"
  environment:
    WORDPRESS_DB_PASSWORD: password

そして

$ docker-compose up -d  # コンテナの起動

コマンド1つでらくらくちん。便利だな〜。
停止・削除もまとめてできる。

$ docker-compose stop # コンテナの停止
$ docker-compose rm # コンテナの削除

1回目はこの辺で終わり。
もう少しDockerで遊んでみるかな。

参考