Dockerのインストール方法とDockerの4つのネットワークモードの詳細説明

Dockerのインストール方法とDockerの4つのネットワークモードの詳細説明

1. Dockerをインストールする

yum -y install docker-io

インストールが完了したことを示す「完了」メッセージが表示されます。

2. Dockerサービスを開始する

サービスdocker開始

3. Dockerの起動を設定する

chkconfig docker オン

4. 基本情報ビュー

docker バージョン
docker情報
docker イメージ 画像を表示
実行中のコンテナを表示するにはdocker ps
docker rmi イメージの削除
docker save -o imageName:tag > path/name.tar はイメージを保存します
docker load < name.tar イメージをロード
Docker pullはイメージをプルします

5. アンインストールする場合、コマンドは次のようになります。

sudo yum remove docker-ce
sudo rm -rf /var/lib/docker

docker run を使用して Docker コンテナを作成する場合、--net オプションを使用してコンテナのネットワーク モードを指定できます。Docker には次の 4 つのネットワーク モードがあります。

--net=host を使用して指定されるホスト モード。
--net=container:NAME_or_ID を使用して指定されるコンテナ モード。
なしモード。--net=none を使用して指定します。
ブリッジ モード。--net=bridge を使用して指定され、デフォルト設定です。
ユーザー定義モードもあります

以下ではDockerの各ネットワークモードを紹介します。

1 ホストモード

形式:

docker run -it --name myubuntu --net=host ubuntu /bin/bash

ご存知のとおり、Docker は、プロセスを分離するための PID 名前空間、ファイル システムを分離するためのマウント名前空間、ネットワークを分離するためのネットワーク名前空間など、Linux の名前空間テクノロジを使用してリソースを分離します。ネットワーク名前空間は、ネットワーク カード、ルーティング、Iptable ルールなど、他のネットワーク名前空間から分離された独立したネットワーク環境を提供します。 Docker コンテナには通常、独立したネットワーク名前空間が割り当てられます。ただし、コンテナの起動時にホスト モードを使用すると、コンテナは独立したネットワーク名前空間を取得せず、ホストとネットワーク名前空間を共有します。コンテナは独自のネットワーク カードを仮想化したり、独自の IP を構成したりはせず、ホストの IP とポートを使用します。
たとえば、マシン 10.10.101.105/24 上でホスト モードで Web アプリケーションを含む Docker コンテナーを起動し、ポート tcp80 でリッスンします。コンテナ内で ifconfig などのコマンドを実行してネットワーク環境を表示すると、ホストマシン上の情報が表示されます。外部からコンテナ内のアプリケーションにアクセスする場合、ホストマシンで直接実行する場合と同じように、NAT 変換なしで 10.10.101.105:80 を直接使用できます。ただし、ファイル システムやプロセス リストなど、コンテナーの他の側面は、ホスト マシンから分離されたままです。

2 コンテナモード

形式:

docker run -it --name myubuntu --net=container:NAME_OR_ID ubuntu /bin/bash

ホストモードを理解すれば、このモードも簡単に理解できます。このモードでは、新しく作成されたコンテナーがネットワーク名前空間をホストと共有するのではなく、既存のコンテナーと共有することを指定します。新しく作成されたコンテナは、独自のネットワーク カードを作成したり、独自の IP を構成したりするのではなく、指定されたコンテナと IP、ポート範囲などを共有します。同様に、ネットワークを除いて、ファイル システムやプロセス リストなど、2 つのコンテナーの他の側面は分離されたままです。 2 つのコンテナのプロセスは、lo ネットワーク カード デバイスを介して通信できます。

3 なしモード

形式:

docker run -it --name myubuntu --net=none ubuntu /bin/bash

このモードは前の 2 つとは異なります。このモードでは、Docker コンテナには独自のネットワーク名前空間がありますが、Docker コンテナに対してネットワーク構成は実行されません。つまり、この Docker コンテナには、ネットワーク カード、IP、ルーティングなどの情報が含まれていません。 Docker コンテナのネットワーク カードを追加し、IP を構成する必要があります。

4 ブリッジモード

ブリッジモードは、Docker のデフォルトのネットワーク設定です。このモードでは、ネットワーク名前空間を割り当て、コンテナごとに IP アドレスなどを設定し、ホスト上の Docker コンテナを仮想ブリッジに接続します。以下ではこのモードに焦点を当てます。

4.1 ブリッジモードトポロジ

