備忘録のため,内容の正当性については責任を持ちません。

先月 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 やミドルウェアの起動スクリプトの実行に失敗するなど、若干クセが有るように感じた。この辺りをうまく解消できれば、便利に使えるんじゃないだろうか。

コメント

コメントする




CAPTCHA