Mac で Docker を触ってみた

先月 Docker が Mac に対応したということで、ひと通り触ってみた。

スポンサーリンク

Docker とは?

LXC ベースのコンテナ型仮想化ソフトウェアである。下記の資料がわかりやすい。

前提

まず「Mac に対応した」ということだが、Mac で直接 LXC が動くわけではない。今回の対応は、VirtualBox の上で CoreOS という軽量なディストリビューションを動かし、そこで LXC を使うというカラクリだ。したがって事前に VirtualBox を入れておく必要がある。

また、docker コマンド自体や CoreOS のセットアップに使うコマンド (boot2docker) を入れるために、Homebrew もインストールしておく。

準備

docker コマンドおよび CoreOS の VM のインストールは、基本的には下記の記事の通りにすればできる。

いくつか補足しておく。

補足1: docker ユーザのパスワード

boot2docker ssh するときのパスワードは tcuser である。

補足2: DOCKER_HOST の指定方法

docker コマンドのバージョンによっては、以下のようなエラーが出るかも知れない。

2014/03/08 21:00:38 Invalid bind address format: tcp://

どうやら環境変数 DOCKER_HOST の指定方法が変わったようなので、この場合は以下のように修正する。

export DOCKER_HOST=tcp://127.0.0.1:4243

イメージのダウンロード

Docker では、”イメージ” と呼ばれるコンテナのひな形が公式サイト docker index で配布されている。サブコマンド pull により、これをローカルに落としてくることができる。

例えば Ubuntu のイメージが欲しいなら以下のようにする。

$ docker pull ubuntu

ローカルにあるイメージの一覧は、サブコマンド images で確認できる。

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
ubuntu              13.10               9f676bd305a4        4 weeks ago         178 MB
ubuntu              saucy               9f676bd305a4        4 weeks ago         178 MB
ubuntu              raring              eb601b8965b8        4 weeks ago         166.5 MB
ubuntu              13.04               eb601b8965b8        4 weeks ago         166.5 MB
ubuntu              12.10               5ac751e8d623        4 weeks ago         161 MB
ubuntu              quantal             5ac751e8d623        4 weeks ago         161 MB
ubuntu              10.04               9cc9ea5ea540        4 weeks ago         180.8 MB
ubuntu              lucid               9cc9ea5ea540        4 weeks ago         180.8 MB
ubuntu              12.04               9cd978db300e        4 weeks ago         204.4 MB
ubuntu              latest              9cd978db300e        4 weeks ago         204.4 MB
ubuntu              precise             9cd978db300e        4 weeks ago         204.4 MB

コンテナの起動、停止

イメージからコンテナを起動するには、run サブコマンドを使う。

例えば、イメージ ubuntu のタグ 12.04 を起動して bash を実行するには、次のようにする。

$ docker run -i -t ubuntu:12.04 /bin/bash

コマンドを実行してみる。

root@f9ab56d256cf:/# cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=12.04
DISTRIB_CODENAME=precise
DISTRIB_DESCRIPTION="Ubuntu 12.04 LTS"

コンテナを停止するには、プロンプトで exit する。停止せずに切断するには、Ctrl-p Ctrl-q (その後 enter) を押せば良い。

先ほどとは逆に、コンテナをイメージとして保存するには、commit サブコマンドを使う。

$ docker commit f9ab56d256cf akagisho/testimage

コンテナの確認

コンテナの一覧を表示するには ps サブコマンドを使う。停止中のコンテナも含めて表示する場合は -a オプションを使う。

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
f9ab56d256cf        ubuntu:12.04        /bin/bash           2 days ago          Exit 0                                  distracted_mccarthy

コンテナの起動と再接続

停止したコンテナを起動するには start サブコマンドを使う。

例えば先ほどのコンテナを再度起動するには次のようにする。

$ docker start f9ab56d256cf

起動中のコンテナには attach サブコマンドで接続できる。

$ docker attach f9ab56d256cf

気づいたこと

apt-get upgrade の失敗

コンテナを起動したら、とりあえず OS を最新の状態にしておこうと apt-get を実行した。

# apt-get update
# apt-get upgrade -y

すると以下のように失敗してしまった。

ldconfig deferred processing now taking place
Errors were encountered while processing:
 initscripts
 ifupdown
 procps
 udev
 plymouth
 mountall
 initramfs-tools
E: Sub-process /usr/bin/dpkg returned an error code (1)

調べてみると、以下のような投稿が見つかった。

デバイスや initctl に何か細工をしているのが影響しているようだ。次のようにすることで解決した。

# apt-mark hold initscripts udev plymouth mountall
# dpkg-divert --local --rename --add /sbin/initctl

MySQL の起動の失敗

今回の目的の一つとして、以前作成した GitLab のインストールスクリプトのテストに使いたいというのがあった。そこでスクリプトを走らせてみたところ、MySQL の起動で失敗してしまった。

先ほどと同じく initctl が原因で起動スクリプトが使えない様子。/usr/bin/mysqld_safe コマンドを直接叩くことでひとまず起動できた。自前の起動スクリプトを用意するなどした方が良いかも知れない。

Dockerfile

Docker には Dockerfile という、コンテナの作成を自動化する仕組みがある。

これを使うには、あるディレクトリに Dockerfile という名前でファイルを作成し、そこに所定のフォーマットで命令を記述する。そして以下のコマンドで実行する。

$ docker build -t (タグ名) (ディレクトリの PATH)

例えば公式の Ubuntu 12.04 イメージを元に、各種パッケージを最新の状態にしたイメージを作るには、次のような内容になる。

FROM ubuntu:12.04

MAINTAINER akagisho <akagisho@gmail.com>

RUN echo "deb http://jp.archive.ubuntu.com/ubuntu precise main universe" > /etc/apt/sources.list
RUN apt-mark hold initscripts udev plymouth mountall
RUN dpkg-divert --local --rename --add /sbin/initctl
RUN apt-get update
RUN apt-get upgrade -y

RUN 命令と CMD 命令の違いは、下記のページでわかりやすく紹介されている。

  • CMD はコンテナの実行時に実行される
  • RUN はコンテナのビルド時に実行される

docker commit するときに Dockerfile と同様の命令を使う方法は、下記のページで紹介されている。

その他 Dockerfile 書き方の詳細は、ドキュメントを参照のこと。

感想

便利なツールたちのおかげで、簡単に Mac 上で Docker を動かすことができた。また、公式の ubuntu イメージを少しだけ触ってみたが、apt-get やミドルウェアの起動スクリプトの実行に失敗するなど、若干クセが有るように感じた。この辺りをうまく解消できれば、便利に使えるんじゃないだろうか。

コメント

タイトルとURLをコピーしました