前書き
Docker Machineは、パーソナルコンピューターから複数のDockerホストをリモートで簡単にプロビジョニングおよび管理できるツールです。 そのようなサーバーは一般にDockerizedホストと呼ばれ、当然のことながらDockerコンテナーを実行するために使用できます。
Docker Machineはローカルシステムまたはリモートシステムにインストールできますが、最も一般的なアプローチは、ローカルコンピューター(ネイティブインストールまたは仮想マシン)にインストールし、それを使用してDockerizedリモートサーバーをプロビジョニングすることです。
Docker Machineは、ほとんどのLinuxディストリビューションとMac OS XおよびWindowsにインストールできますが、このチュートリアルでは、CentOS 7を実行しているローカルマシンにインストールし、Dockerized DigitalOcean Dropletsのプロビジョニングに使用します。
前提条件
このチュートリアルを実行するには、次のものが必要です。
-
DockerがインストールされたCentOS 7を実行しているローカルマシン。 (手順についてはHow To Install and Use Docker on CentOS 7を参照してください)
-
DigitalOcean APIトークン。 持っていない場合は、this guideを使用して生成します。 トークンを生成するときは、読み取り/書き込みスコープがあることを確認してください。 これがデフォルトであるため、生成中にオプションを変更しない場合、読み取り/書き込み機能があります。 また、コマンドラインで使いやすくするために、その記事で指定されているように、変数にトークンを割り当ててください。
[[step-1 -—- installing-docker-machine-on-your-local-computer]] ==ステップ1—ローカルコンピューターへのDockerマシンのインストール
このステップでは、CentOS 7を実行しているローカルコンピューターにDocker Machineをインストールするプロセスを実行します。
バイナリをダウンロードしてインストールするには、次を入力します。
wget https://github.com/docker/machine/releases/download/v0.14.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.14.0, build 89b8332
[[step-2 -—- installing-additional-docker-machine-scripts]] ==ステップ2—追加のDockerマシンスクリプトのインストール
Docker Machine GitHubリポジトリには、dockerおよびdocker-machineコマンドの使用を容易にするように設計された3つのbashスクリプトがあります。 コマンド補完とbashプロンプトのカスタマイズを提供します。
この手順では、ローカルマシンに3つのスクリプトをインストールします。 それらはダウンロードされ、/etc/bash_completion.dディレクトリにインストールされます。
最初のスクリプトにより、bashプロンプトでアクティブなマシンを確認できます。 これは、複数の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変数にカスタム値を設定する必要があります。 したがって、nanoを使用して開きます(PS1は、bashコマンドプロンプトを変更するために使用される特別なシェル変数です)。
nano ~/.bashrc
そのファイルの最後に次の行をコピーして貼り付けます。
~/.bashrc
export PS1='[\u@\h \W$(__docker_machine_ps1 " [%s]")]\$ '
この~/.bashrcファイルの変更により、マシンをアクティブ化すると、その名前がシェルプロンプトに挿入されます。
ファイルを保存して閉じます。
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コマンドのコマンド補完が機能するはずです。 動作しない場合は、bash-completionパッケージがインストールされていない可能性があります。 その場合は、次を使用してインストールします。
sudo yum install bash-completion
それで解決するはずです。
[[step-3 -—- provisioning-a-dockerized-host-using-docker-machine]] ==ステップ3—Dockerマシンを使用してDocker化されたホストをプロビジョニングする
ローカルマシンでDockerとDockerMachineを実行しているので、Docker Machineのdocker-machine createコマンドを使用して、DigitalOceanアカウントにDockerizedDropletをプロビジョニングできます。 まだ行っていない場合は、次を使用してDigitalOcean APIトークンをbash変数に割り当てます。
export shell-variable=your-api-token
DO APIトークンのbash変数としてのNOTE: This tutorial uses [.highlight]#DOTOKEN。 変数名はDOTOKENである必要はなく、すべて大文字である必要はありません。
#
変数を永続的にするには、変数を~/.bashrcファイルに入れます。 この手順はオプションですが、値をターミナルセッション間で保持したい場合に必要です。
nano ~/.bashrc
これに似た行をどこかに追加します。
~/.bashrcexport DOTOKEN=your-api-token
現在のターミナルセッションで変数をアクティブにするには、次のように入力します。
source ~/.bashrc
docker-machine createコマンドを正常に呼び出すには、(少なくとも)ドライバー、APIトークン(またはそれに評価される変数)、およびリモートホストの一意の名前を指定する必要があります。 最初のDockerizedホストを作成するには、次を入力します。
docker-machine create --driver digitalocean --digitalocean-access-token $DOTOKEN machine-name
ホストの作成中の部分的な出力は次のとおりです。 この出力では、ホストの名前はcentos-dockerです。
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 i up and running!
To see how to connect your Docker Client to the Docker Engine running on this virtual machine, run: docker-machine env centos-docker
docker-machineがリモートでアクセスできるように、新しいホスト用にSSHキーペアが作成されます。 ドロップレットは目的のオペレーティングシステムでプロビジョニングされ、Dockerがシステムにインストールされます。 コマンドが完了すると、Docker Dropletが稼働します。
コマンドラインから新しく作成されたホストを表示するには、次のように入力します。
docker-machine ls
出力は次のようになります。
OutputNAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
centos-docker - digitalocean Running tcp://203.0.113.71:2376 v18.05.0-ce
[[step-4 -—- specify-the-base-os-when-creating-a-dockerized-host]] ==ステップ4—Docker化されたホストを作成するときにベースOSを指定する
この手順では、--digitalocean-imageフラグを使用して作成されるDockerizedHostのベースOSとバージョンを指定する方法を示します。
たとえば、CentOS 7を使用してDockerizedホストを作成するには、次のように入力します。
docker-machine create --driver digitalocean --digitalocean-image centos-7-x64 --digitalocean-access-token $DOTOKEN machine-name
サーバーでDebian 8を実行したい場合はどうしますか? 次のコマンドを入力します。
docker-machine create --driver digitalocean --digitalocean-image debian-8-x64 --digitalocean-access-token $DOTOKEN machine-name
デフォルトでは、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を指定する必要があります。
docker-machine create --driver digitalocean --digitalocean-image ubuntu-18-04-x64 --digitalocean-access-token $DOTOKEN machine-name
選択できるのはベースオペレーティングシステムだけではありません。 ドロップレットのサイズを指定することもできます。 デフォルトでは、これは最小のドロップレットであり、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 machine-name
DigitalOceanドライバーを使用したDockerマシンの作成に固有のすべてのフラグを表示するには、次のように入力します。
docker-machine create --driver digitalocean -h
[.tip]#Tip: DigitalOceanダッシュボードのDropletページを更新すると、docker-machineコマンドを使用して作成した新しいホストが表示されます。
#
[[step-5 -—- executing-other-docker-machine-commands]] ==ステップ5—他のDockerマシンコマンドの実行
createサブコマンドを使用してDocker化されたホストをプロビジョニングする方法を見てきました。 また、lsサブコマンドを使用してDockerMachineで使用可能なホストを一覧表示する方法も確認しました。 このステップでは、他のいくつかのdocker-machineサブコマンドについて学習します。
Docker化されたホストに関する詳細情報を取得するには、次のようにinspectサブコマンドを使用します。
docker-machine inspect machine-name
出力には次のような行が含まれている必要があります。 Image行は、使用されているLinuxディストリビューションのバージョンを示しています。
Output{
"ConfigVersion": 3,
"Driver": {
"IPAddress": "203.0.113.71",
"MachineName": "centos-docker",
"SSHUser": "root",
"SSHPort": 22,
...
"Image": "centos-7-0-x64",
"Size": "s-1vcpu-1gb",
...
},
---
ホストの接続構成を印刷するには、次のように入力します。
docker-machine config machine-name
出力は次のようになります。
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 machine-name
リモートホストの電源を切る必要がある場合は、docker-machineを使用して停止できます。
docker-machine stop machine-name
停止していることを確認します。
docker-machine ls
ホストのステータスが変更されました:
OuputNAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
centos-docker digitalocean Timeout
再度開始するには:
docker-machine start machine-name
開始されたことを確認します。
docker-machine ls
これで、STATEがホストに対してRunningに設定されたことがわかります。
OuputNAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
centos-docker - digitalocean Running tcp://203.0.113.71:2376 v18.05.0-ce
最後に、ホストを削除する場合:
docker-machine rm machine-name
[[step-6 -—- executing-commands-on-a-dockerized-host-via-ssh]] ==ステップ6—SSH経由でDocker化されたホスト上でコマンドを実行する
この時点で、ホストに関する情報を取得していますが、それ以上のことができます。 たとえば、ローカルシステムのdocker-machineのsshサブコマンドを使用して、DockerホストでネイティブLinuxコマンドを実行できます。 このセクションでは、docker-machineを介してsshコマンドを実行する方法と、Docker化されたホストへのSSHセッションを開く方法について説明します。
オペレーティングシステムとしてCentOSを使用してホストをプロビジョニングした場合、ローカルシステムから次のコマンドを実行して、Dockerホスト上のパッケージを更新します。
docker-machine ssh machine-name yum update
リモートDockerホストが使用しているカーネルが不明ですか? 次を入力します。
docker-machine ssh machine-name uname -r
sshサブコマンドを使用してリモートDockerホストでコマンドを実行するだけでなく、これを使用してDocker化されたホスト自体にログインすることもできます。 入力するのは簡単です。
docker-machine ssh machine-name
コマンドプロンプトは、リモートホストにログインしているという事実を反映するように変更されます。
root@machine-name#
リモートホストを終了するには、次のように入力します。
exit
[[step-7 --- activating-a-dockerized-host]] ==ステップ7—Docker化されたホストのアクティブ化
Dockerホストをアクティブ化すると、ローカルのDockerクライアントがそのシステムに接続され、リモートシステムで通常のdockerコマンドを実行できるようになります。 Dockerホストをアクティブにするには、次のコマンドを入力します。
eval $(docker-machine env machine-name)
または、次のコマンドを使用してアクティブ化できます。
docker-machine use machine-name
[.tip]#Tip複数のDockerホストを操作する場合、docker-machine useコマンドが一方から他方に切り替える最も簡単な方法です。
#
上記のコマンドのいずれかを入力すると、bashプロンプトが変わり、DockerクライアントがリモートDockerホストを指していることを示す必要があります。 この形式を取ります。 ホストの名前はプロンプトの最後に表示されます。
username@localmachine:~ [machine-name]$
これで、このコマンドプロンプトで入力したdockerコマンドは、そのリモートホストで実行されます。
docker-machine lsコマンドが実行されている端末でホストがアクティブである場合、ACTIVE列の下のアスタリスクはそれがアクティブなホストであることを示します。
Output NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
centos-docker * digitalocean Running tcp://203.0.113.71:2376 v18.05.0-ce
[.note]#NOTE:ホストがアクティブな場合、使用している端末で入力したdockerコマンドはすべてリモートホストで実行されます。 ただし、通常のLinuxコマンドはすべてローカルコンピューターで実行されます。
#
リモート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 machine-name
このコマンドを実行して、そのマシンで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 ae513a47849c 3 weeks ago 109MB
ホスト上のアクティブまたは実行中のコンテナを一覧表示することもできます。
docker ps
このステップで実行したNginxコンテナーが唯一のアクティブなコンテナーである場合、出力は次のようになります。
OutputCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4284f9d25548 nginx "nginx -g 'daemon of…" 20 minutes ago Up 20 minutes 0.0.0.0:8080->80/tcp httpserver
リモートホストのプロンプトを終了するには、exitと入力します。 これにより、ターミナルも閉じられます。
exit
[.tip]#Tip:リモートホスト上にコンテナを作成する場合、Dockerクライアントmustはそれを指しています。つまり、それはあなたがいるターミナルのアクティブなホストである必要があります。を使用します。 それ以外の場合は、ローカルマシンでコンテナを作成します。 コマンドプロンプトをガイドにします。
#
[[ステップ-9 --- disabling-crash-reporting-optional]] ==ステップ9—クラッシュレポートの無効化(オプション)
デフォルトでは、Docker Machineを使用したDockerizedホストのプロビジョニングが失敗するか、Docker Machineがクラッシュするたびに、BugsnagのDockerアカウントに診断情報が自動的に送信されます。 これに慣れていない場合は、インストールの.docker/machineディレクトリの下にno-error-reportという空のファイルを作成して、レポートを無効にすることができます。
それを実現するには、単に次を入力します。
touch ~/.docker/machine/no-error-report
プロビジョニングが失敗した場合、またはDocker Machineがクラッシュした場合は、エラーメッセージのファイルを確認してください。
結論
これは、Docker Machineをインストールして使用し、1つのローカルシステムから複数のDocker Dropletをリモートでプロビジョニングする方法の概要です。 これで、DigitalOceanアカウントで必要な数のDockerizedホストを迅速にプロビジョニングできるようになります。
Docker Machineの詳細については、official documentation pageにアクセスしてください。 このチュートリアルでダウンロードされた3つのbashスクリプトは、this GitHub pageでホストされています。