Docker サーバーを起動すると、ホスト上に docker0 という仮想ブリッジが作成され、このホスト上で起動された Docker コンテナはこの仮想ブリッジに接続されます。仮想ブリッジは物理スイッチと同様に動作し、ホスト上のすべてのコンテナーがスイッチを介してレイヤー 2 ネットワークに接続されます。次のステップはコンテナにIPを割り当てることです。DockerはRFC1918で定義されたプライベートIPセグメントからホストマシンとは異なるIPアドレスとサブネットを選択し、docker0に割り当てます。docker0に接続されたコンテナは、このサブネットから空いているIPを選択します。たとえば、Docker は通常、ネットワーク セグメント 172.17.0.0/16 を使用し、172.17.42.1/16 を docker0 ブリッジに割り当てます (docker0 は、ホスト上で ifconfig コマンドを使用して確認できます。これはブリッジの管理インターフェイスと見なすことができ、ホスト上の仮想ネットワーク カードとして使用されます)。単一マシン環境でのネットワーク トポロジは次のようになり、ホスト アドレスは 10.10.101.105/24 です。

Docker が上記のネットワーク構成を完了するプロセスは、おおよそ次のようになります。

1. ホスト上に仮想ネットワーク カード veth ペア デバイスのペアを作成します。 Veth デバイスは常にペアで表示されます。これらはデータ チャネルを形成します。データは 1 つのデバイスから入力され、別のデバイスから出力されます。したがって、2 つのネットワーク デバイスを接続するために、veth デバイスがよく使用されます。

2. Docker は、veth ペア デバイスの一方の端を新しく作成されたコンテナーに配置し、eth0 という名前を付けます。もう一方の端はホスト内に配置され、veth65f9 のような名前が付けられ、このネットワーク デバイスは docker0 ブリッジに追加され、brctl show コマンドで表示できます。

3. docker0 サブネットからコンテナに IP を割り当て、docker0 IP アドレスをコンテナのデフォルト ゲートウェイとして設定します。
ネットワーク トポロジを紹介した後、ブリッジ モードでコンテナーがどのように通信するかについて説明します。

4.2 ブリッジモードでのコンテナ間の通信

ブリッジ モードでは、同じブリッジに接続されたコンテナーは相互に通信できます (セキュリティ上の理由から、DOCKER_OPTS 変数で --icc=false を設定することで、それらの間の通信を禁止することもできます。これにより、--link のみが 2 つのコンテナーの通信を有効にできます)。
コンテナは外部と通信することもできます。ホスト上の Iptable ルールを見て、次の行を確認してみましょう。

-A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE

このルールは、docker0 ネットワーク カードから送信されていない、送信元アドレスが 172.17.0.0/16 のパケット (つまり、Docker コンテナーから生成されたパケット) の送信元アドレスを、ホスト ネットワーク カードのアドレスに変換します。分かりにくいかも知れませんので、例を挙げて説明しましょう。ホストに eth0 という名前のネットワーク カードがあり、IP アドレスが 10.10.101.105/24、ゲートウェイが 10.10.101.254 であるとします。 IP 172.17.0.1/16 のホスト上のコンテナから Baidu (180.76.3.151) に ping を実行します。 IP パケットはまずコンテナからデフォルト ゲートウェイ docker0 に送信されます。パケットが docker0 に到達した後、ホストにも到達します。次に、ホストのルーティング テーブルが照会され、パケットはホストの eth0 からホストのゲートウェイ 10.10.105.254/24 に送信される必要があることがわかります。その後、パケットは eth0 に転送され、eth0 から送信されます (ホストの ip_forward 転送がオンになっている必要があります)。このとき、上記の Iptable ルールが有効になり、パケットに対して SNAT 変換が実行され、送信元アドレスが eth0 のアドレスに変更されます。このように、外部から見ると、このパケットは 10.10.101.105 から送信されており、Docker コンテナは外部からは見えません。
では、外部のマシンはどのようにして Docker コンテナのサービスにアクセスするのでしょうか?まず、次のコマンドを使用して、Web アプリケーションを含むコンテナーを作成し、コンテナーのポート 80 をホストのポート 80 にマップします。

docker run -d --name web -p 80:80 fmzhen/simpleweb

次に、Iptable ルールの変更を確認し、追加のルールを見つけます。

-A DOCKER ! -i docker0 -p tcp -m tcp --dport 80 -j DNAT --to-destination 172.17.0.5:80

