GNU/Linux >> Linux の 問題 >  >> Linux

docker-machine 汎用 SSH ドライバーを使用してリモート VM を作成する方法

Docker を使用すると、エンタープライズ アプリケーションを 1 つの自己完結型コンテナーにパッケージ化できます。環境。

これにより、開発者とシステム管理者の両方がアプリケーションを簡単に管理できます。あなたが管理者であれば、もう開発者からのこの言い訳を聞く必要はありません:「でも、私の開発環境では動作します!」リモートサーバー。 Docker がインストールされると、ローカル マシン (ラップトップ) から、Docker をリモートで管理できます。

このチュートリアルでは、SSH クライアントを使用してリモート Docker ホストを管理する docker-machine で使用される Generic ドライバーについて具体的に説明します。

1.リモートホストに dockeradmin ユーザーを作成

まず、リモート サーバーで Linux ユーザー アカウントを作成します。ユーザー名として「dockeradmin」を使用する必要はありません。何でもかまいません。独自のユーザー名を使用することもできます。

adduser dockeradmin

passwd dockeradmin

2.ローカル ホストで SSH 公開鍵と秘密鍵のペアを生成

次に、ローカル ホスト (ラップトップ) で、ssh-keygen を使用して公開および秘密 SSH キーを作成します。また、秘密鍵をリモート サーバーにコピーする必要があります。

この記事でこれを行う方法を説明しました:パスワードなしでリモート SSH ログインを実行する

ただし、要するに、これを行うために必要なことは次のとおりです。

ssh-keygen

ssh-copy-id dockeradmin@remote-server

注:ssh-keygen の間は、パスフレーズを指定しないでください。空のままにしてください。

3. dockeradmin に Sudo アクセスを許可

リモート サーバーの /etc/sudoers ファイルに次の行を追加します。これにより、完全な sudo 権限が dockeradmin アカウントに付与されます。これは、dockeradmin アカウントが任意の root コマンドを実行できることを意味します。

# visudo
dockeradmin     ALL=(ALL) NOPASSWD: ALL

注:visudo コマンドは /ec/sudoers ファイルを変更します。 「vi /etc/sudoers」を使用する必要はありません。

4.リモート サーバーへの外部アクセスを許可

リモートサーバーがインターネットと通信できることを確認してください。 docker-machine コマンドはいくつかの yum コマンドを呼び出して特定の必要なパッケージをインストールするため、これは必須です。

したがって、テスト目的のためだけに、以下がサーバーで機能することを確認してください。

ping google.com

適切なネームサーバーのセットアップがない場合は、/etc/resolve.conf を変更して次の行を追加します。または、システム管理者から提供されたネームサーバーのいずれかを使用してください。

# vi /etc/resolv.conf
nameserver 4.2.2.2

5. docker-machine 汎用ドライバー コマンド構文

Generic ドライバーを使用している場合、docker-machine create コマンドで次のオプションを使用できます。

次の docker-machine 構文は、すべての必須オプションを示しています:

docker-machine create -d generic --generic-ip-address {ip-address} {docker-vm-name}

上記の構文では:

  • docker-machine がコマンドです
  • create オプションは、リモートの docker-vm ホストを作成するよう docker-machine に指示します
  • -d オプションは、使用するドライバの種類を指定するものです。ここでは、SSH クライアントを使用してリモート ホストに接続する「汎用」ドライバーを使用しています
  • –generic-ip-address は、docker-vm ホストを作成するリモート IP アドレスを指定します。
  • docker-vm-name は、docker-machine コマンドによって作成されるリモート docker-vm に付ける名前です。これは何でもかまいません。

次の docker-machine 構文は、利用可能なすべてのオプションを示しています:

docker-machine create -d generic --generic-ip-address {ip-address} --generic-ssh-key {private-key} --generic-ssh-user {username} --generic-ssh-port {ssh-port} {docker-vm-name}

