CentOS 7上のDockerマシンでリモートDockerホストをプロビジョニングおよび管理する方法

前書き

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-machinesshサブコマンドを使用して、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でホストされています。

Related