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

提供:Dev Guides
移動先:案内検索

序章

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

これで、ホストのSTATERunningに設定されていることがわかります。

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-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-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ページでホストされています。