2014/02/25

MacでDocker 0.8.0を利用してみる

Dockerをbrew経由でインストールして使ってみました。

VirtualBoxのインストール

DockerにはVirtualBoxが必要なので、VirtualBoxのページからインストール用のdmgをダウンロードします。

そして、ダウンロードしたdmgをマウントして、パッケージをインストールしてください。

boot2dockerとdockerのインストール (brew)

brewにdocker 0.8.0があったので、それを使いました。

$ brew search docker
boot2docker  docker

$ brew info docker  
docker: stable 0.8.0 (bottled)
http://docker.io
Not installed
From: https://github.com/Homebrew/homebrew/commits/master/Library/Formula/docker.rb
==> Dependencies
Build: go ✘
==> Options
--without-completions
    Disable bash/zsh completions

dockerとboot2dockerの両方を入れておきます。

$ brew install boot2docker
==> Downloading https://github.com/steeve/boot2docker/archive/v0.5.4.tar.gz
######################################################################## 100.0%
🍺  /usr/local/Cellar/boot2docker/0.5.4: 4 files, 32K, built in 3 seconds

$ brew install docker
==> Downloading https://downloads.sf.net/project/machomebrew/Bottles/docker-0.8.0.mavericks.bottle.2.tar.gz
######################################################################## 100.0%
==> Pouring docker-0.8.0.mavericks.bottle.2.tar.gz
==> Caveats
Bash completion has been installed to:
  /usr/local/etc/bash_completion.d

zsh completion has been installed to:
  /usr/local/share/zsh/site-functions
==> Summary
🍺  /usr/local/Cellar/docker/0.8.0: 9 files, 12M

boot2dockerの初期化

boot2dockerはDockerの起動をのために構成されたTiny Core Linuxベースのディストリビューションです。dockerを利用するためには、あらかじめboot2docker initでboot2dockerの設定をしておく必要があります。

2024.02.26 追記 次の作業は行わなくてよくなりました。

brewではシェルスクリプトだけがインストールされるので、boot2docker initに必要なboot2docker.isoがありません。

そこで、次のURLからboot2docker.isoをダウンロードしておきます。

$ boot2docker init
[2014-02-23 01:05:52] Creating VM boot2docker-vm
Virtual machine 'boot2docker-vm' is created and registered.
UUID: a8ab1bb3-9e60-4911-bbb2-22ab6c0fa404
Settings file: '/Users/safx/VirtualBox VMs/boot2docker-vm/boot2docker-vm.vbox'
[2014-02-23 01:05:52] Setting VM settings
[2014-02-23 01:05:52] Setting VM networking
[2014-02-23 01:05:52] Setting VM disks
[2014-02-23 01:05:52] Creating 40000 Meg hard drive...
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
Disk image created. UUID: 66c6b926-3b30-4807-b2ec-a3d4e1117067
Converting from raw image file="format-flag.txt" to file="format-flag.vmdk"...
Creating dynamic image with size 5242880 bytes (5MB)...
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
Clone hard disk created in format 'VMDK'. UUID: 66c6b926-3b30-4807-b2ec-a3d4e1117067
[2014-02-23 01:05:53] Done.
[2014-02-23 01:05:53] You can now type boot2docker up and wait for the VM to start.

boot2docker.isoをダウンロードし、それを用いてboot2docker.vmdkが作成されます。

$ ls boot2docker.* 
boot2docker.iso     boot2docker.vmdk

boot2dockerの起動

先ほど初期化したboot2docker.vmdkをboot2docker経由でヘッドレスモードで起動させます。

まず、DOCKER_HOSTを設定しておきます。

$ export DOCKER_HOST=tcp://127.0.0.1:4243

そして、boot2dockerを用いてdockerのdaemonを起動させます。手元環境では20秒ほどあかりました。

$ time boot2docker up
[2014-02-23 01:13:32] Starting boot2docker-vm...
[2014-02-23 01:13:52] Started.
boot2docker up  0.09s user 0.10s system 0% cpu 20.651 total

boot2docker statusでステータスが確認できます。

$ boot2docker status
[2014-02-23 00:50:40] boot2docker-vm is running.

Dockerのイメージの取得と起動

お試し用に、小さめのイメージを使うために、docker searchで小さめイメージを検索します。

$ docker search tiny     
NAME                      DESCRIPTION                                     STARS     OFFICIAL   TRUSTED
hecticjeff/ipserver       Tiny server which responds with your curre...   1                    [OK]
paintedfox/tinyproxy      A docker image for running Tinyproxy, a li...   1                    [OK]
jprjr/docker-tinyfs       A small image (5.5MB) made using buildroot.     1                    [OK]
jprjr/tinynode            A small buildroot-based image with NodeJS ...   1                    [OK]
        :                                                 :

