CentOS 7 で Docker のポート転送をファイアウォールと互換性のあるように設定する方法

CentOS 7 で Docker のポート転送をファイアウォールと互換性のあるように設定する方法

CentOS 7 では、次のようなコマンドを使用してホスト ポートをコンテナー ポートにマッピングすると、コンテナー サービスにアクセスできないという問題が発生する場合があります。

実行ファイル名を web_a に変更します。

Docker がこのコマンドを実行すると、ホスト ポート 803 をコンテナ ポート 80 にマップするルールが iptables に挿入されます。ただし、CentOS 7 では、iptables は firewalld サービスに置き換えられています。したがって、上記のコマンドのポート マッピングは有効になりません。

解決策: まず、ホスト上のネットワーク カード情報を確認し、docker0 の仮想ネットワーク カードが追加されていることを確認します。

[root@localhost /home]# ifconfig
docker0: flags=4163<UP、ブロードキャスト、実行中、マルチキャスト> mtu 1500
    inet 172.17.0.1 ネットマスク 255.255.0.0 ブロードキャスト 172.17.255.255
    inet6 fe80::42:5cff:fe0e:82f9 プレフィックス長 64 スコープID 0x20<リンク>
    ether 02:42:5c:0e:82:f9 txqueuelen 0 (イーサネット)
    RXパケット 1288 バイト 1561177 (1.4 MiB)
    RXエラー 0 ドロップ 0 オーバーラン 0 フレーム 0
    TXパケット 1594 バイト 108755 (106.2 KiB)
    TXエラー 0 ドロップ 0 オーバーラン 0 キャリア 0 衝突 0

enp2s0: flags=4163<UP、ブロードキャスト、実行中、マルチキャスト> mtu 1500
    inet 192.168.1.250 ネットマスク 255.255.255.0 ブロードキャスト 192.168.1.255
    inet6 fe80::76f4:9aea:4973:ec6c プレフィックス長 64 スコープID 0x20<リンク>
    inet6 240e:379:542:2800:8844:77ba:78dd:7 プレフィックス長 128 スコープID 0x0<グローバル>
    inet6 240e:379:542:2811:3ead:218:ba68:38e6 プレフィックス長 64 スコープID 0x0<グローバル>
    ether 74:d4:35:09:93:19 txqueuelen 1000 (イーサネット)
    RXパケット 10166908 バイト 1221399579 (1.1 GiB)
    RXエラー 0 ドロップ 3014 オーバーラン 0 フレーム 0
    TXパケット 982334 バイト 427296782 (407.5 MiB)
    TXエラー 0 ドロップ 0 オーバーラン 0 キャリア 0 衝突 0
    デバイス割り込み 18

lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
    inet 127.0.0.1 ネットマスク 255.0.0.0
    inet6 ::1 プレフィックス長 128 スコープID 0x10<ホスト>
    ループ txqueuelen 1000 (ローカル ループバック)
    RXパケット 1833650 バイト 450567722 (429.6 MiB)
    RXエラー 0 ドロップ 0 オーバーラン 0 フレーム 0
    TXパケット 1833650 バイト 450567722 (429.6 MiB)
    TXエラー 0 ドロップ 0 オーバーラン 0 キャリア 0 衝突 0

vethecef228: flags=4163<UP、ブロードキャスト、実行中、マルチキャスト> mtu 1500
    inet6 fe80::f425:f1ff:fe82:9c19 プレフィックス長 64 スコープID 0x20<リンク>
    ether f6:25:f1:82:9c:19 txqueuelen 0 (イーサネット)
    RXパケット 234 バイト 1520113 (1.4 MiB)
    RXエラー 0 ドロップ 0 オーバーラン 0 フレーム 0
    TXパケット 613 バイト 39809 (38.8 KiB)
    TXエラー 0 ドロップ 0 オーバーラン 0 キャリア 0 衝突 0

コンテナ インスタンスによって取得された仮想 IP を確認するには、次のコマンドを使用します。

docker 検査 web_a

コンテナ内の IP が 172.17.0.2 であると仮定して、この IP の NAT 転送ルールを作成し、firewalld サービスにこのルールを処理させます。

