Docker Machineの詳細な説明

Docker Machineの詳細な説明

Docker と Docker Machine の違い

Docker はクライアント サーバー アーキテクチャ アプリケーションであり、正式名称は Docker Engine です。 Docker は Docker Engine の単なるニックネームです。もちろん、Docker には会社名など他の意味もあります。簡潔にするために、この記事の Docker は Docker Engine と同等です。

Docker について話すとき、それが 3 つの部分で構成されていることを知っておく必要があります。

  1. Dockerデーモン
  2. Dockerデーモンと対話するためのREST API
  3. コマンドラインクライアント

次の図はそれらの関係を明確に示しています。

Docker Machine は、Docker をインストールおよび管理するためのツールです。独自のコマンドライン ツール docker-machine があります。

Dockerデーモンソケット

Docker クライアントは REST API を介して Docker デーモンと通信するため、使用できるメソッドを見てみましょう。

  1. Unixソケット
  2. Systemdソケットのアクティベーション
  3. 通信プロトコル

1 と 2 は、単純に同じホスト上のプロセス間の通信方法として理解できます。 3 については、TCP プロトコルを介したネットワーク間通信は理解しやすいです。

1 と 2 は同一マシン上のプロセス間通信に使用されているため、同一ホスト上にインストールされた Docker クライアントと Docker デーモンはこのように通信していると推測できます。確かにその通りです。Docker をインストールするときにデフォルトで追加される Docker デーモンの起動構成を表示するには、/etc/systemd/system/multi-user.target.wants/docker.service ファイルを開きます。

図の -H は、Docker デーモンがリッスンするソケットを指定するために使用されます。ここで指定されているタイプは、システム ソケットのアクティブ化です。タイプ 1 および 2 を使用した通信では、プロセスに root 権限が必要です。これは、Docker インストール プロセス中に、ルート権限を持つユーザーとユーザー グループが自動的に作成される主な理由でもあります。新しく作成されたユーザーとユーザー グループの名前は docker です。Docker を操作する必要があるすべてのユーザーをこのグループに追加することをお勧めします。そうしないと、コマンドを実行するときに次の問題が発生します。

複数の -H パラメータを同時に指定して、Docker デーモンが異なるソケット タイプを同時にリッスンできるようにすることもできます。たとえば、TCP ポート 2376 のリスナーを追加するには、次のコマンドライン パラメータを使用できます。

$ sudo dockerd -H fd:// -H tcp://0.0.0.0:2376

上記のコマンドを実行し、マシンがリッスンしているポートを確認します。

この時点で、リモート ホスト上の Docker クライアントからこのホストのポート 2376 にアクセスできるようになります。

DOCKER_HOST 環境変数

Docker クライアントのデフォルト設定では、ローカル Docker デーモンにアクセスします。DOCKER_HOST 変数を指定すると、Docker クライアントはこの変数で指定された Docker デーモンにアクセスします。 docker-machine env コマンドを確認しましょう。

実行された $ eval $(docker-machine env krdevdb) コマンドは、DOCKER_HOST 環境変数を設定します。

セキュリティ問題への対応

当社の Docker デーモンは TCP ポートをリッスンしていますが、残念ながら現時点では保護対策を講じていません。したがって、どの Docker クライアントも TCP ポートを介して Docker デーモンと対話できますが、これは明らかに許容されません。解決策は、Docker デーモンと Docker クライアントの両方で TLS 証明書認証を有効にすることです。この方法では、Docker デーモンと Docker クライアント間の通信が暗号化され、特定の証明書がインストールされているクライアントだけが対応する Docker デーモンと対話できるようになります。

これでこの記事の準備は完了です。次は Docker Machine について説明します。

Docker マシン作成コマンド

create コマンドは Docker Machine ドライバーに応じて異なる操作を実行しますが、ここでは特に次の 2 つの手順に重点を置きます。

docker-machine は指定したホスト上で次の操作を実行します。

  1. Docker をインストールして設定します。
  2. Docker サービスを保護するための証明書を生成します。

Dockerデーモンを構成する

Docker のインストール プロセスについては秘密はないので、ここでは詳細には触れません。 Docker デーモンの構成に焦点を当てます。よく観察すると、docker-machine によってインストールされた Docker には、/etc/systemd/system ディレクトリの下に追加の Docker 関連のディレクトリ、docker.service.d があることがわかります。このディレクトリには 10-machine.conf というファイルが 1 つだけあります。

まあ、ここで -H tcp://0.0.0.0:2376 が存在することは、私たちにとってはそれほど驚くべきことではありません。私たちがあらゆる準備をしてきたので、これは当然のことだと思うはずです。 --tls で始まるパラメータは主に証明書に関するものです。後ほどセキュリティ設定で詳しく紹介します。少しわかりにくいのは、上の図の /usr/bin/docker です。最新バージョンの Docker Machine では、Docker デーモンのセットアップに古い方法がまだ使用されています。次のバージョンでこれが更新されることを期待します。

この構成ファイルは、Docker インストールのデフォルトの構成ファイルを上書きし、Docker Machine によって指定された方法で Docker デーモンを起動するため、非常に重要です。これで、リモートからアクセスできる Docker デーモンができました。

証明書を生成する

Docker デーモン構成ファイルには、--tls で始まる 4 つのパラメーター、つまり --tlsverify、--tlscacert、--tlscert、および –tlskey があります。 --tlsverify オプションは、Docker デーモンに TLS 経由でリモート クライアントを検証するように指示します。他の 3 つのパラメータはそれぞれ pem 形式のファイルのパスを指定します。指定するファイル パスを確認します。

