ORNEW

冷やしDockerはじめました

Facebook にシェア
Pocket

Dockerのインストール

On Mac OS X 10.11.5. いろいろやり方はあるけれど、とりあえず公式オススメの公式dmgをインストールした(Version 1.12.0-rc2-beta17 (build: 9779))。執筆現在、ベータ版なので注意。

$ docker --version
Docker version 1.12.0-rc2, build 906eacd, experimental

とりあえず公式のUbuntuイメージを落とす。

$ docker pull ubuntu:latest
f069f1d21059: Pull complete 
ecbeec5633cf: Pull complete 
ea6f18256d63: Pull complete 
54bde7b02897: Pull complete 
Digest: sha256:bbfd93a02a8487edb60f20316ebc966ddc7aa123c2e609185450b96971020097
Status: Downloaded newer image for ubuntu:latest
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              latest              0f192147631d        4 days ago          132.8 MB

んでとりあえずコンテナを作ってシェルに入る。

$ docker run -it --name test1 ubuntu bash
root@0dea3485a719:/# cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04
DISTRIB_CODENAME=xenial
DISTRIB_DESCRIPTION="Ubuntu 16.04 LTS"

?!はやい。確かにここでまでインストールから3分もかかってない。

試しにvimとGCCとG++をインストールしてイメージにコミットしてみる。

root@0dea3485a719:/# apt-get update
root@0dea3485a719:/# apt-get install vim gcc g++
root@0dea3485a719:/# exit
$ docker commit test1 ornew/test1
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ornew/test1         latest              9d46c87a43a7        7 seconds ago       365.3 MB
ubuntu              latest              0f192147631d        5 days ago          132.8 MB

確かにできている。test1コンテナは削除して、このイメージから新しいコンテナを作る。

$ docker rm test1
$ docker run -it --name test2 ornew/test1 bash
root@8613047e0f24:/# g++ --version
g++ (Ubuntu 5.3.1-14ubuntu2.1) 5.3.1 20160413
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

g++が動いた。ちゃんとイメージを作成できているようだ。

run時に-dオプションを付与しなかった場合、exitするとコンテナは停止する。厳密に言えば、コンテナはプロセスと同様に機能する。あとからバックグラウンドで起動、終了する場合は、docker startdocker stopをそれぞれ使用する。また、コンテナ上でコマンドを発行する場合はdocker execを使用する(または、docker attachでログインする)。docker ps -aでコンテナ一覧の状態を表示ができる(-aオプションは停止コンテナも表示する)。

試しに、停止したコンテナを起動、シェルに入り、再び停止してみる。

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
8613047e0f24        ornew/test1         "bash"              5 minutes ago       Exited (0) 3 minutes ago                       test2
$ docker start test2
test2
$ docker exec -it test2 bash
root@8613047e0f24:/# gcc --version
gcc (Ubuntu 5.3.1-14ubuntu2.1) 5.3.1 20160413
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
root@8613047e0f24:/# exit
exit
$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
8613047e0f24        ornew/test1         "bash"              6 minutes ago       Up 26 seconds                           test2
$ docker stop test2
test2
$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
8613047e0f24        ornew/test1         "bash"              7 minutes ago       Exited (0) 1 seconds ago                       test2

startで起動した場合、シェルでexitしても停止しないことに注意する。

コンテナとイメージを削除する。

$ docker rm test2
$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
$ docker rmi ornew/test1
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              latest              0f192147631d        5 days ago          132.8 MB

次は Dockerfileによる作成を試みる。Dockerfileを作り、docker buildを実行する。GCCとか入れていると時間かかるので今度はvimだけ。コマンドが多いので可能な限り&&で繋いだ。この場合はset -vxで実行したコマンドを表示しておくといい。

$ mkdir test3
$ cd test3
$ cat > Dockerfile <<EOF
> FROM ubuntu:latest
> MAINTAINER Arata Furukawa <old.river.new@gmail.com>
> CMD /bin/bash
> RUN set -vx \
> && cat /etc/lsb-release \
> && apt-get update \
> && apt-get install -y \
>     vim \
> && vim --version
> EOF
$ docker build -t ornew/test3 .
Sending build context to Docker daemon 2.048 kB
Step 1 : FROM ubuntu:latest
 ---> 0f192147631d
Step 2 : MAINTAINER Arata Furukawa <old.river.new@gmail.com>
 ---> Running in f41afd443a50
 ---> 32c6f4e6385a
Removing intermediate container f41afd443a50
Step 3 : ENTRYPOINT /bin/bash
 ---> Running in 6950e8524280
 ---> 16a618898a77
Removing intermediate container 6950e8524280
Step 4 : RUN set -vx && cat /etc/lsb-release && apt-get update && apt-get install -y     vim && vim --version
 ---> Running in c8664a0f354e
+ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04
DISTRIB_CODENAME=xenial
DISTRIB_DESCRIPTION="Ubuntu 16.04 LTS"
+ apt-get update
(中略)
+ apt-get install -y vim
(中略)
+ vim --version
VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Jun 16 2016 10:50:38)
(中略)
 ---> 9676d5208416
Removing intermediate container c8664a0f354e
Successfully built 9676d5208416
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ornew/test3         latest              9a6f35a41185        5 seconds ago       228.4 MB
ubuntu              latest              0f192147631d        5 days ago          132.8 MB

イメージはちゃんとできているようだ。コンテナも作ってみる。ちなみにrun--rmオプションをつけると、コンテナの停止とともにコンテナを削除してくれる。使い捨てる場合にはつけるとちょっと便利。

$ docker run -it --rm --name test3 ornew/test3
root@531d9bcb3dd7:/# vim --version
VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Jun 16 2016 10:50:38)
(中略)
root@531d9bcb3dd7:/# exit
exit
$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

所感

開発環境を作ってチームに簡単に配る、という用途が真っ先に思いついた。非常に便利だと思う。ホストスペースを汚しにくいのもGood。何よりメッチャ速い。驚いた。

サーバ用途はどうだろう…。世間ではセキュリティの懸念もあるようだけど、それって別にDockerじゃなくても同じだよね。Dockerはあくまで「出来上がった環境」を簡単に扱うものだと思われる。ちゃんと構築したサーバ環境を取り回す分には便利なんじゃないだろうか。とはいえコンテナがやられるとホストを奪うことも可能なのは確かなので、十分注意しなければならないけれども。

よく使われる自動テスト用途は十分に考えられる気がする。特にローカル環境でも十分稼働するっていうのは大きい。ブートが速い(というかそもそも必要ない)っていうのは大きい。複数の仮想マシンを動かすのはマシンスペックがかなり必要だし、かといっていちいち切り替えるとかなり遅い。コンテナならその問題はないし、プロセス感覚で複数の環境を取り回せるのはなにかと便利だ。

やはり一番は環境の配布だと思うが、使いみちはいくらでもありそうだ。これからは積極的に使っていこう。