Dockerコンテナ内のホストのホスト名が取得できない問題の解決方法

Dockerコンテナ内のホストのホスト名が取得できない問題の解決方法

Node.js環境でテストが通っています。他の言語でも同様です。環境変数を取得する方法を使うだけです。

アイデア:

docker コンテナとホスト環境は分離されていますが、docker コンテナの起動時にホスト名を環境変数として渡し、コードでコンテナ内の値を取得できます。

操作:

docker run -d -p 3000:3000 --name myTest -e HOST_Q=$(hostname) mytest:v1 # -eパラメータを使用して環境変数を渡します。値はホスト名です。

yml ファイルの使用を開始する場合:

バージョン: '3'
サービス:
 マイスク:
 イメージ:mysql:v1
 コンテナ名: xx-mysql
 再起動: 常に
 ネットワーク:
  - ホスト
 環境:
  -MYSQL_ROOT_PASSWORD=xxx0209
  - HOST_Q=$(ホスト名) # ここでポートを設定します:
  -3306:3306
 ボリューム:
  - /opt/data/mysql:/var/lib/mysql:z

起動が成功すると、コンテナ内の環境変数に HOST_Q が追加されます。次に、プログラムを使用してそれを取得します。

ノードJS:

# プロセスから環境変数オブジェクトを取得します。let env = process.env;
console.log(JSON.stringify(env));
# env['HOST_Q']は取得する最終的なホスト名です# 出力
[2019-04-17T06:54:12.951Z] [e1e7115e0a33] [情報]: {"NODE_VERSION":"8.9.4","HOSTNAME":"e1e7115e0a33","YARN_VERSION":"1.3.2","HOME":"/root","HOST_Q":"emg-ubuntu-pub02","PATH":"/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin","PWD":"/"}

ジャワ:

パブリッククラステスト{
 パブリック静的voidメイン(String[] args) {
  Map<String, String> map = System.getenv();
  文字列ホスト名 = map.get("HOST_Q");
  System.out.println(ホスト名); 
 }
}

補足: dockerコンテナがホストにアクセスできず、ホストへのルートがないと報告される

1. 問題の説明

docker に nacos をデプロイするときに、ホストへのルートがないため、nacos コンテナがホストの docker データベースに接続できないという問題が発生しました。

次に、nacos コンテナに入り、ホスト マシンのアドレスを ping しました。結果は接続されました。次に、telnet を使用してポート 3306 をテストしたところ、結果にもこの例外が報告されました。

理由は何ですか?外部からはデータベースに正常にアクセスできるのですが、ホストマシン内のコンテナにアクセスできないのでしょうか?

2. 原因分析

Docker をデプロイするときは、ブリッジ モードを使用します。

Docker を起動すると、Docker プロセスはホストとコンテナ間の通信用に docker0 という名前の仮想ブリッジを作成します。 docker コンテナが起動すると、docker コンテナは仮想ブリッジに接続され、コンテナ内のメッセージは docker0 を介して外部に転送されます。

docker コンテナがホスト マシンにアクセスすると、docker0 ブリッジはメッセージをローカル マシンに直接転送し、メッセージの送信元アドレスは docker0 ネットワーク セグメントのアドレスになります。 Docker コンテナがホストマシン以外のマシンにアクセスする場合、Docker の SNAT ブリッジはメッセージの送信元アドレスをホストマシンのアドレスに変換し、ホストマシンのネットワーク カードを介して送信します。

そのため、Docker コンテナがホスト マシンにアクセスするときに、ホスト マシンのサービス ポートがファイアウォールによってブロックされている場合、ホスト マシンに接続できず、「ホストへのルートがありません」というエラーが表示されます。

ホストマシンが配置されている LAN 内の他のマシンにアクセスする場合、メッセージの送信元アドレスはホストマシンの IP であるため、宛先マシンのファイアウォールによってブロックされず、アクセスできます。

3. 解決策

1> ホストのファイアウォールをオフにする