このルールは、ホスト eth0 が受信した宛先ポート 80 の TCP トラフィックに対して DNAT 変換を実行し、トラフィックを上記で作成した Docker コンテナである 172.17.0.5:80 に送信します。したがって、外部からコンテナ内のサービスにアクセスするには、10.10.101.105:80 にアクセスするだけで済みます。
さらに、Docker が使用する IP アドレス、DNS などの情報をカスタマイズしたり、独自に定義したブリッジを使用したりすることもできますが、動作方法は同じです。

ユーザー定義モード

ユーザーは、Docker ネットワーク ドライバーまたはその他のネットワーク ドライバーを通じてネットワークをカスタマイズできます。複数のコンテナを同じネットワークに接続できます。カスタム ネットワークに接続すると、コンテナは互いの IP アドレスとホスト名を介して相互に通信できるようになります。
コンテナがユーザー定義ネットワークに接続されている場合、コンテナの /etc/hosts ファイルに、同じネットワーク内の他のすべてのコンテナの IP アドレスが追加されます。
コンテナはいつでも /etc/hosts ファイルを変更する可能性があるため、コンテナ内のプログラムは不完全な、あるいは空の /etc/hosts ファイルを読み取る可能性があります。通常、再読することでこの問題は解決できます。

要約する

以上がこの記事の全内容です。この記事の内容が皆様の勉強や仕事に何らかの参考学習価値をもたらすことを願います。123WORDPRESS.COM をご愛顧いただき、誠にありがとうございます。これについてもっと知りたい場合は、次のリンクをご覧ください。

以下もご興味があるかもしれません:
  • Dockerの4つのネットワークモード
  • Dockerのネットワークモードと設定方法
  • Dockerネットワークモード(4つのモード)の詳細な紹介
  • DockerにおけるVLANネットワークモードの設定の詳細な説明
  • Docker 4 ネットワーク モードのデモンストレーションと接続テスト

<<:  MySQL シーケンス AUTO_INCREMENT の詳細な説明とサンプルコード

>>:  js シンプルで粗雑なパブリッシュとサブスクライブのサンプルコード

推薦する

SQLクエリの実行順序をゼロから学ぶ

SQL クエリ ステートメントの実行順序は次のとおりです。 (7)選択 (8) DISTINCT &...

Zookeeper 不正アクセス テストの問題

目次序文Zookeeper サービスのオープンを検出情報を入手する接続テスト接続先修理計画参照する序...

HTML テーブルタグチュートリアル (33): セルの垂直配置属性 VALIGN

垂直方向では、セルの配置を上、中央、下に設定できます。基本的な構文<TD VLIGN=&quo...

AWSサーバーリソースを無料で使用する方法を教えます

AWS - Amazon のクラウド コンピューティング サービス プラットフォーム以前、AWS の...

VMwareを使用したPermeateレンジシステムのインストール手順の詳細説明

1. 背景私たちは時々社内研修を行っており、実験環境をよく利用しています。最初はdockerコンテナ...

リアルタイムクロックを実装するネイティブJS

ネイティブ JS で実装したリアルタイム クロック エフェクトを共有します。エフェクトは以下のとおり...

Linux で SVN サーバーをインストールする方法

1. Yumのインストール yum でサブバージョンをインストール 2. 構成1. 倉庫を作る/ho...

MySQL の group by と order by を一緒に使用する方法

テーブル:reward(報酬テーブル)があるとします。テーブル構造は次のようになります。 テーブルt...

VSCode 構成 Git メソッドの手順

Git は vscode に統合されており、git コマンドをいくつか記述しなくても、クリックするだ...

Vueはコンピュータカメラを呼び出して写真機能を実現します

この記事の例では、コンピュータカメラを呼び出して写真機能を実現するためのvueの具体的なコードを参考...

Apache をインストールした後、サービスを開始できません (サービスを開始するとエラー コード 1 が表示されます)

目次1. エラーメッセージ2. エラーの原因3. 解決策1. エラーメッセージ1. インストール後、...

純粋な CSS で中空効果を実現するためのサンプルコード

私は最近、空洞化効果について研究しました。背景クリップ: テキスト背景はテキストの前景色にクリップさ...

VMWARE で Centos8 仮想マシンをコピーすることによって発生する IP 損失の問題の解決策

VMwareでcentos8サービスをインストールしてコピーすると、次の問題が発生します。 コピー前...

WeChatアプレット仮想リストの応用例

目次序文仮想リストとは何ですか?デモ効果準備スクリーンの高さとボックスの高さ最適化要約する序文人気の...

HTML ベース URL タグ

その機能はグローバル スタイルを設定することです。その後の相対パスはこれに基づきます: <im...