boot2dockerの代わりにdocker-machine

表題の通り。以前、どこかで『docker-machineはboot2dockerの代替ではない』といった記述を見かけた気がするのだが…。とりあえず`docker-machine`を試してみる。

■ 環境

  • boot2docker 1.8.0
  • docker-machine 0.3.1
  • Mac OSX (10.10.5)

■ boot2docker

boot2dockerでVMを起動しようとしたところ下記のようなメッセージが出力された。今回のエントリのきっかけである。

$ boot2docker start

  WARNING: The 'boot2docker' command line interface is officially deprecated.

  Please switch to Docker Machine (https://docs.docker.com/machine/) ASAP.

  Docker Toolbox (https://docker.com/toolbox) is the recommended install method.

Waiting for VM and Docker daemon to start...
................oooooooo
Started.
  :
$

`docker-machine`に移行しろ、ということか。`docker-machine`の`help`を見ると、`boot2docker`で起動しているVMに対してもアクションが起こせそうである。しかし折角なのでいちから`docker-machine`でやってみることにする。

まずはboot2dockerで起動していたVMを削除しておく。

$ boot2docker delete

■ docker-machine

そもそものイメージがあまりできていないのだが、docker-machineはboot2dockerのようにDockerサービスを稼働させるVM相当のものを起動・管理させるもの、と自身の中ではイメージしている。その為、Mac上ではVirtualBox等の”driver“を指定する。boot2dockerと同じようなものであるが、boot2dockerはVirtualBox固定であったものが、EC2やAzure、VMware、OpenStack等々を対象にすることができるようだ。

boot2dockerと実質的には変わらないかもしれないが、現状と同じVirtualBoxでやってみる。

$ docker-machine ls
NAME   ACTIVE   DRIVER   STATE   URL   SWARM
$

もちろんこの時点では対象の”machine“は存在しない。`create`で作成するのであろう。試してみる。

$ docker-machine create
  :
You must specify a machine name
$

多くのオプションが設定できるようだが、”machine name“を指定しなければならないようだ。ここでは仮なので”test“で試してみる。

$ docker-machine create test
Creating CA: /Users/withsin/.docker/machine/certs/ca.pem
Creating client certificate: /Users/withsin/.docker/machine/certs/cert.pem
Error creating machine: --url option is required when no driver is selected
You will want to check the provider to make sure the machine and associated resources were properly removed.

provider“を指定する必要があるようだが、`help`を見ると”–driver“を指定すれば良いようである。

$ docker-machine create --driver "virtualbox" test
Image cache does not exist, creating it at /Users/withsin/.docker/machine/cache...
No default boot2docker iso found locally, downloading the latest release...
Downloading https://github.com/boot2docker/boot2docker/releases/download/v1.8.1/boot2docker.iso to /Users/withsin/.docker/machine/cache/boot2docker.iso...
Creating VirtualBox VM...
Creating SSH key...
Starting VirtualBox VM...
Starting VM...
To see how to connect Docker to this machine, run: docker-machine env test

boot2dockerと同じISOを使用するようである。VirtualBoxでVMを稼働させ、同じようにアクセスをするようだ。

$ docker-machine env test
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.99.100:2376"
export DOCKER_CERT_PATH="/Users/withsin/.docker/machine/machines/test"
export DOCKER_MACHINE_NAME="test"
# Run this command to configure your shell:
# eval "$(docker-machine env test)"
$
$ docker-machine ls
NAME ACTIVE DRIVER     STATE   URL                       SWARM
test        virtualbox Running tcp://192.168.99.100:2376

boot2dockerコマンドを今後は利用しないようにしよう。`boot2docker`をクライアントコマンドとして使用しないように削除してしまっても良いのかもしれない。

以上。

■ 関連

複数のDockerコンテナをリンク

表題の通り。Dockerではマイクロサービス化し、1コンテナで1サービスを稼動させるのが定石らしい。というのでコンテナを複数に分けたらお互いが接続できることが必要なので試す。

■ 環境

  • Mac OSX (10.9.5)
  • boot2docker
  • Docker 1.7.1

■ やりたいこと

MongoDBのServerを1台起動し、別クライアントから接続してみる。

■ MongoDBのコンテナ起動

下記のようにMongoDBのコンテナを起動する。

$ docker run -ti --rm mongodb -d

起動したものを確認する。

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS              PORTS               NAMES
92c264d2de93        mongo:3.0.3         "/entrypoint.sh mong   5 minutes ago       Up 5 minutes        27017/tcp           berserk_brown
$

起動時に”–name“オプションで名前は指定していないので、自動で振られた”berserk_brown“という名前になっている。

■ CentOSのコンテナ起動

続いて、CentOS 6のコンテナを起動する。起動時に”–link“オプションでMongoDBの名前を指定する。指定の仕方は”–link [NAME]:[コンテナ内で使用できる名前]”である。

$ docker run -ti --rm --link berserk_brown:mongo centos:6

この場合では起動したCentOSのコンテナ内で”mongo“という名前でアクセスできるようになる。実際に見てみる。

■ 確認

CentOSのコンテナ内で確認してみる。

環境変数にいろいろと情報が入る。

[root@[CONTAINER_ID] /]# env | grep MONGO
MONGO_ENV_MONGO_MAJOR=3.0
MONGO_PORT=tcp://172.17.0.1:27017
MONGO_ENV_MONGO_VERSION=3.0.3
MONGO_PORT_27017_TCP=tcp://172.17.0.1:27017
MONGO_PORT_27017_TCP_PROTO=tcp
MONGO_PORT_27017_TCP_ADDR=172.17.0.1
MONGO_NAME=/determined_archimedes/mongo
MONGO_PORT_27017_TCP_PORT=27017
[root@[CONTAINER_ID] /]# 

またhostsファイルにも入るようだ。

[root@[CONTAINER_ID] /]# cat /etc/hosts
  :
172.17.0.1    mongo 92c264d2de93 berserk_brown
  :
[root@[CONTAINER_ID] /]#

MongoDBのクライアントを入れても試してみる。

[root@[CONTAINER_ID] /]# yum install epel-release
 :
[root@[CONTAINER_ID] /]# yum install mongodb
 :
[root@[CONTAINER_ID] /]# mongo --host mongo
MongoDB shell version: 2.4.14
connecting to: mongo:27017/test
Welcome to the MongoDB shell.
>

アクセスできた。

以上。

■ 関連

boot2dockerインストール

Macにおいて表題の通り。今更感もあるがboot2dockerをインストールする。

■ 環境

  • Mac OSX (10.9.5)
  • boot2docker 1.7.1
  • Homebrew

■ これまで

boot2dockerの存在自体も知っていたし、検索するとどれもboot2dockerで構築した環境を元にした記載内容だったりするのだが、自身の環境では使用していなかった。ローカルの今までの環境は下記の通り。

Vagrant > VirtualBox > CoreOS > Docker

coreos/coreos-vagrant
https://github.com/coreos/coreos-vagrant

上記をgit cloneし、vagrant upで起動したVMにログインしてDockerを触っていた。boot2dockerも結局同じものなんでしょ?と勘違いをしていたようなので、今回boot2dockerの導入に至った。

boot2dockerは、VirtualBoxで起動されたVM上でDockerサービスを動かすのは同じであるが、dockerコマンド自体はローカルから叩く

■ インストール

Homebrewでインストールが可能であった。

$ brew install boot2docker

依存でdockerもインストールされた。

■ init

$ boot2docker init

下記を行っているようである。

  1. boot2docker.isoをダウンロード(VM用)
  2. SSH鍵の作成

isoのダウンロード先は、~/.boot2dockerであるし、SSH鍵は ~/.ssh配下であるので、initコマンドの実行はどこで行っても問題ない。

■ up

Dockerサービスを稼動させるVMを起動する。up/start/bootどれでも良いらしい。

$ boot2docker up
Waiting for VM and Docker daemon to start...
..........................ooooooooooooooooooooooooo
Started.
Writing /Users/withsin/.boot2docker/certs/boot2docker-vm/ca.pem
Writing /Users/withsin/.boot2docker/certs/boot2docker-vm/cert.pem
Writing /Users/withsin/.boot2docker/certs/boot2docker-vm/key.pem

To connect the Docker client to the Docker daemon, please set:
    export DOCKER_HOST=tcp://192.168.59.103:2376
    export DOCKER_CERT_PATH=/Users/withsin/.boot2docker/certs/boot2docker-vm
    export DOCKER_TLS_VERIFY=1

Dockerサービスが稼動するVMが起動すれば、以降はローカルの環境変数に最後の設定を入れておく。

■ 感想

Dockerサービスを稼動させるだけのVMで、クライアントはローカルから直接アクセス。この形式はクラスタ化した時に更に有益なものになるのだろう。

docker-machineもあるとのことなので、次はそちらを見てみることにする。

■ 関連