#ホストポート要求はコンテナに転送されます (コンテナ内のサービスはローカルホストではなく、コンテナによって割り当てられた仮想 IP をリッスンするか、0.0.0.0 に置き換える必要があります)
firewall-cmd --permanent --zone=public --add-masquerade ポート NAT 転送を有効にする #ホストのポート 803 要求をコンテナのポート 80 に転送します firewall-cmd --add-forward-port=port=803:proto=tcp:toaddr=172.17.0.2:toport=80 --permanent
#ルールを再読み込みします。firewall-cmd --reload
#すべてのルールを一覧表示するfirewall-cmd --list-all
公開(アクティブ)
 ターゲット: デフォルト
 icmpブロック反転: いいえ
 インターフェース: enp2s0
 出典:
 サービス: ssh dhcpv6-client
 ポート: 3306/tcp 80/tcp 21/tcp 5000/tcp 6379/tcp 900/tcp 801/tcp 802/tcp 6000/tcp 5002/tcp 90/tcp 9092/tcp 81/tcp 803/tcp
 プロトコル:
 仮面舞踏会:はい
 転送ポート: port=803:proto=tcp:toport=80:toaddr=172.17.0.2
 送信元ポート:
 icmpブロック:
 リッチルール:
#Dockerを再起動
systemctl dockerを再起動します
#コンテナを再起動します docker start web_a

上記の操作を行うと、ホスト IP:803 を持つコンテナ上のポート 80 のサービスにアクセスできるようになり、firewalld をシャットダウンする必要がなくなります (インターネット上の多くの結論では、iptables サービスに置き換えることが推奨されていますが、実際のテストでは必要ありません)。

要約する

CentOS 7 で Docker のポート フォワーディングをファイアウォールと互換性のあるように構成する方法についての記事はこれで終わりです。Docker のポート フォワーディングをファイアウォールと互換性のあるように構成する方法の詳細については、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • ポートマッピング後に Docker コンテナが突然接続に失敗する問題のトラブルシューティング プロセス
  • Dockerコンテナを外部IPとポートにバインドする方法
  • Dockerコンテナの起動後にポートマッピングを追加する
  • Docker で実行中のコンテナのポート マッピングを設定する方法
  • 実行中のコンテナポートを動的にマッピングするDockerの詳細な説明
  • Docker ポートマッピングの詳細

<<:  ネイティブ JS オブジェクト指向タイピング ゲーム

>>:  C++ を使用して MySQL に接続する方法

推薦する

純粋な CSS で「テキストオーバーフローの切り捨てと省略」を実装するいくつかの方法

私たちの日常的な開発作業では、テキストのオーバーフロー、切り捨て、省略は、考慮する必要がある非常に一...

MySQLデータベースが予期せずクラッシュし、テーブルデータファイルが破損して起動できなくなる問題を解決します。

問題: MySQL データベースが予期せずクラッシュしたため、データベースを起動できませんでした。エ...

MySql クライアントが数秒で終了する問題を解決する (my.ini が見つからない)

問題の説明 (環境: windows7、MySql8.0)今日、MySql をインストールした後、M...

Kubernetes ポッドオーケストレーションとライフサイクルの詳細な説明

目次K8Sマスター基本アーキテクチャポッドオーケストレーションコンセプトPod オブジェクトのプロパ...

MySQL 学習: 初心者のための 3 つのパラダイム

目次1. パラダイム基盤1.1 パラダイムの概念2. 3つの主要なパラダイム2.1 3つの主要なパラ...

CSS3で跳ねるボールのアニメーションを実現

私は通常、大手ウェブサイトの特別ページや製品リリースページを訪問するのが好きです。なぜなら、たくさん...

MySQL の制限パフォーマンス分析と最適化

1. 結論構文: 制限オフセット、行結論: 同じ行条件では、オフセット値が大きいほど、limitステ...

MySQL の自己結合重複排除に関する注意事項

機能シナリオを簡単に説明しましょう。データ行フィールドは次のとおりです。名前開始日時タイプこの表では...

MySQL Binlog ログ処理ツールの比較分析

目次運河マクスウェルデータバスAlibaba Cloud のデータ転送サービス (DTS)運河ポジシ...

MySQL Workbench の使い方チュートリアルの詳しい説明

目次(I) Workbenchを使用してデータベースを操作する①データベースを作成する② データベー...

Dockerでホストファイルをカスタマイズする方法について簡単に説明します

目次1. コマンド2. docker-compose.yml 3. Dockerファイル4. 直接変...

Linux ファイル/ディレクトリの権限と所有権の管理

1. ファイルの権限と所有権の概要1. アクセス権Read r: ファイルの内容を表示し、ディレクト...

IIS 7.5はURL書き換えモジュールを使用してWebページのリダイレクトを実現します。

Apache では構成ファイルで Web ページまたは Web サイトの書き換えを簡単に設定できる...

ウェブサイト上で flv/MP4 やその他のビデオ ファイルを再生できない問題は、MIME タイプに関連しています。

ウェブサイトを作成している際に、flv や MP4 形式などのビデオ ファイルはローカルでは正常に再...

HTML のインラインブロックの空白を素早く削除する 5 つの方法

inline-block プロパティ値は、「インライン」要素のマージンとパディングを制御する必要があ...