今更始める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
mysqlとwordpressを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で遊んでみるかな。