Dockerコンテナ間の通信と外部ネットワーク通信の操作

Dockerコンテナ間の通信と外部ネットワーク通信の操作

コンテナ間の通信

1. コンテナのネットワーク共有

このモードの Docker コンテナはネットワーク スタックを共有するため、2 つのコンテナは localhost を使用して効率的かつ迅速に通信できます。

Web サーバーとアプリケーション サーバー間の通信に使用されます。

## 実験環境をクリアする[root@server1 ~]# docker ps -a
コンテナID イメージ コマンド 作成ステータス ポート名
 
## デフォルトネットワーク [root@server1 ~] でコンテナを作成# docker run -it --name vm1 ubuntu
root@b1a2a90f98a5:/# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue 状態 UNKNOWN グループ デフォルト qlen 1
  リンク/ループバック 00:00:00:00:00:00 brd 00:00:00:00:00:00
  inet 127.0.0.1/8 スコープ ホスト lo
    valid_lft 永久 preferred_lft 永久
368: eth0@if369: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue 状態 UP グループ デフォルト 
  リンク/イーサ 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
  inet 172.17.0.2/16 brd 172.17.255.255 スコープ グローバル eth0
    valid_lft 永久 preferred_lft 永久
root@b1a2a90f98a5:/# [root@server1 ~]# 
 
##コンテナはvm1とネットワークを共有するvm2を作成します
[root@server1 ~]# docker run -it --name vm2 --network コンテナ:vm1 ubuntu
root@b1a2a90f98a5:/# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue 状態 UNKNOWN グループ デフォルト qlen 1
  リンク/ループバック 00:00:00:00:00:00 brd 00:00:00:00:00:00
  inet 127.0.0.1/8 スコープ ホスト lo
    valid_lft 永久 preferred_lft 永久
368: eth0@if369: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue 状態 UP グループ デフォルト 
  リンク/イーサ 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
  inet 172.17.0.2/16 brd 172.17.255.255 スコープ グローバル eth0
    valid_lft 永久 preferred_lft 永久
ルート@b1a2a90f98a5:/#

2.--リンク方式

## イメージをクリア [root@server1 ~]# docker rm -f vm1
仮想マシン1
[root@server1 ~]# docker rm -f vm2
仮想マシン2
[root@server1 ~]# docker ps -a
コンテナID イメージ コマンド 作成ステータス ポート名
 
##デフォルトネットワークはvm1を作成します
[root@server1 ~]# docker run -it --name vm1 ubuntu
root@68e56c57a9a0:/# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue 状態 UNKNOWN グループ デフォルト qlen 1
  リンク/ループバック 00:00:00:00:00:00 brd 00:00:00:00:00:00
  inet 127.0.0.1/8 スコープ ホスト lo
    valid_lft 永久 preferred_lft 永久
370: eth0@if371: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue 状態 UP グループ デフォルト 
  リンク/イーサ 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
  inet 172.17.0.2/16 brd 172.17.255.255 スコープ グローバル eth0
    valid_lft 永久 preferred_lft 永久
root@68e56c57a9a0:/# [root@server1 ~]#
 
##--vm1 サブネットのコンテナ vm2 を作成するためのリンク メソッド
[root@server1 ~]# docker run -it --name vm2 --link vm1:web ubuntu
root@61267851b484:/# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue 状態 UNKNOWN グループ デフォルト qlen 1
  リンク/ループバック 00:00:00:00:00:00 brd 00:00:00:00:00:00
  inet 127.0.0.1/8 スコープ ホスト lo
    valid_lft 永久 preferred_lft 永久
372: eth0@if373: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue 状態 UP グループ デフォルト 
  リンク/イーサ 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff
  inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0 ##ip は vm1 と同じネットワークセグメントにあり、valid_lft は永久に増加し、preferred_lft は永久に増加します
 
##vm1 の IP とエイリアス情報を含むファイルを解析します。root@61267851b484:/# cat /etc/hosts
127.0.0.1 ローカルホスト
::1 ローカルホスト ip6-ローカルホスト ip6-ループバック
fe00::0 ip6-ローカルネット
ff00::0 ip6-mcastプレフィックス
ff02::1 ip6-全ノード
ff02::2 ip6-オールルーター
172.17.0.2 ウェブ 68e56c57a9a0 vm1
172.17.0.3 61267851b484
ルート@61267851b484:/# ^C
ルート@61267851b484:/#

- リンク

ホストファイルを更新する

リンクコンテナの変数もコピーされます

