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 に接続する方法

推薦する

jQueryはフォーム検証機能を実装します

jQuery フォーム検証の例 / ユーザー名、パスワード、住所、電子メールの検証を含む下記の通り ...

JavaScriptのプリコンパイルを見てみましょう(概要)

JSランニング三部作js実行コードは3つのステップに分かれています構文解析プリコンパイル解釈Jav...

純粋な CSS で実装された大きなドロップダウン メニューのサンプル コード

これは純粋に CSS で実装された大きなドロップダウン メニューです。この大きなメニューは、js コ...

MySQL Community Server 8.0.12 のインストールと設定方法のグラフィックチュートリアル

MySQL 8 は、NoSQL、JSON などのサポートなど、まったく新しいエクスペリエンスをもたら...

Centos7環境でYUMを構築する方法

1. yumソースの設定ファイルを入力します 2.lsで設定ファイルを表示する 3. ディレクトリを...

MySQL スケジュールタスク例チュートリアル

序文MySQL 5.1.6 以降、非常にユニークな機能であるイベント スケジューラが追加されました。...

Alibaba Cloud ECS クラウド サーバー (Linux システム) は、MySQL をインストールした後にリモートで接続できません (落とし穴)

昨日、1年間使用していた Alibaba Cloud サーバーを購入しました。システムは Linux...

MySQL でのサブクエリの基本的な使用法

目次1. サブクエリの定義2. サブクエリの分類1. スカラーサブクエリ: 2. MySQLサブクエ...

MySQL Innodbの主な機能挿入バッファ

目次挿入バッファとは何ですか?挿入バッファのトリガー条件は何ですか?なぜ一意のインデックスにできない...

XHTML 入門チュートリアル: XHTML ハイパーリンク

ハイパーリンクはインターネット全体を接続していると言っても過言ではありません。ハイパーリンクは、別の...

ユーザーはその理由を知る必要がある

証券会社にいた頃、設計業務が忙しくなかったため、商品のマニュアルを書く役割を担ったことがありました。...

Mac でソースコードから MySQL 5.7.17 をコンパイルしてインストールするチュートリアル

1. ダウンロードして解凍します: /Users/xiechunping/Softwares/mys...

UTF-8 および GB2312 ウェブエンコーディング

最近、多くの学生から Web ページのエンコーディングについて質問を受けています。gb2312 と ...

MySQLトリガーの詳細な説明と簡単な例

MySQLトリガーの簡単な例文法CREATE TRIGGER <トリガー名> -- トリ...

JavaScript で DOM 要素を監視する MutationObServer の詳細

1. 基本的な使い方これは MutationObserver コンストラクターを通じてインスタンス化...