いまさら Docker やってみた

いまさら感満載なんですが、Docker やってみました。

ホストPCはMacです。

Docker のインストール

Macなので事前に VirtualBox を入れて置く必要があります。

あとは、

を参考に。

Docker と boot2docker のバージョンはこんな感じでした。

$ docker -v
Docker version 1.1.2, build d84a070

$ boot2docker version
Client version: v1.1.2
Git commit: a229ac1

boot2docker 経由で Docker の起動

boot2docker up で Docker (というか Tiny Core Linux らしい)を起動。

$ boot2docker up
2014/08/05 21:47:19 Waiting for VM to be started...
.......
2014/08/05 21:47:41 Started.
2014/08/05 21:47:41 Your DOCKER_HOST env variable is already set correctly.

set:export DOCKER_HOST= とか出たらホスト(Mac) .bash_profile にそのまま追記します。(上はすでに追加済なので already と出てます)

boot2docker から Docker に接続

boot2docker ssh で Docker に接続。

$ boot2docker ssh
                        ##        .
                  ## ## ##       ==
               ## ## ## ##      ===
           /""""""""""""""""\___/ ===
      ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ /  ===- ~~~
           \______ o          __/
             \    \        __/
              \____\______/
 _                 _   ____     _            _
| |__   ___   ___ | |_|___ \ __| | ___   ___| | _____ _ __
| '_ \ / _ \ / _ \| __| __) / _` |/ _ \ / __| |/ / _ \ '__|
| |_) | (_) | (_) | |_ / __/ (_| | (_) | (__|   <  __/ |
|_.__/ \___/ \___/ \__|_____\__,_|\___/ \___|_|\_\___|_|
boot2docker: 1.1.2
             master : 740106c - Thu Jul 24 03:24:10 UTC 2014
docker@boot2docker:~$ 

Docker 内で ubuntu を起動する

docker run で docker のイメージを(無ければダウンロードして)起動し、後続のコマンドを実行して終わる。 下記の場合 bash を起動しているので、exit すると終わる。

docker@boot2docker:~$ sudo docker run -i -t ubuntu /bin/bash <--docker内
Unable to find image 'ubuntu' locally
Pulling repository ubuntu
ba5877dc9bec: Download complete 
511136ea3c5a: Download complete 
9bad880da3d2: Download complete 
25f11f5fb0cb: Download complete 
ebc34468f71d: Download complete 
2318d26665ef: Download complete 
root@c8b319b2b306:/# <--ubuntu に入った

アタッチとかデタッチとか

CTRL+p → CTRL+q と押すと、Ubuntu からデタッチして docker に戻る。(ubuntu は終わらない)

docker ps とすると起動している ubuntu の一覧が見える。

ocker@boot2docker:~$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
c8b319b2b306        ubuntu:latest       /bin/bash           5 minutes ago       Up 5 minutes                            prickly_tesla       

もう一度 sudo docker run -i -t ubuntu /bin/bash とすると、ubuntu がもう1個起動する。 CTRL+p → CTRL+q でデタッチして、docker ps すると、2つになってるのが分かる。

docker@boot2docker:~$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
4744cf404fda        ubuntu:latest       /bin/bash           4 seconds ago       Up 4 seconds                            distracted_einstein   
c8b319b2b306        ubuntu:latest       /bin/bash           8 minutes ago       Up 8 minutes                            prickly_tesla         

起動中の ubuntu に入るには、docker attach c8b319b2b306 などとする。この場合 bash が実行中なので ubuntu のコンソールになる。

docker@boot2docker:~$ docker attach c8b319b2b306

root@c8b319b2b306:/# 

起動しているOSの削除

docker attach して exit するか、docker側から docker kill c8b319b2b306 などとする。

docker ps すると、削除されたのが分かる。

docker@boot2docker:~$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
4744cf404fda        ubuntu:latest       /bin/bash           3 minutes ago       Up 3 minutes                            distracted_einstein   

OSの状態の保存と復元

docker から起動した ubuntu は揮発性なので、終了すると状態が消えてしまう。 が、ほんとは消えてなくて、終了した後で、履歴からイメージを作成することができる。

まず、ubuntu にて適当なファイルを作成。

root@4744cf404fda:/# echo 'Hello' >> mytext

root@4744cf404fda:/# ls
bin   dev  home  lib64	mnt	opt   root  sbin  sys  usr
boot  etc  lib	 media	mytext	proc  run   srv   tmp  var

確かに mytext が作成されているのを確認したら、exit で終了、docker に戻る。

sudo docker run -i -t ubuntu /bin/bash で ubuntu を起動し、ls で、内容を確認。

root@3d15ee0cc161:/# ls
bin  boot  dev	etc  home  lib	lib64  media  mnt  opt	proc  root  run  sbin  srv  sys  tmp  usr  var

mytext は消えている。 確認後 exit で終了。

docker ps -a で履歴も含めて状態を見る。

docker@boot2docker:~$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
3d15ee0cc161        ubuntu:latest       /bin/bash           19 seconds ago      Exited (0) 12 seconds ago                       dreamy_hawking        
4744cf404fda        ubuntu:latest       /bin/bash           8 minutes ago       Exited (0) 30 seconds ago                       distracted_einstein   
16d24570a714        ubuntu:latest       /bin/bash           12 minutes ago      Exited (0) 12 minutes ago                       focused_wilson        

mytext を保存したのは 4744cf404fda の ubuntu なので、これを保存する。 docker commit で git ライクにコミットすると保存される。

docker@boot2docker:~$ docker commit -m "Add mytext" 4744cf404fda amay077/mytext_container

467f6424ae4a7b813f51356a019ef6ee2467fe2f1f52d8ea7a2e32ddc0b63edd

docker images を実行して保存されているイメージのリストを見る。

REPOSITORY                 TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
amay077/mytext_container   latest              467f6424ae4a        50 seconds ago      192.7 MB
ubuntu                     latest              ba5877dc9bec        2 weeks ago         192.7 MB
d

amay077/mytext_container が確かに保存されてる。

そのイメージを使ってインスタンスを起動する。

docker@boot2docker:~$ sudo docker run -i -t amay077/mytext_container /bin/bash

root@0f6e755990ff:/# ls
bin   dev  home  lib64	mnt	opt   root  sbin  sys  usr
boot  etc  lib	 media	mytext	proc  run   srv   tmp  var

root@0f6e755990ff:/# cat mytext
Hello

確かに mytext が保存された状態になっている。

コンテナとイメージの削除

いきなり「コンテナ」ってw

イメージから起動した「モノ」をコンテナというらしい。 起動して終了したもの(docker ps -a で見られるもの)もコンテナというらしい。

OSを終了してから、docker rm 3d15ee0cc161 などで個別に削除してもよいが、面倒なので、 docker rm `docker ps -a -q とすると、起動してないコンテナを一括削除できる。

docker@boot2docker:~$ docker rm `docker ps -a -q`
3d15ee0cc161
4744cf404fda
16d24570a714
57ee3aa4a7d2
c8b319b2b306

docker@boot2docker:~$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

続いて、イメージの削除は docker rmi amay077/mytext_container などで行う。

docker@boot2docker:~$ docker rmi amay077/mytext_container

docker@boot2docker:~$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
ubuntu              latest              ba5877dc9bec        2 weeks ago         192.7 MB

ubuntu だけになった。 docker rmi ubuntu もするときれいサッパリ。

今日はここまで。

参考サイト

WEB+DB PRESS vol.81 の Immutable Infrastructure の特集も、参考になりました。