Docker入門、VM上でLinuxコンテナ立ち上げ〜基本操作まで

インフラCIの環境を、Docker, Chef, Serverspec, Jenkins を使って整えたいな〜と考え、遅ればせながら Docker に入門しました。

Docker – Build, Ship, and Run Any App, Anywhere

実現したいのは、まさに以下のエントリーのような自動化。Chef cookbook のレシピが、いつでも確実に正しく構成できることを CI したいのが一番の目的です。

Docker + Chef + serverspec + Jenkins でインフラCIの環境を構築してみた – hidemium’s blog

スポンサーリンク

Docker 入門に際して、次の記事等を参考にしました。

いまさら聞けないDocker入門(1):アプリ開発者もインフラ管理者も知っておきたいDockerの基礎知識 – @IT
Docker 初心者は phusion/baseimage-docker を使おう | diaspora
実例で学ぶDockerコマンド – Qiita

今回のエントリーは入門ということで、とりあえず Mac の Vagrant 上 VM で Docker のコンテナを立ち上げ一通り操作を行うところまで。やってみて分かりましたが、Docker は、理解するには実際に触って動かすのが一番ですね。説明読んでるだけじゃ分かり辛いツールです。

— 環境 —
Mac OS X
Vagrant 1.6.3
VirtualBox 4.3.12
Docker 1.3.2

phusion/baseimage-docker の Vagrantfile を利用

Vagrant と VirtualBox は入っていること前提。入っていない場合は、以下を参考にしてインストールしておきます。

MacにVagrantとVirtualBoxをインストール | EasyRamble

先人達の教え通り、ubuntu ベースの phusion/baseimage-docker をベースイメージとして使わせてもらいます。

https://github.com/phusion/baseimage-docker

phusion/baseimage-docker は、passenger で有名な phusion 社が開発している Docker 用ベースイメージ(Ubuntuベース)です。Dockerに含まれるいくつかのバグに対するワークアラウンドや便利な管理ツールを含み、Dockerフレンドリーなイメージとなっているそうです(Readmeより)。この phusion/baseimage-docker で用意されている Vagrantfile を利用すると、Vagrant + Virtualbox 上に Docker を使うための VM(Ubuntu box)を簡単に準備できます。

適当な作業ディレクトリに、baseimage-docker の Vagrantfile をダウンロード。

その後 vagrant up。初回は、ubuntu の box ファイルのインストールがあるため少々時間がかかります。

vagrant ssh で ubuntu VM にログイン。

phusion/baseimage-docker の Vagrantfile を使うと、既に docker がインストールされた状態となっています。docker のバージョン確認。

docker で Linux コンテナを立ち上げ “Hello Docker”

まずは、早速 Linux コンテナを立ち上げてみましょう。docker run コマンドで、linux コンテナを立ちあげることができます。以下の例は、ubuntu(VM)上の linux コンテナ内(ubuntuイメージ利用)で、echo コマンドで “Hello Docker” を出力させる例です。

「docker run イメージ名 コマンド」のように docker run コマンドを使い、Linux コンテナを立ち上げる。

同様に centos の linux コンテナを立ち上げて Hello Docker する例。

初回は各々 ubuntu, centos 用のイメージ(image)をダウンロードする必要があるため、多少時間がかかります。しかし、2回目以降の docker run では linux コンテナの立ち上げは一瞬です。このコンテナ起動の速さは凄い。

コンテナIDを取得するエイリアスのコマンドを設定

Docker でコンテナを操作する際に、コマンドにコンテナID(CONTAINER ID)を指定します。起動中のコンテナを表示する docker ps コマンドで、docker が自動的に振った CONTAINER ID を確認できます。

停止中のコンテナも全て表示するには、-a オプションを付ける。

コンテナIDの確認を毎回 docker ps で行うのは面倒ですので、間近に利用したコンテナのIDを一発で取得できるように、以下のエイリアスを設定しておくと便利です。

