先月 Docker が Mac に対応したということで、ひと通り触ってみた。
Docker とは?
LXC ベースのコンテナ型仮想化ソフトウェアである。下記の資料がわかりやすい。
- はじめての docker – slideshare
前提
まず「Mac に対応した」ということだが、Mac で直接 LXC が動くわけではない。今回の対応は、VirtualBox の上で CoreOS という軽量なディストリビューションを動かし、そこで LXC を使うというカラクリだ。したがって事前に VirtualBox を入れておく必要がある。
また、docker
コマンド自体や CoreOS のセットアップに使うコマンド (boot2docker
) を入れるために、Homebrew もインストールしておく。
準備
docker
コマンドおよび CoreOS の VM のインストールは、基本的には下記の記事の通りにすればできる。
- docker が正式サポートした OS X の環境を構築してみた! – Act as Professional
いくつか補足しておく。
補足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 <[email protected]>
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
命令の違いは、下記のページでわかりやすく紹介されている。
- Docker で nginx サーバー立ててみた。あと Docker の使い方とか。 – Less is Best
- CMD はコンテナの実行時に実行される
- RUN はコンテナのビルド時に実行される
docker commit
するときに Dockerfile と同様の命令を使う方法は、下記のページで紹介されている。
その他 Dockerfile 書き方の詳細は、ドキュメントを参照のこと。
感想
便利なツールたちのおかげで、簡単に Mac 上で Docker を動かすことができた。また、公式の ubuntu イメージを少しだけ触ってみたが、apt-get やミドルウェアの起動スクリプトの実行に失敗するなど、若干クセが有るように感じた。この辺りをうまく解消できれば、便利に使えるんじゃないだろうか。
コメント