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 シンプルで粗雑なパブリッシュとサブスクライブのサンプルコード

推薦する

さまざまなマウスの形状を表現する方法

<a href = "http://" style = "cur...

要素ツリーコントロールは、ドロップダウンメニューとアイコンを統合します(ツリー+ドロップダウン+入力)

目次要件:実装手順:この記事では主に以下について説明します: カスタムツリーコントロール<el...

ウェブページ(ウェブサイト)のデザインと制作に関する考えや経験の共有

まずは投稿する前に! 「I Want to Study on My Own!」に改めて感謝します。た...

MySQL にテーブルデータを挿入するときに中国語の文字化けが発生する問題を解決する方法

1. 問題開発中に、他のデータベースから MySQL データベース テーブルにデータを挿入すると、次...

React のネストされたコンポーネントの構築順序

目次Reactの公式サイトではライフサイクルの説明を見ることができます次に、ネストされたコンポーネン...

グループフィールドを 1 行に書き込むための mysql group_concat メソッドの例

この記事では、MySQL group_concat を使用してグループ化されたフィールドを 1 つの...

Reactの基本のまとめ

目次序文始めるReactライフサイクルリアクトファイバーリアクトセットステートReactイベントメカ...

VMware での Ubuntu と Windows 間のファイル共有

この記事では、VMware 環境下で Ubuntu と Windows 間でファイルを共有する方法を...

Vueは買い物数量を変更できるショッピングカートを実装します

この記事では、Vueを使用してショッピングカートの数量を変更する方法を紹介します。具体的な内容は次の...

テキストエリア テキストエリアの幅と高さ 幅と高さの自動適応実装コード

コードをコピーコードは次のとおりです。 <HTML> <ヘッド> <T...

レスポンシブデザインについて知っておくべきこと

レスポンシブデザインとは、ウェブサイトの開発プロセス中に、ユーザーの操作やデバイス環境に応じて対応す...

複数人チャットルームを実現する js コード

この記事の例では、多人数チャットルームを実装するためのjsコードの具体的なコードを参考までに共有して...

MySQLカスタム変数の概念と特徴

MySQL カスタム値は、値を保存するための一時的なコンテナです。サーバーへの接続がアクティブである...

MySQL ストアド プロシージャで月ごとにテーブルを作成する方法

詳細には立ち入らずに、コードに直接進みましょう。一緒にコミュニケーションを取り、学びましょう。月ごと...

ポータルサイトのフォーカス画像のデザインに関するいくつかの結論

フォーカス画像は、画像、テキスト、動的なインタラクティブ効果を統合したコンテンツを表示する方法です。...