2014/07/14(Mon) サービス開発
鈴木 弦

今更聞けない人の為の Docker 再入門

docker

こんにちは、エンジニアの鈴木です。
近年のインフラ周りの技術革新はめまぐるしいスピードで進んでいますね。

インフラ周りの「今更聞けない人の為のシリーズ」は
Vagrant
Chef
に続いて3つ目になりました。

この記事は以下のような人を対象としています。
・Docker ってそもそも何?
・Docker って名前を聞いたことあるけど、触ったことがない。

Docker ってそもそも何?

Docker(ドッカー)とは、Go言語製の軽量な仮想化環境を実現するためのツールで、オープンソースのコンテナー管理ソフトウェアの1つです。
OSやアプリケーションの設定をしたものをそのままイメージとして保存できるので、Dockerが導入されている別のサーバに設定を簡単に移行することができます。
完全仮想化を行うハイパーバイザー型製品と違って Docker はコンテナ型仮想化なのでディスクの使用量も少なく、ビルドもデプロイも高速、オーバーヘッドも少ないのが利点としてあげられます。

Googleでは全てのソフトウェアをコンテナ上で動かしていることで話題になりました。
http://www.publickey1.jp/blog/14/google20.html
また「Docker Hub」の登場によりビルド、テスト、デプロイの一連の継続的インテグレーション/継続的デプロイを実現できるようになったりと、Docker は今非常に勢いのあるツールといえます。

Dockerを触ってみよう

触ってみないと Docker がどんなものかイメージできないかもしれないのでまずは触ってみましょう。

環境

・Mac OSX 10.9
・Virtualbox 4.3.12
・Vagrant 1.6.3

今回は Virtualbox + Vagrant の上に Ubuntu をのせてその上に Docker をのせたいと思いますので
Vagrant を使ったことがない人はこちらで予め学習しておいてください。

Virtualbox + Vagrant に Ubuntuを用意

Docker のホストOSに Ubuntu を使いたいと思います。
boxファイルはこちらから。

$ vagrant box add ubuntu14.04 https://cloud-images.ubuntu.com/vagrant/trusty/current/trusty-server-cloudimg-amd64-vagrant-disk1.box

//作業ディレクトリ作成
$ mkdir ~/schoolwith_docker
$ cd ~/schoolwith_docker

// 初期化
$ vagrant init ubuntu14.04

Vagrantfile が作成されるのでIPアドレスの部分だけ編集してください。
今回は192.168.33.10にします。

// Vagrantの立ち上げ
$ vagrant up

// Ubuntuにログイン
$ vagrant ssh

無事ログインできました。

仮想マシンにDockerをインストール

ここからはUbuntuにログインした状態からの作業となります。
ではこのUbuntuにDockerをインストールしましょう。

$ curl -s https://get.docker.io/ubuntu/ | sudo sh
$ docker --version
Docker version 1.1.1, build bd609d2

これで入りました。

Docker Imageを取得しよう

ではまずOSやアプリケーションなどの設定が入っている Docker Image を取得してきます。
docker searchコマンドを使用してもいいですし、公式サイトから検索しても良いです。
今回はCentOSという Docker Image を取得します。

$ sudo docker pull centos

取得した Docker Image の確認は下記のようにします。

$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
centos              centos7             1a7dc42f78ba        4 days ago          236.4 MB
centos              latest              1a7dc42f78ba        4 days ago          236.4 MB
centos              centos6             cd934e0010d5        4 days ago          206.9 MB

取得した Docker Image の詳細を確認するには下記のようにします。

// sudo docker inspect {REPOSITORY}:{TAG}
$ sudo docker inspect centos:centos7
省略

新しい Docker Image を作ってみよう

ではDockerのコンテナに入って変更を加えて新しい Docker Image を作ってみましょう。
せっかくなので先日リリースされたCentOS7を使ってみます。

