CentOS7のDockerマシンでリモートDockerホストをプロビジョニングおよび管理する方法
序章
Docker Machineは、パーソナルコンピューターからリモートで複数のDockerホストを簡単にプロビジョニングおよび管理できるようにするツールです。 このようなサーバーは一般にDocker化されたホストと呼ばれ、当然のことながら、Dockerコンテナーを実行するために使用できます。
Docker Machineはローカルシステムまたはリモートシステムにインストールできますが、最も一般的なアプローチは、ローカルコンピューター(ネイティブインストールまたは仮想マシン)にインストールし、Docker化されたリモートサーバーをプロビジョニングするために使用することです。
DockerMachineはほとんどのLinuxディストリビューションとMacOSXおよびWindowsにインストールできますが、このチュートリアルでは、CentOS 7を実行しているローカルマシンにインストールし、Docker化されたDigitalOceanドロップレットをプロビジョニングするために使用します。
前提条件
このチュートリアルに従うには、次のものが必要です。
- DockerがインストールされたCentOS7を実行しているローカルマシン。 (手順については、 CentOS 7 にDockerをインストールして使用する方法を参照してください)
- DigitalOceanAPIトークン。 お持ちでない場合は、このガイドを使用して生成してください。 トークンを生成するときは、そのトークンに読み取り/書き込みスコープがあることを確認してください。 これがデフォルトであるため、生成中にオプションを変更しない場合は、読み取り/書き込み機能があります。 また、コマンドラインで使いやすくするために、その記事に記載されているように、必ずトークンを変数に割り当ててください。
ステップ1—ローカルコンピューターへのDockerマシンのインストール
このステップでは、CentOS7を実行しているローカルコンピューターにDockerMachineをインストールするプロセスを実行します。
バイナリをダウンロードしてインストールするには、次のように入力します。
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
ステップ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
それはそれを修正する必要があります。
ステップ3—Dockerマシンを使用してDocker化されたホストをプロビジョニングする
ローカルマシンでDockerとDockerMachineを実行しているので、DockerMachineのdocker-machine create
コマンドを使用して、DigitalOceanアカウントにDockerizedDropletをプロビジョニングできます。 まだ行っていない場合は、次を使用してDigitalOceanAPIトークンをbash変数に割り当てます。
export shell-variable=your-api-token
注:このチュートリアルでは、DOAPIトークンのbash変数としてDOTOKENを使用します。 変数名はDOTOKENである必要はなく、すべて大文字である必要はありません。
変数を永続的にするには、~/.bashrc
ファイルに入れます。 この手順はオプションですが、ターミナルセッション間で値を維持する場合に必要です。
nano ~/.bashrc
これに似た行をどこかに追加します。
~/.bashrcexport DOTOKEN=your-api-token
現在のターミナルセッションで変数をアクティブ化するには、次のように入力します。
source ~/.bashrc
docker-machine create
コマンドを正常に呼び出すには、(少なくとも)ドライバー、APIトークン(またはそれに評価される変数)、およびリモートホストの一意の名前を指定する必要があります。 最初のDocker化されたホストを作成するには、次のように入力します。
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がシステムにインストールされます。 コマンドが完了すると、DockerDropletが起動して実行されます。
コマンドラインから新しく作成されたホストを表示するには、次のように入力します。
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
ステップ4—Docker化されたホストを作成するときにベースOSを指定する
この手順では、--digitalocean-image
フラグを使用して作成されるDockerizedHostのベースOSとバージョンを指定する方法を示します。
たとえば、CentOS 7を使用してDocker化されたホストを作成するには、次のように入力します。
docker-machine create --driver digitalocean --digitalocean-image centos-7-x64 --digitalocean-access-token $DOTOKEN machine-name
サーバーでDebian8を実行したい場合はどうなりますか? 次のコマンドを入力します。
docker-machine create --driver digitalocean --digitalocean-image debian-8-x64 --digitalocean-access-token $DOTOKEN machine-name
デフォルトでは、Docker Machineを使用してDockerizedホストを作成するときに使用される基本オペレーティングシステムは、想定が最新バージョン(またはUbuntuの場合は最新のLTSバージョン)です。 ただし、この公開の時点では、Ubuntu 18.04が最新のLTSエディションであるにもかかわらず、docker-machine create
コマンドは引き続きUbuntu16.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、1つのCPU、および25GBのSSDを備えています。
DigitalOcean APIドキュメントで対応するスラッグを検索して、使用するドロップレットのサイズを見つけます。
たとえば、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
ヒント: DigitalOceanダッシュボードのドロップレットページを更新すると、docker-machine
コマンドを使用して作成した新しいホストが表示されます。
ステップ5—他のDockerマシンコマンドの実行
create
サブコマンドを使用してDockerizedホストをプロビジョニングする方法を見てきました。 また、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
ステップ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-machine ssh machine-name
コマンドプロンプトは、リモートホストにログインしているという事実を反映して変化します。
root@machine-name#
リモートホストを終了するには、次のように入力します。
exit
ステップ7—Docker化されたホストのアクティブ化
Dockerホストをアクティブ化すると、ローカルのDockerクライアントがそのシステムに接続され、リモートシステムで通常のdocker
コマンドを実行できるようになります。 Dockerホストをアクティブ化するには、次のコマンドを入力します。
eval $(docker-machine env machine-name)
または、次のコマンドを使用してアクティブ化することもできます。
docker-machine use machine-name
ヒント複数の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
注:ホストがアクティブな場合、使用している端末で入力したdocker
コマンドはすべて、リモートホストで実行されます。 ただし、通常のLinuxコマンドはすべてローカルコンピューターで実行されます。
リモートDockerホストを終了するには、次のように入力します。
docker-machine use -u
ローカルシステムのプロンプトに戻ります。
次に、リモートマシンでコンテナを作成しましょう。
ステップ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
ヒント:リモートホスト上にコンテナを作成する場合は、Dockerクライアントがそれを指している必要があります。つまり、現在のターミナルでアクティブなホストである必要があります。を使用します。 それ以外の場合は、ローカルマシンでコンテナを作成します。 コマンドプロンプトをガイドにします。
手順9—クラッシュレポートの無効化(オプション)
デフォルトでは、Docker Machineを使用してDocker化されたホストをプロビジョニングしようとして失敗した場合、またはDocker Machineがクラッシュした場合、一部の診断情報がBugsnagのDockerアカウントに自動的に送信されます。 これに慣れていない場合は、インストールの.docker/machine
ディレクトリの下にno-error-report
という空のファイルを作成して、レポートを無効にすることができます。
これを行うには、次のように入力します。
touch ~/.docker/machine/no-error-report
プロビジョニングが失敗した場合、またはDocker Machineがクラッシュした場合は、ファイルでエラーメッセージを確認してください。
結論
これは、Docker Machineをインストールして使用し、1つのローカルシステムから複数のDockerドロップレットをリモートでプロビジョニングするための概要です。 これで、DigitalOceanアカウントに必要な数のDocker化されたホストをすばやくプロビジョニングできるようになります。
Docker Machinesの詳細については、公式ドキュメントページにアクセスしてください。 このチュートリアルでダウンロードされた3つのbashスクリプトは、このGitHubページでホストされています。