Ubuntu 16.04でDockerマシンを使用してリモートDockerホストをプロビジョニングおよび管理する方法

前書き

Docker Machineは、パーソナルコンピューターから複数のDockerホストをリモートで簡単にプロビジョニングおよび管理できるツールです。 そのようなサーバーは一般にDockerizedホストと呼ばれ、当然のことながらDockerコンテナーを実行するために使用できます。

Docker Machineはローカルシステムまたはリモートシステムにインストールできますが、最も一般的なアプローチは、ローカルコンピューター(ネイティブインストールまたは仮想マシン)にインストールし、それを使用してDockerizedリモートサーバーをプロビジョニングすることです。

Docker Machineは、ほとんどのLinuxディストリビューションとMac OS XおよびWindowsにインストールできますが、このチュートリアルでは、Ubuntu 16.04を実行しているローカルマシンにインストールし、Dockerized DigitalOcean Dropletsのプロビジョニングに使用します。

前提条件

このチュートリアルを実行するには、次のものが必要です。

  • DockerがインストールされたUbuntu16.04を実行しているローカルマシン(手順についてはHow To Install and Use Docker on Ubuntu 16.04を参照)

  • DigitalOcean APIトークン。 持っていない場合は、this guideを使用して生成します。 トークンを生成するときは、読み取り/書き込みスコープがあることを確認してください。 これがデフォルトであるため、生成中にオプションを変更しない場合、読み取り/書き込み機能があります。 コマンドラインで使いやすくするために、その記事で与えられているように変数にトークンを割り当ててください。

[[step-1 -—- installing-docker-machine-on-your-local-computer]] ==ステップ1—ローカルコンピューターへのDockerマシンのインストール

このステップでは、Ubuntu 16.04を実行しているローカルコンピューターにDocker Machineをインストールするプロセスを実行します。

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

そのファイル内には、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と呼ばれます。 docker-machineコマンドにuseサブコマンドが追加され、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コマンドのコマンド補完が機能するはずです。

[[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 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コマンドを正常に呼び出すには、(少なくとも)ドライバー、APIトークン(またはそれに評価される変数)、およびマシンの一意の名前を指定する必要があります。 最初のマシンを作成するには、次を入力します。

docker-machine create --driver digitalocean --digitalocean-access-token $DOTOKEN machine-name

マシンの作成中の部分的な出力は次のとおりです。 この出力では、マシンの名前はubuntu1604-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 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 ubuntu1604-docker

docker-machineがリモートでアクセスできるように、新しいホスト用にSSHキーペアが作成されます。 ドロップレットは目的のオペレーティングシステムでプロビジョニングされ、Dockerがシステムにインストールされます。 コマンドが完了すると、Docker Dropletが稼働します。

コマンドラインから新しく作成されたマシンを表示するには、次のように入力します。

docker-machine ls

出力は次のようになります。

OutputNAME               ACTIVE      DRIVER         STATE     URL                         SWARM   DOCKER    ERRORS
ubuntu1604-docker    -        digitalocean   Running   tcp://203.0.113.71:2376            v18.05.0-ce

[[step-4 -—- specifying-the-base-os-when-creating-a-dockerized-host]] ==ステップ4—Docker化されたホストを作成するときにベース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 machine-name

Ubuntuのバージョンに限定されません。 DigitalOceanでサポートされているオペレーティングシステムを使用してマシンを作成できます。 たとえば、Debian 8を使用してマシンを作成するには、次のように入力します。

docker-machine create --driver digitalocean --digitalocean-image debian-8-x64 --digitalocean-access-token $DOTOKEN machine-name

CentOS 7をベースOSとして使用してDocker化されたホストをプロビジョニングするには、次のようにイメージ名としてcentos-7-0-x86を指定します。

docker-machine create --driver digitalocean --digitalocean-image centos-7-0-x64 --digitalocean-access-token $DOTOKEN centos7-docker

選択できるのはベースオペレーティングシステムだけではありません。 ドロップレットのサイズを指定することもできます。 デフォルトでは、これは最小のドロップレットであり、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-additional-docker-machine-commands]] ==ステップ5—追加のDockerマシンコマンドの実行

createサブコマンドを使用してDocker化されたホストをプロビジョニングする方法を見てきました。 また、lsサブコマンドを使用してDockerMachineで使用可能なホストを一覧表示する方法も確認しました。 このステップでは、さらにいくつかのdocker-machineサブコマンドを学習します。

Docker化されたホストに関する詳細情報を取得するには、次のようにinspectサブコマンドを使用します。

docker-machine inspect machine-name

出力には次のような行が含まれている必要があります。 Image行は、使用されているLinuxディストリビューションのバージョンを示し、size行はサイズスラッグを示します。

Output...
{
    "ConfigVersion": 3,
    "Driver": {
        "IPAddress": "203.0.113.71",
        "MachineName": "ubuntu1604-docker",
        "SSHUser": "root",
        "SSHPort": 22,
        ...
        "Image": "ubuntu-16-04-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
ubuntu1604-docker                  digitalocean   Timeout

再度開始するには:

docker-machine start machine-name

開始されたことを確認します。

docker-machine ls

これで、STATEがホストに対してRunningに設定されたことがわかります。

OuputNAME                 ACTIVE   DRIVER         STATE     URL                        SWARM   DOCKER    ERRORS

ubuntu1604-docker         -        digitalocean   Running   tcp://203.0.113.71:2376           v18.05.0-ce

その後、次を使用して削除できます。

docker-machine rm machine-name

ドロップレットは、docker-machine.によって作成されたSSHキーとともに削除されます。これで、Docker化されたホストを一覧表示すると、削除したばかりのホストは表示されません。

docker-machine ls

[[step-6 -—- executing-commands-on-a-dockerized-host-via-ssh]] ==ステップ6—SSH経由でDocker化されたホスト上でコマンドを実行する

この時点で、マシンに関する情報を取得していますが、それ以上のことができます。 たとえば、ローカルシステムのdocker-machinesshサブコマンドを使用して、DockerホストでネイティブLinuxコマンドを実行できます。 このセクションでは、docker-machineを介してsshコマンドを実行する方法と、Docker化されたホストへのSSHセッションを開く方法について説明します。

Ubuntuをオペレーティングシステムとしてマシンをプロビジョニングした場合、ローカルシステムから次のコマンドを実行して、Dockerホストのパッケージデータベースを更新します。

docker-machine ssh machine-name apt-get update

以下を使用して利用可能なアップデートを適用することもできます。

docker-machine ssh machine-name apt-get upgrade

リモートDockerホストが使用しているカーネルが不明ですか? 次を入力します。

docker-machine ssh machine-name uname -r

sshサブコマンドを使用してリモートDockerホストでコマンドを実行するだけでなく、それを使用してマシン自体にログインすることもできます。 入力するのと同じくらい簡単です:

docker-machine ssh machine-name

コマンドプロンプトは、リモートホストにログインしているという事実を反映するように変更されます。

Outputroot@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列の下のアスタリスクはそれがアクティブなホストであることを示します。

OutputNAME                ACTIVE          DRIVER         STATE     URL                         SWARM   DOCKER    ERRORS
ubuntu1604-docker   *        digitalocean   Running   tcp://203.0.113.71:2376             v18.05.0-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 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

[.note]#Note:リモートマシンでコンテナを作成する場合は、Dockerクライアントがそれを指している必要があります。つまり、使用しているターミナルでアクティブなマシンである必要があります。 それ以外の場合は、ローカルマシンでコンテナを作成します。 繰り返しますが、コマンドプロンプトをガイドにします。

[[ステップ-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