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コンテナイメージのダウンロードが高速に行われます。
ぜひお試しください!