systemctl 停止 ファイアウォール

2> ファイアウォールで指定されたポートを開発する

ファイアウォールコマンド --zone=public --add-port=3306/tcp --permanent
ファイアウォールコマンド --zone=public --add-port=3307/tcp --permanent
ファイアウォール-cmd --reload

注意: ファイアウォール操作が完了したら、次のように docker を再起動することをお勧めします: systemctl restart docker。そうしないと、仮想ブリッジの障害により、コンテナーで iptables 失敗の問題が発生します。

IV. 要約

Docker コンテナのネットワーク接続は、コンテナ間、コンテナとホスト間、ホスト間のアクセスにおいて常に問題となっているため、コンテナのネットワーク接続に関しては、ネットワークの問題に注意してください。

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

以下もご興味があるかもしれません:
  • Dockerでコンテナを作成するときのディレクトリ権限
  • DockerでMySQLコンテナを作成する簡単な手順
  • DockerでMySQLコンテナを作成し、コマンドラインからコンテナに接続する方法の詳細な説明
  • DockerでMySQLコンテナを作成する方法
  • Dockerがコンテナを作成した後にホスト名を変更する詳細なプロセス

<<:  MySQL オンライン DDL ツール gh-ost 原理分析

>>:  JavaScript の instanceof メソッドの手動実装

推薦する

Dockerコンテナ間で通信する3つの方法

Docker コンテナは互いに分離されており、相互にアクセスできないことは誰もが知っていますが、依存...

JS 手ぶれ補正機能の実装と使用シナリオ

目次1. 手ぶれ補正機能とは何ですか? 1. なぜ手ぶれ補正機能が必要なのでしょうか? 2. 手ぶれ...

MySQL初心者のための基本操作のまとめ

図書館運営クエリ1.SHOW DATABASE; ----すべてのデータベースを照会する2. SHO...

Jenkins+tomcat の自動ホットデプロイメント/再起動と発生した問題の解決策 (推奨)

1. 背景同社のプロジェクトは、これまでは手動で Maven でパッケージ化し、サーバーにアップロ...

MySQL全文検索の使用例

目次1. 環境整備2. データの準備3. ショーを始める4. 単語分割エンジン要約する参考文献1. ...

フレックスレイアウトは左のテキストオーバーフローを実現し、右のテキストの適応を省略します

テキストの長さに応じて、左側のテキストの幅を自動調整できる状況を実現したい。1行が表示できない場合、...

CentOS 8 VMware 仮想マシンがインターネットにアクセスするための静的 IP ネットワーク カードの設定の詳細な説明

最初のステップ: VMwareで、「編集」-「仮想ネットワークエディタ」をクリックします。下図に示す...

Linux ネットワークプログラミング機能の簡単な分析

目次1.ソケットを作成する2. ソケットをバインドする3. 聞き手を作る。聞く4. 接続が受け入れら...

docker コンペ応募でよく使われるコマンドのまとめ

アカウントにログイン DOCKER_REGISTRY=registry.cn-hangzhou.al...

Javascript 操作メカニズム イベントループ

目次1. 4つのコンセプト1. JavaScriptはシングルスレッドです2. タスクキュー3. 同...

Linuxファイル削除後にスペースが解放されない問題の詳しい説明

序文システム領域の使用量が大きすぎて消去する必要がある場合、または特定のファイルを消去する必要がある...

web.config (IIS) および .htaccess (Apache) の構成

xml <?xml バージョン="1.0" エンコーディング="...

JavaScript で長い画像のスクロール効果を実装する

この記事では、JavaScriptの長い画像スクロールの具体的なコードを参考までに共有します。具体的...

MySql エラー 1698 (28000) の解決策

1. 問題の説明: MysqlERROR1698 (28000) の解決方法、新しくインストールされ...

CocosCreatorオブジェクトプールの使い方

目次序文:特定の操作ステップ1: プレハブを準備するステップ2: オブジェクトプールを初期化するステ...