Docker Machine 0.3 の新機能、generic ドライバと scp を試す

Docker Machine 0.3 の新機能、generic ドライバと scp を試す

Docker Machine 0.3 の新機能、generic ドライバと scp を試す はてなブックマーク - Docker Machine 0.3 の新機能、generic ドライバと scp を試す


■ Docker Machine とは?

Docker Machine は、Docker Engine( docker デーモン等)をコンピュータ上や仮想マシン、クラウド・プロバイダなどに自動的に展開・設定する(プロビジョニングの)ためのツールです。オープンソース・プロジェクトとしてDocker 社とコミュニティによって開発が進められています。

概要については、以前 SlideShare にアップロード(第11回クラウドごった煮コンテナ勉強会)した資料がありますので、こちらも併せてご覧ください。

具体的には下図のようなイメージです。「docker-machine」コマンドが、VirtualBoxだけでなく、Amazon Web Services や DigitalOcean など、リモート上のクラウドサービスと接続して、Docker がすぐに利用できる環境を作ります。

docker-machine-fig

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

書式は非常にシンプルです。

$ 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

 

One thought on “Docker Machine 0.3 の新機能、generic ドライバと scp を試す

  1. Pingback: Docker Machine公式サイトをナナメ読み写経しながら軽く体験 | ログってなんぼ