コンテナを操作する各種 docker コマンド

コンテナを操作するためによく使う docker コマンドを列挙しておきます。CONTAINER_ID は、間近に起動したコンテナを指定する場合は dl でも可。

起動中のコンテナを表示。

起動中・停止中のコンテナすべてを表示。

コンテナの詳細を表示。

コンテナのログを表示。

停止中のコンテナを起動。

コンテナを停止。

コンテナを強制終了。

コンテナを再起動。

コンテナにアタッチ。

コンテナのプロセスを表示。

コンテナを削除。

Docker の Linux コンテナ内に入る

Docker で立ち上げた Linux コンテナ内に入るには、docker run コマンドで /bin/bash を -i, -t オプション付きで実行する。

-rm オプションをつけると、コンテナの停止後にコンテナが破棄されます。コンテナ内では、/bin/bash のプロセスしか起動していないことを確認できます。

コンテナをバックグランドで動かす

-d オプションを使うと、バックグラウンドでコンテナを動かせる。以下の例は、1秒毎に”hello docker”を出力し続けます。

ログを確認。

イメージを操作する各種 docker コマンド

続いて、コンテナをイメージに保存する方法についてです。その前に、イメージ操作で使うコマンドを確認します。

イメージ一覧を表示。

イメージの情報を表示。

イメージを削除

コンテナをイメージとして保存

立ち上げたコンテナにソフトウェア(memcached)を追加でインストールし、docker commit でコンテナをイメージに保存する手順です。この機能により、独自のイメージを自由に作成できます。

まず最初の段階のイメージ一覧を確認。

ubuntu コンテナを立ち上げ、memcached をインストールし、docker commit でコンテナをイメージ化します。

“docker commit コンテナID イメージ名” という書式のコマンド。イメージ名は “user/image_id” と付けるのが推奨だそうです。

イメージ一覧を確認。

独自の takafumir/memcached という名前のイメージが追加されたことを確認できます。この独自に保存したイメージを使って、コンテナを起動することももちろん可能です。

Dockerfile からイメージをビルド

Docker のイメージは、Dockerfile というコマンドを書いた設定ファイルからビルドすることができます。簡単な Dockerfile を作成して、イメージをビルドしてみます。

Vagrantfile を置いたディレクトリは、VM の /vagrant にマウントされ、自動で同期される。これを利用してローカルで編集したファイルを Vagrant の VM 内でファイルを使えます。WEB+DBのサーバ/インフラ徹底攻略に書いてあった技です、感謝。コンテナのイメージ化、Dockerfileについては、サーバ/インフラ徹底攻略 (WEB+DB PRESS plus)の最後のほうのDocker記事を参考にしました。

ローカル Mac で Dockerfile を作成。

Dockerfile は VM の /vagrant/memcached/Dockerfile に同期されるので、そのディレクトリを指定してビルド。

これにより、takafumir/memcached という名前で、memcached がインストール済みのイメージがビルドされます。ビルドされたイメージは、もちろん docker run でのコンテナ立ち上げに利用できます。

最後におさらい、Docker でできること

・コミュニティのイメージを使ってコンテナを立ち上げられる。(docker run)
・独自のコンテナのイメージを作成できる。(docker commit)
・Dockerfile からイメージをビルドできる。(docker build)
・独自に作ったイメージからも、もちろんコンテナを立ち上げられる。(docker run)
・一旦イメージを手元に取得できたら、コンテナは一瞬で立ち上がる。

まだ実用できるレベルじゃないですけど、本日ちゃんと触ってみて Docker の理解がだいぶ進みました。インフラCIに、Docker 使えそうな手応えを掴めて良かったです。Docker初心者ですので、間違いなどありましたらご指摘歓迎です!

スポンサーリンク
スポンサーリンク
 
Twitterを使っていますのでフォローお願いたします!ブログの更新情報もつぶやいてます^^
(英語学習用)

Leave Your Message!