上記の構文では:

  • –generic-ssh-key これはオプションです。これを指定しないと、ローカル システムで実行されている ssh-agent と通信します。ローカル システム (ラップトップ) で ssh-agent を実行していない場合は、このオプションを使用して、ローカル システム上の秘密鍵の場所を指定します。
  • –generic-ssh-user これはオプションです。デフォルトでは、root を使用します。ただし、ほとんどの場合、これを実行したくない場合があります。そのため、リモート ホストへの接続中に docker-machine が使用するユーザー名を指定してください。
  • –generic-ssh-port これは、リモート サーバーの SSH ポートです。デフォルトでは 22 です。
  • その他のオプションは上記の構文で説明されています

6.リモート Docker VM ホストを作成する

ここで、docker-machine create コマンドを使用してリモート docker-vm ホストを作成します。

docker-machine create -d generic --generic-ip-address 192.168.100.2 --generic-ssh-key $HOME/.ssh/id_rsa --generic-ssh-user dockeradmin --generic-ssh-port 22 dev-db

以下は上記と同じコマンドですが、読みやすくするために複数行に分けています。

docker-machine create -d generic \
  --generic-ip-address 192.168.100.2 \ 
  --generic-ssh-key $HOME/.ssh/id_rsa \
  --generic-ssh-user dockeradmin \
  --generic-ssh-port 22 \
  dev-db

上記のコマンドで:

  • 上記の構文セクションですべてのオプションについて説明しました。
  • 192.168.100.2 は、docker-vm ホストを作成するリモート ホストの IP アドレスです。
  • $HOME/.ssh/id_rsa は、ローカル システム (ラップトップ) にある秘密鍵です
  • dockeradmin は、リモート ホスト上の Linux ユーザー名の名前です
  • dev-db は、リモート ホスト上に作成する docker-vm ホストに付けた名前です。これは何でもかまいません。

注:繰り返しますが、ローカル システムで上記の docker-machine コマンドを実行します。 Docker Toolbox に付属の docker-machine コマンドを使用できます。

7.成功した docker-machine create 出力

すべてが正常に機能していれば、docker-machine create コマンドから次の出力が表示されます。

$ docker-machine create -d generic --generic-ip-address 192.168.100.2 --generic-ssh-key $HOME/.ssh/id_rsa --generic-ssh-user dockeradmin --generic-ssh-port 22 dev-db
Running pre-create checks...
Creating machine...
(dev-db) Importing SSH key...
Waiting for machine to be running, this may take a few minutes...
Machine is running, waiting for SSH to be available...
Detecting operating system of created instance...
Detecting the provisioner...
Provisioning with centos...
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 Docker to this machine, run: C:\Program Files\Docker Toolbox\docker-machine.exe env dev-db

最後に、すべてが正常に機能していれば、作成したリモート docker vm ホストが表示されます。ローカル システムで、次を実行します。

$ docker-machine ls
NAME     ACTIVE   DRIVER       STATE     URL  SWARM  DOCKER    ERRORS
default  *        virtualbox   Running   tcp://192.168.100.10:2376
dev-db   -        generic      Running   tcp://192.168.100.11:2376

注:ほとんどの場合、何も計画どおりに進まず、エラー メッセージが表示される場合があります。以下は、私が直面した典型的な問題とその解決策です。

8.エラー 1:OS が無効です

現在のバージョンの docker-machine は、リモート サーバー上の特定のバージョンの OS のみをサポートしています。

たとえば、リモート サーバーが CentOS 6 で実行されている場合、「/etc/os-release:No such file or directory」というエラー メッセージが表示されます。これは、CentOS の場合、CentOS 7 を探しているためです。

$ docker-machine create -d generic --generic-ip-address 192.168.100.2 --generic-ssh-key $HOME/.ssh/id_rsa --generic-ssh-user dockeradmin --generic-ssh-port 22 dev-db
Running pre-create checks...
Creating machine...
Waiting for machine to be running, this may take a few minutes...
(dev-db) Importing SSH key...
Machine is running, waiting for SSH to be available...
Detecting operating system of created instance...
Detecting the provisioner...
Error creating machine: Error detecting OS: Error getting SSH command: Something
 went wrong running an SSH command!
