前書き
Docker Machineは、パーソナルコンピューターからリモートで複数のDockerホストを簡単にプロビジョニングおよび管理できるようにするツールです。 このようなサーバーは一般にDocker化ホストと呼ばれ、Dockerコンテナーを実行するために使用されます。
Docker Machineはローカルシステムまたはリモートシステムにインストールできますが、最も一般的なアプローチは、ローカルコンピューター(ネイティブインストールまたは仮想マシン)にインストールし、それを使用してDockerizedリモートサーバーをプロビジョニングすることです。
Docker MachineはほとんどのLinuxディストリビューションとmacOSおよびWindowsにインストールできますが、このチュートリアルでは、Ubuntu 18.04を実行しているローカルマシンにインストールし、Dockerized DigitalOcean Dropletsのプロビジョニングに使用します。 ローカルのUbuntu 18.04マシンがない場合は、Ubuntu 18.04サーバーでこれらの指示に従うことができます。
前提条件
このチュートリアルを実行するには、次のものが必要です。
-
DockerがインストールされたUbuntu 18.04を実行しているローカルマシンまたはサーバー。 手順については、How To Install and Use Docker on Ubuntu 18.04を参照してください。
-
DigitalOcean APIトークン。 持っていない場合は、this guideを使用して生成します。 トークンを生成するときは、読み取り/書き込みスコープがあることを確認してください。 これがデフォルトであるため、生成中にオプションを変更しない場合は、読み取り/書き込み機能があります。
[[step-1 -—- installing-docker-machine]] ==ステップ1— DockerMachineのインストール
Docker Machineを使用するには、まずローカルにインストールする必要があります。 Ubuntuでは、これはGitHubの公式Dockerリポジトリから少数のスクリプトをダウンロードすることを意味します。
Docker Machineバイナリをダウンロードしてインストールするには、次を入力します。
wget https://github.com/docker/machine/releases/download/v0.15.0/docker-machine-$(uname -s)-$(uname -m)
ファイルの名前はdocker-machine-Linux-x86_64
である必要があります。 作業しやすくするために、名前をdocker-machine
に変更します。
mv docker-machine-Linux-x86_64 docker-machine
実行可能にします。
chmod +x docker-machine
システムコマンドとして使用できるように、/usr/local/bin
ディレクトリに移動またはコピーします。
sudo mv docker-machine /usr/local/bin
バージョンを確認すると、バージョンが正しくインストールされていることがわかります。
docker-machine version
次のような出力が表示され、バージョン番号とビルドが表示されます。
Outputdocker-machine version 0.15.0, build b48dc28d
Docker Machineがインストールされます。 Docker Machineを使いやすくするために、いくつかの追加のヘルパーツールをインストールしましょう。
[[step-2 -—- installing-additional-docker-machine-scripts]] ==ステップ2—追加のDockerマシンスクリプトのインストール
Docker Machine GitHubリポジトリには3つのBashスクリプトがあり、docker
およびdocker-machine
コマンドの操作を簡単にするためにインストールできます。 これらのスクリプトをインストールすると、コマンドの完了とプロンプトのカスタマイズが提供されます。
このステップでは、これら3つのスクリプトをDocker Machine GitHubリポジトリから直接ダウンロードして、ローカルマシンの/etc/bash_completion.d
ディレクトリにインストールします。
[.note]#Note:インターネットからシステム全体の場所にスクリプトをダウンロードしてインストールする前に、ブラウザでソースURLを表示して、まずスクリプトの内容を確認する必要があります。
#
最初のスクリプトでは、プロンプトでアクティブなマシンを見ることができます。 これは、複数のDocker化されたマシンで作業して切り替えているときに便利です。 スクリプトはdocker-machine-prompt.bash
と呼ばれます。 ダウンロードしてください
sudo wget https://raw.githubusercontent.com/docker/machine/master/contrib/completion/bash/docker-machine-prompt.bash -O /etc/bash_completion.d/docker-machine-prompt.bash
このファイルのインストールを完了するには、.bashrc
ファイルのPS1
変数の値を変更する必要があります。 PS1
変数は、Bashコマンドプロンプトを変更するために使用される特別なシェル変数です。 エディタで~/.bashrc
を開きます。
nano ~/.bashrc
そのファイル内には、PS1
で始まる3行があります。 これらは次のようになります。
~/.bashrc
PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
...
PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
...
PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h: \w\a\]$PS1"
次の例に示すように、各行の末尾近くに$(__docker_machine_ps1 " [%s]")
を挿入します。
~/.bashrc
PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]$(__docker_machine_ps1 " [%s]")\$ '
...
PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w$(__docker_machine_ps1 " [%s]")\$ '
...
PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h: \w\a\]$(__docker_machine_ps1 " [%s]")$PS1"
ファイルを保存して閉じます。
2番目のスクリプトはdocker-machine-wrapper.bash
と呼ばれます。 use
サブコマンドをdocker-machine
コマンドに追加し、Dockerホスト間の切り替えを大幅に容易にします。 ダウンロードするには、次を入力します。
sudo wget https://raw.githubusercontent.com/docker/machine/master/contrib/completion/bash/docker-machine-wrapper.bash -O /etc/bash_completion.d/docker-machine-wrapper.bash
3番目のスクリプトはdocker-machine.bash
と呼ばれます。 docker-machine
コマンドのbash補完を追加します。 次を使用してダウンロードします。
sudo wget https://raw.githubusercontent.com/docker/machine/master/contrib/completion/bash/docker-machine.bash -O /etc/bash_completion.d/docker-machine.bash
これまでに行った変更を適用するには、端末を閉じてから再度開きます。 SSH経由でマシンにログインしている場合は、セッションを終了して再度ログインすると、docker
コマンドとdocker-machine
コマンドのコマンドが完了します。
Docker Machineで新しいDockerホストを作成してテストしてみましょう。
[[step-3 -—- provisioning-a-dockerized-host-using-docker-machine]] ==ステップ3—Dockerマシンを使用してDocker化されたホストをプロビジョニングする
ローカルマシンでDockerとDockerMachineを実行しているので、Docker Machineのdocker-machine create
コマンドを使用して、DigitalOceanアカウントにDockerizedDropletをプロビジョニングできます。 まだ行っていない場合は、DigitalOcean APIトークンを環境変数に割り当てます。
export DOTOKEN=your-api-token
DO APIトークンのbash変数としてのNOTE: This tutorial uses [.highlight]#DOTOKEN。 変数名はDOTOKENである必要はなく、すべて大文字である必要はありません。
#
変数を永続的にするには、変数を~/.bashrc
ファイルに入れます。 この手順はオプションですが、シェルセッション間で値を保持したい場合に必要です。
そのファイルをnano
で開きます。
nano ~/.bashrc
この行をファイルに追加します。
~/.bashrc
export DOTOKEN=your-api-token
現在のターミナルセッションで変数をアクティブにするには、次のように入力します。
source ~/.bashrc
docker-machine create
コマンドを正常に呼び出すには、使用するdriverとマシン名を指定する必要があります。 ドライバーは、作成するインフラストラクチャのアダプターです。 クラウドインフラストラクチャプロバイダー用のドライバーと、さまざまな仮想化プラットフォーム用のドライバーがあります。
digitalocean
ドライバーを使用します。 選択したドライバーに応じて、マシンを作成するための追加オプションを提供する必要があります。 digitalocean
ドライバーには、作成するマシンの名前とともに、引数としてAPIトークン(またはそれに評価される変数)が必要です。
最初のマシンを作成するには、次のコマンドを入力して、docker-01
という名前のDigitalOceanドロップレットを作成します。
docker-machine create --driver digitalocean --digitalocean-access-token $DOTOKEN docker-01
Docker Machineがドロップレットを作成すると、次の出力が表示されます。
Output ...
Installing Docker...
Copying certs to the local machine directory...
Copying certs to the remote machine...
Setting Docker configuration on the remote daemon...
Checking connection to Docker...
Docker is up and running!
To see how to connect your Docker Client to the Docker Engine running on this virtual machine, run: docker-machine env ubuntu1804-docker
Docker Machineは、新しいホスト用のSSHキーペアを作成して、サーバーにリモートでアクセスできるようにします。 Dropletはオペレーティングシステムでプロビジョニングされ、Dockerがインストールされます。 コマンドが完了すると、Docker Dropletが稼働します。
コマンドラインから新しく作成されたマシンを表示するには、次のように入力します。
docker-machine ls
出力は次のようになり、新しいDockerホストが実行されていることを示します。
OutputNAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
docker-01 - digitalocean Running tcp://209.97.155.178:2376 v18.06.1-ce
次に、マシンを作成するときにオペレーティングシステムを指定する方法を見てみましょう。
[[step-4 -—- specifying-the-base-os-and-droplet-options-when-creating-a-dockerized-host]] ==ステップ4—Dockerizedホストを作成する際のベースOSとドロップレットオプションの指定
デフォルトでは、Docker MachineでDocker化されたホストを作成するときに使用される基本オペレーティングシステムは、最新のUbuntu LTSであるsupposedです。 ただし、本書の発行時点では、Ubuntu 18.04が最新のLTSエディションであるにもかかわらず、docker-machine create
コマンドは引き続きUbuntu 16.04LTSをベースオペレーティングシステムとして使用しています。 したがって、最近プロビジョニングされたマシンでUbuntu 18.04を実行する必要がある場合は、--digitalocean-image
フラグをdocker-machine create
コマンドに渡して、目的のバージョンとともにUbuntuを指定する必要があります。
たとえば、Ubuntu 18.04を使用してマシンを作成するには、次のように入力します。
docker-machine create --driver digitalocean --digitalocean-image ubuntu-18-04-x64 --digitalocean-access-token $DOTOKEN docker-ubuntu-1804
Ubuntuのバージョンに限定されません。 DigitalOceanでサポートされているオペレーティングシステムを使用してマシンを作成できます。 たとえば、Debian 8を使用してマシンを作成するには、次のように入力します。
docker-machine create --driver digitalocean --digitalocean-image debian-8-x64 --digitalocean-access-token $DOTOKEN docker-debian
CentOS 7をベースOSとして使用してDocker化されたホストをプロビジョニングするには、次のようにイメージ名としてcentos-7-0-x86
を指定します。
docker-machine create --driver digitalocean --digitalocean-image centos-7-0-x64 --digitalocean-access-token $DOTOKEN docker-centos7
選択できるのはベースオペレーティングシステムだけではありません。 ドロップレットのサイズを指定することもできます。 デフォルトでは、これは最小のドロップレットであり、1 GBのRAM、単一のCPU、および25 GBのSSDを備えています。
DigitalOcean API documentationで対応するスラッグを検索して、使用するドロップレットのサイズを見つけます。
たとえば、2 GBのRAM、2つのCPU、および60 GBのSSDを備えたマシンをプロビジョニングするには、スラッグs-2vcpu-2gb
を使用します。
docker-machine create --driver digitalocean --digitalocean-size s-2vcpu-2gb --digitalocean-access-token $DOTOKEN docker-03
DigitalOceanドライバーを使用したDockerマシンの作成に固有のすべてのフラグを表示するには、次のように入力します。
docker-machine create --driver digitalocean -h
[.tip]#Tip: DigitalOceanダッシュボードのDropletページを更新すると、docker-machine
コマンドを使用して作成した新しいマシンが表示されます。
#
次に、他のDocker Machineコマンドをいくつか見てみましょう。
[[step-5 -—- executing-additional-docker-machine-commands]] ==ステップ5—追加のDockerマシンコマンドの実行
create
サブコマンドを使用してDocker化されたホストをプロビジョニングする方法と、ls
サブコマンドを使用してDockerMachineで使用可能なホストを一覧表示する方法を見てきました。 この手順では、さらに便利なサブコマンドをいくつか学習します。
Docker化されたホストに関する詳細情報を取得するには、次のようにinspect
サブコマンドを使用します。
docker-machine inspect docker-01
出力には、次の出力のような行が含まれます。 Image
行は、使用されているLinuxディストリビューションのバージョンを示し、Size
行はサイズスラッグを示します。
Output...
{
"ConfigVersion": 3,
"Driver": {
"IPAddress": "203.0.113.71",
"MachineName": "docker-01",
"SSHUser": "root",
"SSHPort": 22,
...
"Image": "ubuntu-16-04-x64",
"Size": "s-1vcpu-1gb",
...
},
---
ホストの接続構成を印刷するには、次のように入力します。
docker-machine config docker-01
出力は次のようになります。
Output--tlsverify
--tlscacert="/home/kamit/.docker/machine/certs/ca.pem"
--tlscert="/home/kamit/.docker/machine/certs/cert.pem"
--tlskey="/home/kamit/.docker/machine/certs/key.pem"
-H=tcp://203.0.113.71:2376
docker-machine config
コマンドの出力の最後の行には、ホストのIPアドレスが表示されますが、次のように入力してその情報を取得することもできます。
docker-machine ip docker-01
リモートホストの電源を切る必要がある場合は、docker-machine
を使用して停止できます。
docker-machine stop docker-01
停止していることを確認します。
docker-machine ls
出力は、マシンのステータスが変更されたことを示しています。
OuputNAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
docker-01 - digitalocean Stopped Unknown
再開するには、start
サブコマンドを使用します。
docker-machine start docker-01
その後、ステータスを再度確認します。
docker-machine ls
これで、STATE
がホストに対してRunning
に設定されたことがわかります。
OuputNAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
docker-01 - digitalocean Running tcp://203.0.113.71:2376 v18.06.1-ce
次に、SSHを使用してリモートホストと対話する方法を見てみましょう。
[[step-6 -—- executing-commands-on-a-dockerized-host-via-ssh]] ==ステップ6—SSH経由でDocker化されたホスト上でコマンドを実行する
この時点で、マシンに関する情報を取得していますが、それ以上のことができます。 たとえば、ローカルシステムのdocker-machine
のssh
サブコマンドを使用して、DockerホストでネイティブLinuxコマンドを実行できます。 このセクションでは、docker-machine
を介してssh
コマンドを実行する方法と、Docker化されたホストへのSSHセッションを開く方法について説明します。
Ubuntuをオペレーティングシステムとしてマシンをプロビジョニングした場合、ローカルシステムから次のコマンドを実行して、Dockerホストのパッケージデータベースを更新します。
docker-machine ssh docker-01 apt-get update
以下を使用して利用可能なアップデートを適用することもできます。
docker-machine ssh docker-01 apt-get upgrade
リモートDockerホストが使用しているカーネルが不明ですか? 次を入力します。
docker-machine ssh docker-01 uname -r
最後に、docker machine ssh
コマンドを使用してリモートホストにログインできます。
docker-machine ssh docker-01
rootユーザーとしてログインすると、次のようなものが表示されます。
Welcome to Ubuntu 16.04.5 LTS (GNU/Linux 4.4.0-131-generic x86_64)
* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/advantage
Get cloud support with Ubuntu Advantage Cloud Guest:
http://www.ubuntu.com/business/services/cloud
14 packages can be updated.
10 updates are security updates.
exit
と入力してログアウトし、ローカルマシンに戻ります。
次に、リモートホストでDockerのコマンドを送信します。
[[step-7 --- activating-a-dockerized-host]] ==ステップ7—Docker化されたホストのアクティブ化
Dockerホストをアクティブ化すると、ローカルのDockerクライアントがそのシステムに接続され、リモートシステムで通常のdocker
コマンドを実行できるようになります。
まず、Docker Machineを使用して、Ubuntu 18.04を使用してdocker-ubuntu
という新しいDockerホストを作成します。
docker-machine create --driver digitalocean --digitalocean-image ubuntu-18-04-x64 --digitalocean-access-token $DOTOKEN docker-ubuntu
Dockerホストをアクティブにするには、次のコマンドを入力します。
eval $(docker-machine env machine-name)
または、次のコマンドを使用してアクティブ化できます。
docker-machine use machine-name
[.tip]#Tip複数のDockerホストを操作する場合、docker-machine use
コマンドが一方から他方に切り替える最も簡単な方法です。
#
これらのコマンドのいずれかを入力すると、プロンプトが変わり、DockerクライアントがリモートDockerホストを指していることを示します。 この形式を取ります。 ホストの名前はプロンプトの最後に表示されます。
username@localmachine:~ [docker-01]$
これで、このコマンドプロンプトで入力したdocker
コマンドは、そのリモートホストで実行されます。
docker-machine ls
を再度実行します。
docker-machine ls
docker-01
のACTIVE
列の下にアスタリスクが表示されます。
OutputNAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
docker-01 * digitalocean Running tcp://203.0.113.71:2376 v18.06.1-ce
リモートDockerホストを終了するには、次を入力します。
docker-machine use -u
プロンプトにアクティブなホストが表示されなくなります。
次に、リモートマシンでコンテナを作成します。
[[step-8 -—- creating-docker-containers-on-a-remote-dockerized-host]] ==ステップ8—リモートのDocker化されたホストでのDockerコンテナの作成
これまで、DigitalOceanアカウントでDockerized Dropletをプロビジョニングし、それをアクティブにしました。つまり、Dockerクライアントはそれを指し示しています。 次の論理ステップは、その上でコンテナーをスピンアップすることです。 例として、公式のNginxコンテナを実行してみましょう。
docker-machine use
を使用して、リモートマシンを選択します。
docker-machine use docker-01
このコマンドを実行して、そのマシンでNginxコンテナーを実行します。
docker run -d -p 8080:80 --name httpserver nginx
このコマンドでは、Nginxコンテナのポート80
をDockerizedホストのポート8080
にマッピングして、どこからでもデフォルトのNginxページにアクセスできるようにします。
コンテナがビルドされると、Webブラウザでhttp://docker_machine_ip:8080
を指定することで、デフォルトのNginxページにアクセスできるようになります。
Dockerホストがまだアクティブ化されている間(プロンプトで名前が表示されます)、そのホスト上のイメージを一覧表示できます。
docker images
出力には、使用したばかりのNginxイメージが含まれています。
OutputREPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 71c43202b8ac 3 hours ago 109MB
ホスト上のアクティブまたは実行中のコンテナを一覧表示することもできます。
docker ps
このステップで実行したNginxコンテナーが唯一のアクティブなコンテナーである場合、出力は次のようになります。
OutputCONTAINER ID IMAGE COMMAND CREATED STATUS
PORTS NAMES
d3064c237372 nginx "nginx -g 'daemon of…" About a minute ago Up About a minute
0.0.0.0:8080->80/tcp httpserver
リモートマシン上にコンテナを作成する場合、Dockerクライアントはそれを指している必要があります。つまり、使用しているターミナルのアクティブマシンでなければなりません。 それ以外の場合は、ローカルマシンでコンテナを作成します。 繰り返しになりますが、コマンドプロンプトをガイドにしてください。
Docker Machineはリモートホストを作成および管理でき、それらを削除することもできます。
[[step-9 -–- removing-docker-hosts]] ==ステップ9–Dockerホストの削除
Docker Machineを使用して、作成したDockerホストを削除できます。 docker-machine rm
コマンドを使用して、作成したdocker-01
ホストを削除します。
docker-machine rm docker-01
ドロップレットは、作成されたSSHキーとともに削除されます。 ホストを再度リストします。
docker-machine ls
今回は、出力にdocker-01
ホストが表示されません。 また、ホストを1つしか作成していない場合、出力はまったく表示されません。
必ずコマンドdocker-machine use -u
を実行して、ローカルDockerデーモンがローカルマシンに戻るようにしてください。
[[ステップ-10 --- disabling-crash-reporting-optional]] ==ステップ10—クラッシュレポートの無効化(オプション)
デフォルトでは、Docker Machineを使用してDocker化されたホストをプロビジョニングする試みが失敗した場合、またはDocker Machineがクラッシュした場合は常に、一部の診断情報がBugsnagのDockerアカウントに送信されます。 これに慣れていない場合は、ローカルコンピュータの.docker/machine
ディレクトリにno-error-report
という名前の空のファイルを作成して、レポートを無効にすることができます。
ファイルを作成するには、次を入力します。
touch ~/.docker/machine/no-error-report
プロビジョニングが失敗した場合、またはDocker Machineがクラッシュした場合は、エラーメッセージのファイルを確認してください。
結論
Docker Machineをインストールし、それを使用して、ローカルシステムからリモートでDigitalOceanに複数のDockerホストをプロビジョニングしました。 ここから、DigitalOceanアカウントに必要な数のDockerizedホストをプロビジョニングできるようになります。
Docker Machineの詳細については、official documentation pageにアクセスしてください。 このチュートリアルでダウンロードされた3つのBashスクリプトは、this GitHub pageでホストされています。