2015年7月4日土曜日

手を動かして覚えるdockerの最速理解


dockerの利用手順をまとめておく。
本記事内を操作を一通り見ることで、dockerの利点が分かるようになるだろう。

contents
【dockerのインストール、起動】
【dockerのレジストリからOSイメージをローカルキャッシュへダウンロード】
【ダウンロードしたOSイメージからコンテナの作成、起動】
【コンテナプロセスの確認】
【dockerへのログイン】
【docker内でhttpdのインストールと起動】
【httpdデーモンへの接続確認】
【コンテナの停止、イメージの削除、dockerの停止】
【コンテナの複製】
【Dockerfileを使ったイメージの作成】



【dockerのインストール、起動】
$ sudo yum install docker

$ sudo systemctl start docker

$ sudo systemctl enable docker



【dockerのレジストリからOSイメージをローカルキャッシュへダウンロード】
今回はcentos7を利用する。
$ sudo docker pull docker.io/centos:centos7

ダウンロードしたイメージを確認する。
TAGはバージョン番号だと思っておけばよい。
$ sudo docker images
REPOSITORY         TAG      IMAGE ID       CREATED      VIRTUAL SIZE
docker.io/centos   centos7  fd44297e2ddb   4 weeks ago  215.7 MB



【ダウンロードしたOSイメージからコンテナの作成、起動】
仮想端末を割り当てて、コンテナの標準入力にアタッチすればそのままログインできる。

ローカルポートの8080番ポートへの接続をコンテナの80番ポートへつなげる例。
$ sudo docker run --privileged -i -t -p 8080:80 --name cent7_httpd -h cent7_httpd docker.io/centos:centos7 /bin/bash

今回はデーモンモードで起動させる。
$ sudo docker run --privileged -d -p 8080:80 --name cent7_httpd -h cent7_httpd docker.io/centos:centos7 /sbin/init

--privileged:特権モード(selinuxを使用時に利用)
-i:コンテナーの標準入力を開く。/bin/bashなどでコンテナーを操作する際に指定
-t:tty(端末デバイス)を確保する。/bin/bashなどでコンテナーを操作する際に指定
--name:コンテナ名(赤字部分は任意の名称でよい) 
-p:ホスト名(赤字部分は任意の名称でよい) 
-p [ホストのポート番号]:[コンテナーのポート番号]
-d:バックグラウンドで実行する

非常に高速に起動するのが分かるだろう。
理由は大きく3つ。
1. dockerコンテナーに含まれるファイルは元となるdockerイメージの差分のみが管理される
2. コンテナー作成時のファイルコピーがほとんどない
3. ハイパーバイザー型の仮想マシンのようなOSの起動処理が不要



【コンテナプロセスの確認】
$ sudo docker ps -a
CONTAINER ID   IMAGE           COMMAND       CREATED         STATUS   PORTS                  NAMES
08ef3a9a832e   centos:centos7  "/sbin/init"  5 minutes ago   Up       0.0.0.0:8080->80/tcp   cent7_httpd



【dockerへのログイン】
コンテナIDを使ってログインを行う。
$ sudo attach 08ef3a9a832e

接続中のコンテナから抜けるには、
Ctrl + P → Ctrl + Q
※Ctrl + Dではコンテナが停止する

※/bin/bashを実行していないとログインできない。



【docker内でhttpdのインストールと起動】
# yum install httpd

# systemctl enable httpd.service

# systemctl restart httpd.service



【httpdデーモンへの接続確認】
$ /sbin/ifconfig
docker0: flags=4163  mtu 1500
        inet 192.168.2.1  netmask 255.255.255.0  broadcast 0.0.0.0

$ telnet 192.168.2.1 8080



【コンテナの停止、イメージの削除、dockerの停止】
コンテナを停止する。
$ sudo docker stop cent7_httpd

再実行するにはstartさせればよい。
$ docker start -i cent7_httpd

コンテナを削除する。
$ sudo docker rm cent7_httpd

イメージを削除する。
$ sudo docker rmi docker.io/centos

dockerサーバを停止する。
$ sudo systemctl start docker



【コンテナからイメージの作成】
httpdをインストールしたコンテナをコミットすることで同一のイメージを作成する。
これでコンテナのメリットがイメージつくだろう。

$ sudo docker ps -a | awk '{print $1}'
CONTAINER ID
08ef3a9a832e

$ sudo docker commit 08ef3a9a832e centos:centos7_v2

$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED              VIRTUAL SIZE
centos              centos7_v2          972b8c68e9e3        5 seconds ago        301.5 MB
centos              centos7             8033af9877f8        1 weeks ago          215.7 MB

centos7-v2を使って起動させるとすでにhttpdがインストールされ、起動もしている状態になっている。
$ sudo docker run --privileged -d -p 8081:80 --name cent7_v2_httpd centos:centos7_v2 /sbin/init



【Dockerfileを使ったイメージの作成】
docker run, docker commitコマンドを使ってdockerコンテナから、イメージを作った。
dockerコンテナの構成をDockerfileファイルに記載し、それを元にDockerイメージを作成することもできる。

$ vi Dockerfile
FROM docker.io/centos:centos7
MAINTAINER shinya
RUN /bin/yum -y install httpd
ADD index.html /var/www/html/
RUN /bin/systemctl start httpd.service

指定したタグの意味は以下の通り。
FROM       : Dockerイメージの指定
MAINTAINER : 作成者の情報
ADD        : ファイル/ディレクトリの追加
RUN        : コマンドの実行


追加するファイルもローカルで作っておく。
$ echo 'Hello!' > index.html

準備は整った。buildオプションでDockerfileファイルからイメージを作る。
最後の引数はDockerfileのあるパスである。
$ sudo docker build -t myrepo:cent7_v2 ./

$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
myrepo              cent7_v2            ae2bac12122e        5 minutes ago       268.5 MB