command : cat /etc/os-release
err     : exit status 1
output  : cat: /etc/os-release: No such file or directory

9.エラー 2:root コマンドを実行できません (Sudo アクセスなし)

「Error creating machine:Error running provisioning:exit status 1」というエラー メッセージが表示され、「Provisioning with centos…」行の後に表示される場合は、接続の問題ではありません。 docker-machine はリモート サーバーに正しく接続できました。

ただし、この場合、root コマンドを dockeradmin ユーザーとして実行することはできません。そのため、visudo を使用して、前のステップの 1 つで説明したように、dockeradmin ユーザーに完全な sudo アクセスを許可してください。

$ docker-machine create -d generic --generic-ip-address 192.168.100.2 --generic-ssh-key $HOME/.ssh/id_rsa --generic-ssh-user dockeradmin --generic-ssh-port 22 dev-db
Running pre-create checks...
Creating machine...
(dev-db) Importing SSH key...
Waiting for machine to be running, this may take a few minutes...
Machine is running, waiting for SSH to be available...
Detecting operating system of created instance...
Detecting the provisioner...
Provisioning with centos...
Error creating machine: Error running provisioning: exit status 1

10.エラー 3:netstat コマンドが見つかりません

「Setting Docker configuration on the remote daemon…」行の後に「Error running SSH command:exit status 127」というエラー メッセージが表示される場合、これも接続の問題ではありません。

この場合、docker-machine はリモート SSH に接続されており、root コマンドを実行するための適切な sudo アクセス権がありますが、「netstat」コマンドがないため、試みているコマンドの一部が失敗しました。

$ docker-machine create -d generic --generic-ip-address 192.168.100.2 --generic-ssh-key $HOME/.ssh/id_rsa --generic-ssh-user dockeradmin --generic-ssh-port 22 dev-db
Running pre-create checks...
Creating machine...
(dev-db) Importing SSH key...
Waiting for machine to be running, this may take a few minutes...
Machine is running, waiting for SSH to be available...
Detecting operating system of created instance...
Detecting the provisioner...
Provisioning with centos...
Copying certs to the local machine directory...
Copying certs to the remote machine...
Setting Docker configuration on the remote daemon...
Error running SSH command: exit status 127
Error running SSH command: exit status 127
...
Error running SSH command: exit status 127
Error creating machine: Error running provisioning: Unable to verify the Docker
daemon is listening: Maximum number of retries (10) exceeded

この問題を解決するには、「netstat」コマンドを含む net-tools パッケージをリモート サーバーにインストールします。

yum install net-tools

docker-machine の次のバージョンでは、最初に「netstat」がリモート サーバーに存在するかどうかを確認し、適切な有効なエラー メッセージを表示することを期待しています。

11.エラー 4:Docker クライアントのバージョンが一致しません

次の「Error creating machine:Error running provisioning:exit status 1」というエラー メッセージが表示される場合は、ローカル システム (ラップトップ) の Docker クライアントがリモート システムの Docker クライアントと一致していない可能性があります。 /P>

$ docker-machine create -d generic --generic-ip-address 192.168.100.2 --generic-ssh-key $HOME/.ssh/id_rsa --generic-ssh-user dockeradmin --generic-ssh-port 22 dev-db
Running pre-create checks...
Creating machine...
(dev-db) Importing SSH key...
Waiting for machine to be running, this may take a few minutes...
Machine is running, waiting for SSH to be available...
Detecting operating system of created instance...
Detecting the provisioner...
Provisioning with centos...
Error creating machine: Error running provisioning: exit status 1

たとえば、ローカル システムの場合:

$ docker version
Client:
 Version:      1.9.1

リモート サーバー上:

# docker version
Client:
 Version:      1.8.2

上記の例では、ローカル Docker バージョンは 1.9.1 ですが、リモート Docker バージョンは古い 1.8.2 です。したがって、ここでは不一致があり、docker-machine create は機能せず、上記のように失敗します。