ルート@61267851b484:/#env
ホスト名=61267851b484
TERM=xterm
LS_COLORS = RS = 0:DI = 01; 34:LN = 01; 36; 36:MH = 00:PI = 40; 33:SO = 01; 35:DO = 01; 35:BD = 40; 33; 01:CD = 40; 33; 01:OR = 40; 31; 01 4; 42:st = 37; 44:ex = 01; 32:*。tar = 01; 31; 31:*。tgz= 01; 31:*。arj = 01; 31:*。taz = 01; 31:*。lzh = 01; 31:*。lzma = 01; 31:* ; 31:*。Z = 01; 31:*。dz= 01; 31:*。gz= 01; 31:*。lz = 01; 31:*。xz = 01; 31:*。bz2 = 01; 31:*。bz= 01; 31:* ; 31:*。jar = 01; 31:*。war = 01; 31:*。ear = 01; 31:*。sar = 01; 31:*。rar = 01; 31:*。ace = 01; 31:*。zoo = 01; 31:*。cpi​​o = 01; 31:* 5:*。gif = 01; 35:*。bmp = 01; 35:*。pbm= 01; 35:*。pgm = 01; 35:*。ppm = 01; 35:*。tga = 01; 35:*。xbm = 01; 35:* ng = 01; 35:*。svg = 01; 35:*。svgz = 01; 35:*。mng = 01; 35:*。pcx= 01; 35:*。mov = 01; 35:*。mpg= 01; 35:*。mpeg = 01; 35:*。m2v= 01; 35: ; 35:*。ogm = 01; 35:*。mp4 = 01; 35:*。m4v= 01; 35:*。mp4v = 01; 35:*。vob = 01; 35:*。qt = 01; 35:*。nuv = 01; 35:*。 .rmvb = 01; 35:*。flc = 01; 35:*。avi = 01; 35:*。fli = 01; 35:*。flv= 01; 35:*。gl = 01; 35:*。dl= 01; 35:*。xcf = 01; 35:* ; 35:*。emf = 01; 35:*。axv = 01; 35:*。ann an an anx = 01; 35: = 00; 36:*。mpc = 00; 36:*。ogg = 00; 36:*。ra = 00; 36:*。wav = 00; 36:*。axa = 00; 36:*。oga = 00; 36:*。spx = 00; 36:*。xspf = 00; 36:*。
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
障害者=/
SHLVL=1
HOME=/ルート
WEB_NAME=/vm2/web
LESSOPEN=| /usr/bin/lesspipe %s
LESSCLOSE=/usr/bin/lesspipe %s %s
_=/usr/bin/env
ルート@61267851b484:/#

コンテナを停止すると、IP アドレスが解放されます。再度起動すると、別の IP アドレスが取得されます。リンクされたコンテナは、hosts ファイルを自動的に更新します。

コンテナと外部ネットワーク間の通信

現在の iptable nat テーブル ファイアウォール ポリシーを表示する

[root@server1 ~]# iptables -t nat -nL
チェーン PREROUTING (ポリシー ACCEPT)
ターゲット 利益 選択 ソース 宛先     
DOCKER すべて -- 0.0.0.0/0 0.0.0.0/0 ADDRTYPE は dst-type LOCAL と一致する
 
チェーン入力(ポリシーACCEPT)
ターゲット 利益 選択 ソース 宛先     
 
チェーン出力(ポリシーACCEPT)
ターゲット 利益 選択 ソース 宛先     
DOCKER すべて -- 0.0.0.0/0 !127.0.0.0/8 ADDRTYPE は dst-type LOCAL と一致する
 
チェーン POSTROUTING (ポリシー ACCEPT)
ターゲット 利益 選択 ソース 宛先     
すべてをマスカレード -- 172.26.0.0/24 0.0.0.0/0      
すべてをマスカレード -- 172.20.0.0/16 0.0.0.0/0      
すべてをマスカレード -- 172.18.0.0/16 0.0.0.0/0      
すべてをマスカレード -- 172.17.0.0/16 0.0.0.0/0      
 
チェーン DOCKER (2 件の参照)
ターゲット 利益 選択 ソース 宛先     
すべてを返す -- 0.0.0.0/0 0.0.0.0/0      
すべてを返す -- 0.0.0.0/0 0.0.0.0/0      
すべてを返す -- 0.0.0.0/0 0.0.0.0/0      
すべてを返す -- 0.0.0.0/0 0.0.0.0/0
## nginxコンテナを作成し、ポート[root@server1 ~]をマップします# docker run -d --name nginx -p 80:80 nginx
cfefe6420cfe60c46cb7a050c142af7eff86fa6d687c3577077a5b4e2c8b961c
 
##ポート80を開く [root@server1 ~]# docker port nginx 
80/tcp -> 0.0.0.0:80
 
[root@server1 ~]# netstat -antlp | grep 80
tcp6 0 0 :::80 :::* 27094/docker-proxyを聴く 
[root@server1 ~]# iptables -t nat -nL
チェーン PREROUTING (ポリシー ACCEPT)
ターゲット 利益 選択 ソース 宛先     
DOCKER すべて -- 0.0.0.0/0 0.0.0.0/0 ADDRTYPE は dst-type LOCAL と一致する
 