jprjr/docker-tinyfsが小さそうなので、これをdocker pullで取得します。

$ docker pull jprjr/docker-tinyfs   
Pulling repository jprjr/docker-tinyfs
6c0d846f8603: Download complete 
511136ea3c5a: Download complete 
64b5438a9d10: Download complete 
19b8f5796ba9: Download complete 
4840b0e9b440: Download complete 
6a6cf9801c71: Download complete 
ece0a963fb32: Download complete 

イメージ一覧はdocker imagesで確認できます。この中に、先ほど取得したイメージがあるのがわかります。

$ docker images
REPOSITORY            TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
jprjr/docker-tinyfs   latest              6c0d846f8603        9 weeks ago         5.359 MB

では、このイメージを起動させてみましょう。docker run <イメージ> <コマンド>という形式で、イメージ内のものを実行させることができます。

$ docker run jprjr/docker-tinyfs uname -a
Linux 85e1517b9ec9 3.13.3-tinycore64 #1 SMP Wed Feb 19 01:15:06 UTC 2014 x86_64 GNU/Linux

いろいろしたいときは、-t (tty割り当て) と-i (interactiveモード) を付けてシェルを起動させましょう。

$ docker run -t -i jprjr/docker-tinyfs /bin/sh
~ $ pwd
/home/default
~ $ echo 'foobar' > sample.txt
~ $ cat sample.txt 
foobar
~ $ ls /
bin      dev      etc      home     lib      lib64    linuxrc  media    mnt      opt      proc     root     run      sbin     sys      tmp      usr      var
~ $ exit

[error] commands.go:2496 Couldn't send EOF: use of closed network connection

Dockerイメージのコミット

docker runは実行するごとに新しいコンテナを作って、そこでコマンドを実行しています。 なので、先ほど追加したsample.txtはこのままでは利用できません。

利用するにはコンテナをコミットして、イメージにしてやる必要があります。

まず、docker ps -aで、作ったコンテナの情報を見てみましょう。コンテナID、イメージ、実行したコマンドなどが表示されます。

$ docker ps -a
CONTAINER ID        IMAGE                        COMMAND             CREATED             STATUS              PORTS               NAMES
f0af6964cbe9        jprjr/docker-tinyfs:latest   /bin/sh             About an hour ago   Exit 0                                  sleepy_curie        
1ece86ef2731        jprjr/docker-tinyfs:latest   uname -a            About an hour ago   Exit 0                                  ecstatic_ritchie

上で実行したのは、2つのrunコマンドなので2つのコンテナが作成されており、そのどちらもイメージはjprjr/docker-tinyfsである、などのことがわかります。 なお、docker ps -lで、一番新しいコンテナのみの表示になります。

sample.txtを追加した/bin/shのコンテナ (コンテナID f0af6964cbe9) をコミットしましょう。「docker commit <コンテナID> <新しいイメージ名>」でコミットします。これで、指定したコンテナからイメージが作成されます。

$ docker commit f0a my/sample
e63c176fdef9600e32ac9a4422441d32529529b79006bcd61be5bb56f1596fc4

docker imagesで確認すると、確かに新しいイメージができています。

$ docker images
REPOSITORY            TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
my/sample             latest              e63c176fdef9        27 seconds ago      5.408 MB
jprjr/docker-tinyfs   latest              6c0d846f8603        9 weeks ago         5.359 MB

このイメージでdocker runすると、先ほどのテキストファイルがちゃんと読めるようになっています。

$ docker run my/sample cat /home/default/sample.txt
foobar

今回はつまらないテキストファイルを追加しただけですが、実際にはパッケージャなりを利用して、環境を整備してコミットする、というのを繰り返していったりするみたいです。

関連リンク

3 件のコメント:

  1. boot2docker initすればisoもダウンロードしてくれると思いますよー

    返信削除
  2. 情報ありがとうございます!

    それができていなかったんですよ…。

    調べたところ、brewのboot2docker内get_latest_release_nameで見ているURLがGitHubの最新のものと違っていました。

    boot2dockerを最新のものにするとboot2docker initで取得できました。現時点ではbrewのものはちょっと古いみたいですね。

    返信削除
  3. 連投失礼します。

    brewのboot2dockerも最新にしたら大丈夫になっていました。

    なのでちょっと記事に追記しました。

    返信削除

注: コメントを投稿できるのは、このブログのメンバーだけです。