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

先月 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