■ Docker Machine とは?
Docker Machine は、Docker Engine( docker デーモン等)をコンピュータ上や仮想マシン、クラウド・プロバイダなどに自動的に展開・設定する(プロビジョニングの)ためのツールです。オープンソース・プロジェクトとしてDocker 社とコミュニティによって開発が進められています。
概要については、以前 SlideShare にアップロード(第11回クラウドごった煮コンテナ勉強会)した資料がありますので、こちらも併せてご覧ください。
具体的には下図のようなイメージです。「docker-machine」コマンドが、VirtualBoxだけでなく、Amazon Web Services や DigitalOcean など、リモート上のクラウドサービスと接続して、Docker がすぐに利用できる環境を作ります。
Docker Machine 0.3.0 が 2015 年 6 月 18 日に公開されました。このバージョンから、いくつか機能が追加されました。クラウド上の API が対応していなくても SSH でログイン可能な環境があれば、自動的に Docker Engine のセットアップと、TLS による暗号化通信に対応しました。
また、地味に便利なのが docker-machine コマンドで scp 機能をサポートした点です。通常の scp はホスト名や IP アドレスを指定する必要があります。docker-machine を使えば、ホスト名などが分からなくても、docker-machine で定義した名前によってコピーができるようになり、インフラ部分を意識しなくても利用できます。このあたりは、Docker Swarm を使ってクラスタを形成するときに非常に楽になるのですが、ここはまた別の記事でまとめます。
以下、それぞれ試す方法です。
■ そもそも Docker Machine を使うには?
バイナリが配布されていますので、それを利用します。Linux 64bit 環境であれば、次のようにセットアップします。セットアップ後はバージョン情報の表示を確認します。
$ curl -L https://github.com/docker/machine/releases/download/v0.3.0/docker-machine_linux-amd64 > ./docker-machine $ chmod +x ./docker-machine $ sudo mv ./docker-machine /usr/local/bin/ $ docker-machine -v docker-machine version 0.3.0 (0a251fe)
MacOS や Windows は、ダウンロードページ https://docs.docker.com/machine/#installation を確認ください。
■ generic ドライバでリモートの Docker 環境自動構築
リモートの SSH 可能な環境に、実行中の OS を意識することなく、自動的に Docker が動作する環境をセットアップしてみます(注:この方法を使うと、各ディストリビューションが配布するパッケージではなく、Docker が配布しているバイナリがセットアップされます)。
これまでの Docker Machine は -d オプションで VirtualBox やクラウド・プロバイダを指定しました。Version 0.3.0 からサポートされた generic ドライバを使うには「-d generic」を指定します。
ただし、これには事前準備が必要です。docker-machine コマンドが実行する環境から、対象となるサーバには SSH ログインできる必要があります。また、ログイン先のユーザは、自動的に Docker 関連パッケージをセットアップするため、 root ユーザ権限が必要です。
そのため、事前に「ssh-keygen -t rsa -b 2048」などで鍵ペアを作成し、作成された 公開鍵 id_rsa.pub をリモートのサーバ上にも送ります(例:/root/.ssh/authorized_keys に追記)。
$ ssh-keygen -t rsa -b 2048 Generating public/private rsa key pair. Enter file in which to save the key (/home/zem/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/zem/.ssh/id_rsa. Your public key has been saved in /home/zem/.ssh/id_rsa.pub. The key fingerprint is: c2:14:47:64:c4:6c:ed:7a:10:3f:81:80 zem@ubuntu.docker.jp The key's randomart image is: +--[ RSA 2048]----+ |o.++ ..B*. | |E.+.o .+= . | | o . ... o | | oo . . | | .o So | | .. . | | . | | | | | +-----------------+ $ cat .ssh/id_rsa.pub ssh-rsa AAAAB3NzaC1y(省略)x8N zem@dev.docker.jp
事前に ssh コマンドを使って、SSH でログイン可能かどうか試しておくと楽です。
準備が整ったら docker-machine を使って、リモートのサーバ上に Docker 環境を構築します。この時の書式は次の通りです。
$ docker-machine create -d generic \ --generic-ssh-user <リモート・ログイン時のユーザ名> \ --generic-ssh-key <ローカルの秘密鍵のパス> \ --generic-ip-address <リモートのIPアドレス> \ <docker-machineが認識する任意のホスト名>
実際には次のように入力します。
$ docker-machine create -d generic \ --generic-ssh-user root \ --generic-ssh-key ~/.ssh/id_rsa \ --generic-ip-address 128.199.170.42 \ ubuntu Importing SSH key... To see how to connect Docker to this machine, run: docker-machine env ubuntu
これで設定完了です。状態を確認するには「docker-machine ls」コマンドです。
$ docker-machine ls NAME ACTIVE DRIVER STATE URL SWARM ubuntu generic Running tcp://128.199.170.42:2376
このとき、IPアドレスの指定間違いなど、接続できなかった場合は情報が残り続けるため「docker-machine rm <ホスト名>」を実行して情報を削除する必要があります。
ここでは Ubuntu 14.04 のリモート環境を用意しましたが、CentOS7 環境も同様に追加することができます。正常に追加すると、次のように複数のホスト情報が確認できます。
$ docker-machine ls NAME ACTIVE DRIVER STATE URL SWARM centos7 generic Running tcp://128.199.92.160:2376 ubuntu generic Running tcp://128.199.170.42:2376
あとは、通常の Docker Machine 同様に、リモート上のサーバにログインすることなく、コンテナの操作が可能です。ここでは centos7 のマシンにログインすることなく nginx のコンテナを起動してみます。
そのためには、「docker-machine env」コマンドで環境変数を確認して、docker コマンドの操作対象を切り替えます。
$ docker-machine env centos7 export DOCKER_TLS_VERIFY="1" export DOCKER_HOST="tcp://128.199.92.160:2376" export DOCKER_CERT_PATH="/home/zem/.docker/machine/machines/centos7" export DOCKER_MACHINE_NAME="centos7"
環境変数の情報が表示されますので、export 行を表示されたまま実行します。この状態で「docker run -d nginx」を実行すると、コンテナのイメージのダウンロード後、コンテナが起動します。
$ docker run -d nginx Unable to find image 'nginx:latest' locally latest: Pulling from nginx 64e5325c0d9d: Pull complete bf84c1d84a8f: Pull complete (省略) Status: Downloaded newer image for nginx:latest a88a88db1eda59888c3224dd1c3d22b73a6525b5cb01a66c6a5b46225318bfcb
ここでコンテナIDが表示されますが、これは docker-machine を実行しているホストではなく「centos7」上のホストで実行されます。対象ホストにログインして docker ps を実行すると、リモート上でコンテナが起動できることが分かります。
$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a88a88db1eda nginx "nginx -g 'daemon of 5 seconds ago Up 4 seconds 80/tcp, 443/tcp insane_babbage
これまでも手動で環境変数を書き換えれば可能でしたが、都度ホストの IP アドレスを確認したり、TLS を有効にするには面倒な手順(https://docs.docker.com/articles/https/)が必要でしたが、それらは不要になります。
■ dockre-machine scp を使うには
docker-machine で認識されているクラスタ間では、scp コマンドのようにファイルやディレクトリをコピーすることができます。これは、docker-machine コマンドを実行するローカルの領域をコピーするだけでなく、リモートの Docker ホスト間でファイルをコピーすることもできます。
書式は非常にシンプルです。
$ docker-machine scp –r <元ホスト>:<パス> <コピー先>:<パス>
$ docker-machine scp –r <ローカルのパス> <コピー先>:<パス>
$ docker-machine scp –r <元ホスト>:<パス> <ローカルのパス>
たとえば、先の centos7 マシン上の「/data」ディレクトリを、ubuntu マシンにコピーしてみましょう。
[root@centos ~]# mkdir /data [root@centos ~]# echo "Hey world" > /data/hey.txt [root@centos ~]# cat /data/hey.txt Hey world
このように、テキストファイルを作成しました。docker-machine を実行するホストでは、次のように実行します。「-r」オプションでディレクトリを指定し、centos7ホストの「/data」領域を、「ubuntu」ホストの「/」直下にコピーします。
zem@dev:~$ docker-machine scp -r centos7:/data ubuntu:/
コピーされたかどうか、ubuntu サーバに入って確認してみます。
root@ubuntu:~# ll /data/ total 12 drwxr-xr-x 2 root root 4096 Jul 1 09:11 ./ drwxr-xr-x 23 root root 4096 Jul 1 09:11 ../ -rw-r--r-- 1 root root 10 Jul 1 09:11 hey.txt root@ubuntu:~# cat /data/hey.txt Hey world
先ほどのディレクトリと同じ状態であることが分かります。これを応用すると、ホスト間でのデータの融通に IP アドレスを意識する必要がないため、作業が捗る場合もあると思います。
■ おわりに一言
Docker Machine も version 0.3.0 になって、色々実用的な機能が増えてきたように思います。使うのは非常に簡単ですので、もし興味をお持ちになりましたら、色々試していただければと思います。
■ 参考
Docker Machine
https://docs.docker.com/machine/
Docker Machine ( GitHub )
https://github.com/docker/machine
Pingback: Docker Machine公式サイトをナナメ読み写経しながら軽く体験 | ログってなんぼ