Dockerがコンテナを起動するたびに、IPとホストが指定した操作が実行されます。

Dockerがコンテナを起動するたびに、IPとホストが指定した操作が実行されます。

序文

Dockerを使ってHadoopクラスタを起動するたびに、ネットワークカードの再バインド、IPの固定、/etc/hostsファイルの修正などが必要になります。これは非常に面倒なので、その原因と最適化を探りたいです。

1. 理由

/etc/hosts、/etc/resolv.conf、/etc/hostname の 3 つのファイルはコンテナ内には存在しません。コンテナを起動すると、これらのファイルは mount の形式でコンテナ内にマウントされます。したがって、コンテナ内でこれらのファイルが変更された場合、変更された部分はコンテナの最上位層には存在せず、これら 3 つの物理ファイルに直接書き込まれます。

再起動後に変更が消えてしまうのはなぜですか?その理由は、Docker がコンテナを起動するたびに、新しい /etc/hosts ファイルが再構築されるからです。なぜでしょうか?理由は、コンテナが再起動され、IP アドレスが変更され、hosts ファイル内の元の IP アドレスが無効になるためです。したがって、hosts ファイルを変更する必要があります。そうしないと、ダーティ データが生成されます。

2. 解決策

コンテナを起動するたびに IP とホスト名を指定し、/etc/hosts にホストを追加します。コマンドは次のとおりです。

docker run -itd --name hadoop0 --hostname hadoop0 --net network_my --ip 192.168.10.30 --add-host hadoop1:192.168.10.31 --add-host hadoop2:192.168.10.32 -d -P -p 50070:50070 -p 8088:8088 hadoop:master

Docker ネットワーク モードと構成操作

--hostname : ホスト名を指定します。
--net: ネットワークモードを指定する --ip: IPを指定する
--add-host : /etc/hostsに追加するホストを指定します

上記のコマンドには docker バージョン 1.9 以上が必要です。

コンテナを起動したら、コンテナに入り/etc/hostsを確認します。

[root@centos-linux-7 /]# docker exec -it hadoop0 bash
[root@hadoop0 /]# cat /etc/hosts
127.0.0.1 ローカルホスト
::1 ローカルホスト ip6-ローカルホスト ip6-ループバック
fe00::0 ip6-ローカルネット
ff00::0 ip6-mcastプレフィックス
ff02::1 ip6-全ノード
ff02::2 ip6-オールルーター
192.168.10.31 ハッシュ1
192.168.10.32 ハッシュ2
192.168.10.30 ハッシュ0
[ルート@hadoop0 /]# 

上記のコマンドは長すぎるため、シェル スクリプトとして記述できます。オンラインで言及されている他の方法がいくつかあります。

1. Dockerfileを使用してイメージを構築する

2. docker-composeの使用を開始する

3. Dockerコンテナがパブリックにロードを開始する環境変数の設定ファイルを変更します(私のバージョンの設定ファイルは見つかりませんでした)

最初の方法は機能しないはずです。Dockerfile はイメージをビルドするときに関連する環境変数を設定できますが、前述のように、IP、ホスト名、および /etc/hosts はすべて再読み込みされるため、Docker コンテナの起動時に指定する必要があります。イメージ内のものは受け入れられません。

2 つ目は、私はまだ docker-compose に精通していないため、当面は詳細には説明しません。

3 番目はパブリックであり、異なるコンテナーごとにカスタマイズできないため、私にとっては不便です。

まとめると、コンテナ起動時にコマンドラインで指定するのが一番便利だと思いますが、コマンドラインが長すぎるのが難点です。でも、シェルスクリプトとして書けばいいんですよ!

補足: Linux Docker は固定のコンテナ IP を設定します (Docker のデフォルトのコンテナ IP は変更されます)

1. 独自のネットワークタイプを作成し、ネットワークセグメントを指定します

注文

docker ネットワーク作成 --subnet=172.18.0.0/16 mynetwork