手動でインストールされた Docker と比較すると、これらの 3 つのファイルが /etc/docker ディレクトリに存在しないことがわかります。これらは間違いなく Docker Machine によって生成され、主に Docker デーモンの TLS 検証機能を有効にするために使用されます。

それでは、Docker Machine がインストールされているホストに戻りましょう。

/home/nick/.docker/machines/krdevdb ディレクトリを確認すると、同じ名前のファイル (ca.pem、server-key.pem、server.pem) がいくつか見つかりました。それらをホスト drdevdb 上のファイルと比較したところ、同じであることがわかりました。

この写真をもう一度見てみましょう。

これまで取り上げてきた DOCKER_HOST に加えて、他に 3 つの環境変数があります。 DOCKER_TLS_VERIFY は、Docker クライアントに TLS 検証を有効にするように指示します。 DOCKER_CERT_PATH は、TLS 検証が依存するファイルのディレクトリを指定します。これは、先ほど確認した /home/nick/.docker/machines/krdevdb ディレクトリです。

この時点で、私たちを悩ませてきたセキュリティの問題がようやく説明されました。Docker Machine が create コマンドを実行すると、セキュリティを確保するために一連の秘密鍵とデジタル証明書 (*.pem) ファイルが生成されます。これらのファイルはローカルとリモート Docker ホストに保存されます。ローカルのファイルは Docker クライアントを構成するために使用され、リモート ホストのファイルは Docker デーモンを構成するために使用されます。これにより、両側で TLS 検証マークが設定され、安全な通信が実現されます。

要約する

この記事の前半からわかるように、Docker は実際に提供すべきものをすべて提供していますが、構成が面倒です。しかし、ユーザーにとって必要なのは常に、よりシンプルで簡単な構成です。そのため、ユーザーの観点から見ると、Docker Machine は本当に素晴らしいです。 1 つのコマンドで、仮想マシンと Docker をインストールできるだけでなく、手動で行うには困難な多くの構成を完了できます。次に、明確でシンプルなコマンドをいくつか示します。そうすれば、生徒たちは楽しく過ごせます!

Docker Machine に関する詳細な記事はこれで終わりです。Docker Machine についてさらに詳しく知りたい方は、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続きご覧ください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • docker-machineの使い方の詳しい説明
  • Docker Machine を使用して Docker をリモートでデプロイする方法
  • Docker Machine は Azure 仮想ホストを作成します
  • Docker マシン ディープラーニング
  • Docker Machine とは何ですか?

<<:  JavaScript が Taobao の虫眼鏡効果を模倣

>>:  英語のシングルクォーテーション「''」を含むSQLの記述の失敗について徹底解説

推薦する

ElementUI のネストされたテーブルに基づいて複数選択を実装するためのサンプル コード

序文:私は友人のプロジェクトのバグを修正するのを手伝ったのでこれを書きました。この関数を書くのは初め...

16進カラーコード(完全版)

赤とピンク、およびそれらの 16 進コード。 #990033 #CC6699 #FF6699 #FF...

MySQL をデプロイするときに発生する「テーブル mysql.plugin が存在しません」という問題の解決方法

今日、MySQL の無料インストール版をデプロイしたところ、テーブル 'mysql.plug...

Centos7 システムに k8s クラスターを展開するための詳細な紹介

目次1 バージョンと計画1.1 バージョン情報: 1.2 クラスター計画2. 展開1. ファイアウォ...

MySQL 永続統計の詳細な説明

1. 永続的な統計情報の重要性:統計は、MySQL が実行プランを生成するためのガイドとして使用され...

Dockerコンテナ間の通信を実装する方法

シナリオ: laradock 開発環境 (php7.3+mysql5.7) がローカルに構築されてい...

CSS の :focus-within の楽しさについて簡単に説明します

Bステーションでパスワードを入力するときに目を覆っているこの画像を見たことがある人もいると思いますこ...

LinuxにPython 3.6をインストールして落とし穴を避ける

Python 3のインストール1. 依存環境をインストールするPython3 はインストール プロセ...

MySQLのGROUP BYステートメントを最適化する方法

MySQL で、id、a、b の 3 つのフィールドを持つ新しいテーブルを作成します。次のように、同...

MySQL で誤って削除したテーブル データを回復する方法 (必読)

バックアップがあれば、非常に簡単です。最新のバックアップ データを生成し、mysqlbinlog を...

Dockerで複数のSpringbootを実行するための詳細なチュートリアル

Dockerは複数のSpringbootを実行する1番目: ポートマッピング 2番目: メモリサイズ...

js での遅延読み込みとプリロードの具体的な使用法

遅延読み込み(レイジー読み込み)とプリロードは、Web 最適化によく使用される手段です。 。 1. ...

素晴らしい CSS ナビゲーション バーの下線効果

中国初のカッター github.com/chokcocoまず、ここに画像があります。純粋な CSS ...

nginx を使用したプロキシ サーバーの設定

Nginx は、リバース プロキシ機能を使用して負荷分散を実装できるほか、フォワード プロキシ機能を...

CSSページ下部固定を実現する8つの方法の詳細な説明

ページを書いているときに、ページの内容が小さくてフッターがページの真ん中に留まってしまうといった状況...