// -i → コンテナーの標準入力を開く。
// -t → ttyを確保する。
$ sudo docker run -it centos:centos7 /bin/bash
bash-4.2#

Dockerのコンテナに入れました。

vim が入っていないので vim インストールしてみましょう。

bash-4.2# which vim
which: no vim in

bash-4.2# yum install vim-enhanced
bash-4.2# which vim
/usr/bin/vim

入りました。

ではこの vim が入った状態のコンテナの Docker Image を作ってみましょう。

// コンテナから抜ける
bash-4.2# exit

// コンテナの状態を見る
$ sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND              CREATED             STATUS                      PORTS               NAMES
92c59e742cb9        centos:centos7      /bin/bash            9 minutes ago       Exited (0) 2 minutes ago                        trusting_brown

// Docker Imageを作る
// sudo docker commit {CONTAINER ID} {ユーザ名/コンテナ名}
$ sudo docker commit 92c59e742cb9 yudsuzuk/vim

// yudsuzuk/vim という Docker Image ができているか確認
$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
yudsuzuk/vim        latest              95aa3c0d75e1        44 seconds ago      344.6 MB
centos              centos7             1a7dc42f78ba        4 days ago          236.4 MB
centos              latest              1a7dc42f78ba        4 days ago          236.4 MB
centos              centos6             cd934e0010d5        4 days ago          206.9 MB

// 作成したDocker Imageを実行
$ sudo docker run -it yudsuzuk/vim /bin/bash

// vim が入っているか確認
bash-4.2# which vim
/usr/bin/vim

ちゃんと Docker Image が作られていましたね。

Dockerfileを使ってみる

実は今実施した
・Docker Imageを取得
・コンテナに何らかの変更を加える
・Docker Imageを作成
という流れをDockerfileを使ってまとめて実行することが出来ます。

ではDockerfileを使ってWebサーバを立ち上げるコンテナを作ってみましょう。

$ vim Dockerfile  # 以下の内容でDockerfileを作成
FROM centos:centos7
MAINTAINER Yuzuru Suzuki  <yuzuru@schoolwith.me>

# RUN: ビルド時に実行される
RUN yum install -y httpd

# 80番を開放
EXPOSE 80

# CMD: run時に実行される
CMD ["/usr/sbin/httpd", "-D", "FOREGROUND"]

ビルドしてみましょう。

$ sudo docker build -t yudsuzuk/httpd .

実行してみましょう。
ローカルのポート5000番をコンテナ側の80番にフォワードしてやります。

$ sudo docker run -p 5000:80 -d yudsuzuk/httpd

Apacheが立ち上がっているか確認しましょう
→ http://192.168.33.10:5000
apache

無事立ち上がっていました。

Docker Image を Docker Hub に push してみよう

まずは Docker hub でアカウントを作成してください。
作成が終わったらターミナルからログインしてDocker Hub に push してみましょう。

// ログイン
$ sudo docker login
Username: yudsuzuk
Password:
Email: yuzuru@schoolwith.me
Login Succeeded

// push
$ sudo docker push yudsuzuk/httpd

こうすることでpush した Docker Image を 他の環境から pull して使えるようになります。
便利で、簡単ですね。

まとめ

駆け足で Docker の触りをお話しました。
Docker の開発は非常に活発で主要なベンダーもサポートを表明してます。
今後、コンテナ型仮想化技術はどんどん発展して、取り入れていくべき技術に変わっていくでしょう。
みなさんもぜひ活用してみてください。

この記事を書いた人
鈴木 弦 エンジニア

サーバーサイドエンジニア。大手WEBポータル企業にてコマース開発に従事。企業向けシステム開発等に関わる。また100万DLを超えるiOSアプリのメイン開発担当。その後School Withにジョイン。好きなラーメンは鶏ガラ系醤油。

School Withとは

School With (スクールウィズ) は海外留学・語学留学の口コミ情報サイトです。

東京ボスストーリー