2. イメージの起動時に独自のネットワークIPを指定する

注文

docker run -itd -p 5001:5001 --name イメージ名 --net mynetwork --ip 172.18.0.2 --privileged=true --restart=always -d イメージ名

3. Dockerを再起動してコンテナのIPを表示する

ドッカーを再起動する

注文

サービスdockerの再起動

すべてのコンテナを表示

注文

ドッカーps -a

コンテナ情報の表示

注文

docker コンテナ名を検査する

この方法ではコンテナのIPは変更されません

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

以下もご興味があるかもしれません:
  • シェルスクリプトによるDockerコンテナの起動順序の制御の詳細な説明
  • Dockerは起動されていないコンテナの設定情報を変更します
  • Dockerコンテナ内で2つのプロセスを開始するときのDockerfile実装コード
  • Docker ファイルの保存パス、コンテナの起動コマンド操作の取得
  • Dockerコンテナが起動直後に終了する問題を解決する
  • Docker はすべてのコンテナをバッチ起動して閉じます

<<:  テーブルを作成するための HTML dl、dt、dd タグとテーブル作成テーブル

>>:  Vueはランニングライトのシンプルな効果を実現

推薦する

VMware ESXi のインストールと使用記録(ダウンロード付き)

目次1. ESXiをインストールする2. ESXiをセットアップする3. ESXiを起動するESXi...

MySQLからElasticsearchにデータを同期する方法の詳細な説明

目次1. 同期の原理2. ログスタッシュ入力JDBC 3. go-mysql-elasticsear...

JSはUUIDとNanoIDというユニークなIDメソッドを生成します

目次1. NanoIDがUUIDに取って代わる理由2. jsを生成する方法3. ナノID方式序文:ユ...

Nginxはリバースプロキシを使用して負荷分散プロセス分析を実装します

導入dockerコンテナとdocker-composeに基づいて、Linux環境でのdockerの基...

MySQL マルチテーブルクエリ例の詳しい解説 [リンククエリ、サブクエリなど]

この記事では、例を挙げて MySQL のマルチテーブル クエリについて説明します。ご参考までに、詳細...

MySQL ディープページング問題の解決の実践記録

目次序文ディープページングを制限すると遅くなるのはなぜですか?サブクエリによる最適化B+ツリー構造の...

LinuxにPython 3.6をインストールして落とし穴を避ける

Python 3のインストール1. 依存環境をインストールするPython3 はインストール プロセ...

Vue プロジェクトのパッケージ化、マージ、圧縮により、Web ページの応答速度を最適化します。

目次序文1. リクエスト内容が大きすぎる解決: CDN の紹介リクエストリソースを圧縮する1. HT...

nginxでイメージサーバーを構築する手順の詳しい説明(ルートとエイリアスの違い)

インストール手順は省略します( yum -y install nginx;を使用して直接インストール...

Vueはチャットインターフェースを実装する

この記事の例では、チャットインターフェースの表示を実現するためのVueの具体的なコードを参考までに共...

Websocket+Vuexはリアルタイムチャットソフトウェアを実装します

目次序文1. 効果は図の通りです2. 具体的な実施手順1. Vuexの紹介2.webscoked実装...

ファイル共有サーバーを構築するための samba + OPENldap の詳細な説明

ここでは、samba (ファイル共有サービス) v4.9.1 + OPENldap (バックエンド ...

前後の秒、分、時間、日数を取得するMySQLデータベース

現在の時刻を取得します: current_timestamp を選択します。出力: 2016-06-...

MySQL MyISAM デフォルト ストレージ エンジンの実装原則

デフォルトでは、MyISAM テーブルはディスク上に .frm (テーブル構造ファイル)、.MYD ...

Linux システムで Tomcat のポート 80 を使用する方法

アプリケーションシナリオ多くの場合、Linux サーバーに tomcat や nginx などのソフ...