boot2dockerを使わない。「Remote API」でローカルからクラウドのDockerを実行

Dockerはコンテナ型の仮想化技術なので、実行できる環境がLinuxに限定されるのが難点です。一般的にはCoreOS、CentOS、Ubuntu上でDockerを動かすのですが、普段使っているWindowsやMac OSXでも使いたいと考える人はとても多いです。

そこで使われているのがboot2dockerなのですが、これはVirtualBox上にTiny Core Linuxを用意して、その上でDockerを動かすという仮想化のために仮想環境を用意するという、強引な解決手段となっています。軽量な仮想環境なはずなのに、VirtualBoxの立ち上げに時間がかかるのは勿体ないですよね。

そこで使ってみたいのがDockerのRemote APIを使って外部にあるDockerサーバを操作するという方法です。今回はその設定方法を紹介します。

必要なもの

クライアントマシン

今回はMac OSXを使っています。予めdockerコマンドを用意しておきます。Homebrewを使っている場合は、

$ brew install docker 

でインストールできます。

さくらのクラウドのアカウント


アカウントはさくらのクラウドトップページからできます。

クラウドサーバを追加する


管理画面に入りましたら、サーバの追加を選択します。追加画面では、サーバの名前、メモリ数、ディスクプランなどを決めていきます。大事なのはアーカイブ選択の中にある CoreOS 379.3.0 (alpha) を選択することです(バージョン番号は2014年08月現在です)。これだけで必要なものが揃います。


後はパスワードや公開鍵の入力などを行ってください。この状態で起動してみます。

サーバに接続する

Webベースのコンソールもありますが、今回はターミナルからつないでみます。公開鍵認証が優先なので、先ほど設定していれば、

$ ssh core@server_ip_address

で接続できます(server_ip_addressは各自読み替えてください)。IPアドレスはサーバ一覧のインタフェースで確認してもらえます。


Dockerのバージョンを確認する

ここが大事なのですが、クライアント(Mac OSXやWindows)とサーバ(CoreOS)でDocker APIのバージョンを合わせておく必要があります。

$ docker version
Client version: 1.1.1
Client API version: 1.13
Go version (client): go1.2
Git commit (client): dc62f3c
Server version: 1.1.1
Server API version: 1.13
Go version (server): go1.2
Git commit (server): dc62f3c

CoreOS 367.1.0 (stable) ではDocker APIが1.12のため、今回はCoreOS 379.3.0 (alpha)を使っています。逆にクライアント側のdockerのバージョンを下げる方法もあります。CoreOSではパッケージ管理のような機能はなく、全体を入れ替える方法をとっているため、Dockerだけのバージョンをあげるのは大変そうです。

リモート接続を有効にする

CoreOSにログインしたら、設定ファイルを作成します。

# vi /etc/systemd/system/docker-tcp.socket

内容は次の通りです。

[Unit]
Description=Docker Socket for the API

[Socket]
ListenStream=2375
BindIPv6Only=both
Service=docker.service

[Install]
WantedBy=sockets.target

入力したらファイルを閉じ、Dockerを再起動します。

# systemctl enable docker-tcp.socket
# systemctl stop docker
# systemctl start docker-tcp.socket
# systemctl start docker

これで準備は完了です。うまく設定できている場合は、次のコマンドでレスポンスが返ってきます(CoreOS上で実行しています)。

$ docker -H tcp://127.0.0.1:2375 ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

クライアント側の設定

クライアントでの設定はとても簡単です。DockerのURLを環境変数に設定するだけです。

$ export DOCKER_HOST=tcp://server_ip_address:2375

server_ip_addressは各自読み替えてください。これで準備は完了です。

実行してみる

では早速実行してみましょう。実行はクライアント側から行います。

$ docker run ubuntu echo 'Hello World'
Unable to find image 'ubuntu' locally
Pulling repository ubuntu
c4ff7513909d: Download complete 
511136ea3c5a: Download complete 
1c9383292a8f: Download complete 
9942dd43ff21: Download complete 
d92c3c92fa73: Download complete 
0ea0d582fd90: Download complete 
cc58e55aa5a5: Download complete 
Hello World

こんな感じにレスポンスがあるはずです。CoreOS側を見てみます。

$ docker ps -a 
CONTAINER ID        IMAGE               COMMAND              CREATED             STATUS                     PORTS               NAMES
4b2a03b2df71        ubuntu:latest       echo 'Hello World'   9 seconds ago       Exited (0) 9 seconds ago                       prickly_ritchie     

ちゃんと実行されていることが分かります。


この方法を使えば、さくらのクラウドにSSHなどでログインすることなく、手元のターミナルからDockerが使えます。VMを使っていないのでCPUを浪費したり、ノートPCのバッテリーを心配することもありません(VMを使っているとどんどん減っていくんですよね)。さらにクラウドはネットワークも速いので、Dockerコンテナイメージのダウンロードが高速に行われます。

ぜひお試しください!

via Customizing docker

おしらせ