上記のシナリオでは、docker エンジンはリモート サーバーに個別にインストールされました。リモート サーバーには、ローカル システムの docker-machine (docker ツールボックス) に付属の docker クライアント バージョンとは異なる docker クライアント バージョンがありました。

したがって、この場合は、以下に示すように、リモート システムから Docker を削除してください。

# rpm -qa | grep docker
docker-selinux-1.8.2-10.el7.centos.x86_64
docker-1.8.2-10.el7.centos.x86_64

# rpm -ev docker-selinux
Preparing packages...
docker-selinux-1.8.2-10.el7.centos.x86_64

# rpm -ev docker
Preparing packages...
docker-1.8.2-10.el7.centos.x86_64

これで、ローカル システムで docker-machine コマンドを実行すると、ローカル マシン上の docker クライアントと互換性のあるリモート サーバーに、適切な docker エンジンと docker クライアントが自動的にインストールされます。

12.エラー 5:SELinux またはファイアウォールがアクセスをブロックしています

デフォルトでは、作成した新しい docker vm マシンは TCP ポート 2376 で実行されます。

リモート サーバーで、TCP ポート 2376 を許可する適切なファイアウォール ルールがあることを確認してください。それでも問題が解決しない場合は、firewalld がアクセスをブロックする可能性を一時的に除外するために、firewalld を停止して、何が起こるかを確認してください。

systemctl stop firewalld

繰り返しますが、デバッグ目的で、何らかの理由でファイアウォールを無効にしたい場合は、以下に示すように行うことができます:

systemctl disable firewalld

Docker の最新バージョンは、SELinux で問題なく動作します。ただし、docker の以前のバージョンでは、docker と SELinux に関連するいくつかのバグがありました。

そのため、問題が発生した場合は、SELinux を一時的に無効にして、問題が解決するかどうかを確認してください。 SELinux を永続的に無効にするには、それに応じて /etc/selinux/config ファイルを変更してください。

setenforce Permissive

getenforce

また、ローカル システムからリモート サーバーに SSH で接続できない場合、docker-machine は次の「SSH 待機中のエラー:SSH 待機中の再試行回数が多すぎます」というエラー メッセージを表示することに注意してください。これを修正するには、上記の手順のいずれかで説明したように、SSH パスワードレス認証を実装してください。

$ docker-machine create -d generic --generic-ip-address 192.168.100.2 --generic-ssh-key $HOME/.ssh/id_rsa --generic-ssh-user dockeradmin --generic-ssh-port 22 dev-db
Running pre-create checks...
Creating machine...
Waiting for machine to be running, this may take a few minutes...
Machine is running, waiting for SSH to be available...
Error creating machine: Error waiting for SSH: Too many retries waiting for SSH
to be available.  Last error: Maximum number of retries (60) exceeded

上記の問題がすべて修正されると、docker-machine は以下に示すように問題なく動作します。

$ docker-machine create -d generic --generic-ip-address 192.168.100.2 --generic-ssh-key $HOME/.ssh/id_rsa --generic-ssh-user dockeradmin --generic-ssh-port 22 dev-db

$ docker-machine ls
NAME     ACTIVE   DRIVER       STATE     URL  SWARM  DOCKER    ERRORS
default  *        virtualbox   Running   tcp://192.168.100.10:2376
dev-db   -        generic      Running   tcp://192.168.100.11:2376

Linux
  1. LVMを使用してLinuxで物理ボリュームを作成する方法

  2. Ssh – Sshを使用して別のPCを介してPCに接続する方法は?

  3. 別のサーバーを使用してサーバーにSSH接続する方法は??

  1. Terraformを使用してAWSでIAMロールを作成する方法

  2. Ansibleを使用してLinuxユーザーを作成する方法

  3. Linuxボックスを使用してssh経由でWindowsリモートデスクトップをトンネリングする方法は?

  1. Ansibleを使用してリモートWindowsホストを管理する方法

  2. AWSでPythonBoto3を使用してS3バケットを作成する方法

  3. ssh コマンドを使用してリモート ホストに接続する方法