チェーン入力(ポリシーACCEPT)
ターゲット 利益 選択 ソース 宛先     
 
チェーン出力(ポリシーACCEPT)
ターゲット 利益 選択 ソース 宛先     
DOCKER すべて -- 0.0.0.0/0 !127.0.0.0/8 ADDRTYPE は dst-type LOCAL と一致する
 
チェーン POSTROUTING (ポリシー ACCEPT)
ターゲット 利益 選択 ソース 宛先     
すべてをマスカレード -- 172.26.0.0/24 0.0.0.0/0      
すべてをマスカレード -- 172.20.0.0/16 0.0.0.0/0      
すべてをマスカレード -- 172.18.0.0/16 0.0.0.0/0      
すべてをマスカレード -- 172.17.0.0/16 0.0.0.0/0      
マスカレード tcp -- 172.17.0.2 172.17.0.2 tcp dpt:80
 
チェーン DOCKER (2 件の参照)
ターゲット 利益 選択 ソース 宛先     
すべてを返す -- 0.0.0.0/0 0.0.0.0/0      
すべてを返す -- 0.0.0.0/0 0.0.0.0/0      
すべてを返す -- 0.0.0.0/0 0.0.0.0/0      
すべてを返す -- 0.0.0.0/0 0.0.0.0/0      
DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 から:172.17.0.2:80
[root@server1 ~]#

上記は私の個人的な経験です。参考になれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。間違いや不備な点がありましたら、遠慮なくご指摘ください。

以下もご興味があるかもしれません:
  • Dockerコンテナの接続と通信の実装
  • Dockerコンテナのホスト間マルチネットワークセグメント通信ソリューションの詳細説明
  • Dockerコンテナのホスト間通信におけるダイレクトルーティングの詳細な説明
  • Dockerコンテナがホスト間で通信する方法の詳細な説明
  • Dockerコンテナ間の通信方法の詳細な説明
  • Dockerコンテナ間の通信を実装する方法

<<:  CSS3アニメーションジャミングソリューションについての簡単な説明

>>:  1分でVueが右クリックメニューを実装

推薦する

VueでEchartsチャートの幅と高さの適応を実現する実践

目次1. インストールとインポート2. 手ぶれ補正機能を定義する3. チャートコードを描くinit ...

React双方向データバインディングの原理についての簡単な説明

目次双方向データバインディングとは双方向データバインディングの実装データ影響ビュービューはデータに影...

MySQL ストアド プロシージャの権限の問題の概要

MySQL ストアド プロシージャは、確かに、非常にまれな使用シナリオのように見えます。この問題は、...

HTMLページの読み込みと解析プロセスの詳細な紹介

ブラウザがHTMLを読み込みレンダリングする順序1. IE は上から下へダウンロードし、上から下へレ...

Springboot プロジェクトに動的にパラメータを渡すための Docker の実装方法

背景最近、Docker 初心者の友人から、毎回プロジェクト構成ファイルにハードコーディングしてサービ...

Vueはプルダウンとスクロールでデータを読み込む例を実装しています

目次ステップ1: インストールステップ2: 引用ステップ3: 使用Webプロジェクトでは、データを読...

Linux系でよく使われる運用・保守コマンド(まとめ)

目次1. システム監視2. ファイル操作3. ネットワーク通信4. システム管理仕事で必要なLinu...

Ubuntu 20.04 aptの国内ソースを変更する方法

UPD 2020.2.26 現在、Ubuntu 20.04 LTSはまだリリースされていないため、チ...

Node.js+expressメッセージボード機能実装例

目次メッセージボード必要なライブラリオープンソースプロジェクトプロジェクト構造メッセージボードnod...

CSS+JS で水滴の波紋アニメーション ボタン効果を実装するサンプル コード

コードは次のようになります。 <!DOCTYPE html> <html lang...

時刻を保存するために適切な MySQL の datetime 型を選択する方法

データベースを構築してプログラムを書くとき、日付と時刻の使用は避けられません。データベースには、ti...

初心者がHTMLタグを学ぶ(3)

関連記事:初心者が学ぶ HTML タグ (2)導入された HTML タグは、必ずしも XHTML 仕...

WeChatアプレットを使用して天井効果を実現する方法の例

目次1. 実装2. 問題点3. より良い実装方法があるかどうか検討する要約する背景は日付のタイトルで...

JConsoler を使って Tomcat の JVM メモリを監視する方法を説明します

目次1. Tomcatを監視する方法2. Java独自の監視コマンド3. Tomcatのトラブルシュ...

Linux コマンドにおける Ctrl+z、Ctrl+c、Ctrl+d の違いと使い方

Linux で Ctrl+c、Ctrl+d、Ctrl+z はどういう意味ですか? Ctrl+c と ...