Dockerやってみるか。
AWSのElasticBeanstalkもDockerのコンテナでのデプロイに対応したことだし、そろそろDockerをちゃんと使ってみないとなぁと思いまして。
ちょっと前までは、Chefがガンガン流行ってて、インフラアズコードだねーと、インフラの設定はコードに書いておくのが流行りだったので、
実行環境の細かい設定ができないElasticBeanstalkってちょっと時代じゃないよな、って勝手に思ってたのです。失礼ながら。
(例えばRuby2.1で実装したアプリをElasticBeanstalk上ではまたRubyが1.9だったので動かなかったとか。)
そんなことがあったので、もうChef使って自分で実行環境整えてデプロイするのがこれから普通になるのかーと思っていたら、
数ヶ月後、
【AWS発表】AWS Elastic Beanstalk for Docker
おお、お前がこれまで沈黙を保っていたのはこれだったのか。。。時代遅れなんて言ってスマンかった。
コンテナごとデプロイできるってことは、
自分のローカルでDocker上に環境構築したコンテナをポイッとクラウド上にアップロードしてやればデプロイ完了!ってことになってしまうんですよね。
このお手軽感は素敵・・・ちゃんと使うこなせるようになりたい。
ElasticBeanstalkにコンテナでデプロイするまで試したいですが、今回はDockerの環境作ってコマンドぽちぽち打つトコまでやってみます。
実行環境
- MacOS X 10.9.2
- VirtualBox 4.3.6
- Homebrew 0.9.5
インストール/初期設定
念のためHomebrewをアップデートしておきます。
brew update
brew install boot2docker
HomeBrewであればこれでboot2dockerがインストールできるはずです。
boot2docker init
boot2docker -h
Usage /usr/local/bin/boot2docker {init|start|up|save|pause|stop|restart|status|info|delete|ssh|download}
boot2docker up
[2014-04-28 21:49:02] Starting boot2docker-vm...
[2014-04-28 21:49:23] Started.
initするとVMイメージのダウンロードが始まります。
あとは、upでVMを起動するだけです。VirtualBoxマネージャーでも起動しているのが確認できると思います。
では、DockerのインストールされたVMへログインしてみます。
boot2docker ssh
docker@localhost's password: tcuser
## .
## ## ## ==
## ## ## ## ===
/""""""""""""""""\___/ ===
~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ / ===- ~~~
\______ o __/
\ \ __/
\____\______/
_ _ ____ _ _
| |__ ___ ___ | |_|___ \ __| | ___ ___| | _____ _ __
| '_ \ / _ \ / _ \| __| __) / _` |/ _ \ / __| |/ / _ \ '__|
| |_) | (_) | (_) | |_ / __/ (_| | (_) | (__| < __/ |
|_.__/ \___/ \___/ \__|_____\__,_|\___/ \___|_|\_\___|_|
dockerのパスワードは 「tcuser」 です。
Dockerコマンドぽちぽちしてみる
docker pull ubuntu
docker run ubuntu /bin/echo HelloWorld!
pullでubuntuのイメージをDLします。少々時間がかかります。
runはその名の通り、DLしたコンテナを実行するコマンドです。
バージョン情報とかDockerの情報を見る
docker version
Client version: 0.10.0
Client API version: 1.10
Go version (client): go1.2.1
Git commit (client): dc9c28f
Server version: 0.10.0
Server API version: 1.10
Git commit (server): dc9c28f
Go version (server): go1.2.1
Last stable version: 0.10.0
docker info
Containers: 15
Images: 27
Storage Driver: aufs
Root Dir: /mnt/sda1/var/lib/docker/aufs
Dirs: 57
Execution Driver: native-0.1
Kernel Version: 3.13.3-tinycore64
Debug mode (server): true
Debug mode (client): false
Fds: 11
Goroutines: 12
EventsListeners: 0
Init Path: /usr/local/bin/docker
versionはその名の通り、docker自体のバージョン情報。
infoはdocker上に存在するコンテナやイメージなどの情報が出力されます。
Docker indexからイメージをDLしてみます。
Rubyが入ってるやつがいいな。と思って、検索して出てきた一番DL数の多いイメージを使ってみます。
docker@boot2docker:~$ docker pull paintedfox/ruby
Pulling repository paintedfox/ruby
6e27bf8e7a3b: Pulling dependent layers
511136ea3c5a: Download complete
6170bb7b0ad1: Download complete
9cd978db300e: Pulling fs layer
~~(省略)~~~
さて。
イメージをDLしたり、コマンドを実行する方法はわかってきたので、
次はコンテナに入って色々インストールしたいですね。
docker search centos
docker pull centos
docker run -i -t centos /bin/bash
Dockerは実行が終わるとコンテナを破棄します。
つまり、docker run して実行したコンテナ内でyum install してもそこでの更新内容はそのままでは永続化しません。
どうするかというと、破棄されたコンテナをcommitします。
コンテナをコミットする
ps -a で破棄されたコンテナ一覧を表示します。
% docker ps -a | grep yuto/centos
dd9f0ea87b53 yuto/centos:latest /bin/bash 12 minutes ago Exited (0) 18 seconds ago sick_pare
91838e9fe69e yuto/centos:latest /bin/zsh 12 minutes ago Exited (1) 12 minutes ago stupefied_galileo
ce7f246aff5e yuto/centos:latest /bin/bash 16 minutes ago Exited (0) 12 minutes ago jovial_wilson
c50b9806da14 yuto/centos:latest /bin/zsh 16 minutes ago Exited (1) 16 minutes ago hopeful_ritchie
10b4e36d9b0c yuto/centos:latest /bin/bash 17 minutes ago Exited (127) 17 minutes ago agitated_heisenberg
679b45079d48 yuto/centos:latest /bin/bash 18 minutes ago Exited (0) 17 minutes ago sleepy_torvalds
直前まで使っていたコンテナを選んで、commitします。
% docker commit -m "installed ruby1.8" dd9f0ea87b53 yuto/centos:ruby
be253673f2fe7fa111b968238be28515af96c2ca6b626f9e135c0b8173762fed
イメージを一覧表示してみると、直前にコミットしたイメージが表示されています。
% docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
yuto/centos ruby be253673f2fe 11 seconds ago 561.1 MB
yuto/centos latest 7139c761e6d8 20 minutes ago 297.6 MB
<none> <none> fc6e74639270 20 minutes ago 297.6 MB
<none> <none> 0232356d9a18 7 days ago 171.3 MB
<none> <none> 2e68994ad893 7 days ago 169.4 MB
<none> <none> 3db9c44f4520 8 days ago 183 MB
centos centos6 0b443ba03958 13 days ago 297.6 MB
centos latest 0b443ba03958 13 days ago 297.6 MB
jonsharratt/rails -m b83713cae3ff 8 months ago 157 MB
jonsharratt/rails latest dc8c65306dac 9 months ago 506.6 MB
dhrp/sshd latest 2bbfe079a942 10 months ago 321.8 MB
dhrp/sshd -m c8a2228805bc 10 months ago 292.3 MB
learn/tutorial latest 8dbd9e392a96 12 months ago 128 MB
centos 6.4 539c0211cd76 13 months ago 300.6 MB
コミットしたコンテナを動かしてみます。
% docker run -i -t yuto/centos:ruby /bin/bash
bash-4.1#
bash-4.1# su
[root@bf98c35cd07e /]# ruby -v
ruby 1.8.7 (2011-06-30 patchlevel 352) [x86_64-linux]
さて。
これでDockerのコンテナにオレオレ実行環境を構築する流れは理解できました。
bash経由でコンテナを実行、終了後プロセスの一覧からタグ付けてCommit。ですね。
さてさて。
でもこの手順、正直めんどいですね?
そんなときこそ Dockerfile の出番ですが、今日はこの辺にしておきます。
参考
こちらの記事がわかりやすく、非常に参考になりました。
公式のチュートリアルは実際にコマンドを叩いて教えてくれるんですが、
今回のように何も知らない状態から、Docker使ってこうしたい!と思っていた自分にはちょっと理解しずらかったです。
ただ、コンテナの概念とかしっかり理解する必要があるので、上に挙げたリンクの記事やチュートリアルを触りながら感触をつかんでくのがいいのかもしれません。