Docker コンテナ アプリケーションで避けるべき 10 の悪い習慣

Docker コンテナ アプリケーションで避けるべき 10 の悪い習慣

コンテナが企業の IT インフラストラクチャに欠かせない要素となっていることは間違いありません。コンテナには次のような多くの利点があります。

  • まず、コンテナは不変です。つまり、オペレーティング システム、ライブラリのバージョン、構成、フォルダー、アプリケーションはすべてコンテナ内にパッケージ化されます。 QA でテストしたのと同じイメージが、同じ動作で本番環境に到達することを保証します。
  • 2 つ目: コンテナは軽量です。コンテナのメモリ フットプリントは小さくなります。コンテナは、数百または数千 MB ではなく、メイン プロセスにのみメモリを割り当てます。
  • 3 つ目: コンテナは非常に高速です。一般的な Linux プロセスを開始するのと同じくらい速くコンテナを開始できます。新しいコンテナを数分ではなく数秒で起動できます。

しかし、多くのユーザーは依然としてコンテナを一般的な仮想マシンのように扱い、コンテナには使い捨てであるという重要な特性があることを忘れています。

この特性により、ユーザーはコンテナの取り扱いと管理方法に関する視点を変える必要に迫られます。では、コンテナを最良の状態に保つにはどうすればよいでしょうか? Docker コンテナで避けるべき 10 のことを紹介します。

1. コンテナにデータを保存しない

コンテナを停止、破壊、または交換できるためです。コンテナ内で実行されているアプリケーションのバージョン 1.0 は、影響やデータ損失なしに、バージョン 1.1 に簡単に置き換えられる必要があります。したがって、データを保存する必要がある場合は、バッチで保存します。この場合、2 つのコンテナーが同じボリュームにデータを書き込むと破損する可能性があるため、注意が必要です。アプリケーションが共有データ ストアに書き込むように設計されていることを確認してください。

2. アプリケーションを2部に分けて提出しない

コンテナを仮想マシンのように考える人もいますが、ほとんどの人は、実行中の既存のコンテナにアプリケーションをデプロイする必要があると考えがちです。開発フェーズでは、継続的にデプロイとデバッグを行う必要があります。これは当然のことです。ただし、QA および本番環境向けの継続的デリバリー (CD) パイプラインの場合、アプリケーションはイメージの一部である必要があります。

3. 大きな画像を作成しない

大きな画像は配布しにくいからです。アプリケーション/プロセスを実行するために必要なファイルとライブラリのみがあることを確認してください。不要なパッケージをインストールしたり、多くのファイルを新しいイメージ レイヤーにダウンロードする「更新」を実行したりしないでください。

4. 単層画像を使用しない

階層化ファイル システムを効果的に活用するには、オペレーティング システム用の独自のベース イメージ レイヤー、ユーザー名定義用の別のレイヤー、ランタイム インストール用の別のレイヤー、構成用の別のレイヤー、最後にアプリケーション用の別のレイヤーを常に作成します。画像の再作成、管理、配布が容易になります。

5. 実行中のコンテナからイメージを作成しない

つまり、イメージを作成するために「docker commit」を使用しないでください。この画像作成方法は再現不可能なので、完全に避けるべきです。常に完全に再現可能な Dockerfile またはその他の S2I (ソースからイメージ) アプローチを使用してください。Dockerfile をソース管理リポジトリ (git) に保存すると、Dockerfile への変更を追跡できます。

6. 「最新」タグだけを使うのはやめましょう

Maven ユーザーにとって、最新のタグは「スナップショット」のようなものです。コンテナの階層化ファイルシステムの性質上、タグの使用が推奨されます。数か月後にイメージをビルドし、親レイヤー (Dockerfile の FROM) が下位互換性のない、またはバグのある新しいバージョンに置き換えられ、ビルド キャッシュから「最新」バージョンが取得されたためにアプリケーションが実行されないことがわかっても、驚くことはありません。また、コンテナを本番環境にデプロイするときには、「最新」タグの使用を避ける必要があります。そうしないと、実行しているイメージのバージョンがわからなくなってしまいます。

7. 単一のコンテナ内で複数のプロセスを実行しないでください。

コンテナは単一のプロセス (http デーモン、アプリケーション サーバー、データベース) を実行するのに最適ですが、複数のプロセスがある場合は、プロセスを個別に管理、ログを取得、更新するのが難しくなる可能性があります。

8. 資格情報を画像に保存しないでください。

環境変数を使用してください。イメージ内にユーザー名やパスワードをハードコードしないでください。環境変数を使用して、コンテナ外部からその情報を取得します。この原則の良い例は、Postgres ミラーリングです。

9. プロセスをルートとして実行しない

「デフォルトでは、Docker コンテナはルート ユーザーとして実行されます。Docker が成熟するにつれて、より安全なデフォルトが提供される場合があります。現在、ルート ユーザーを要求することは他のユーザーにとって危険であり、すべての環境で利用できるとは限りません。イメージでは、USER ディレクティブを使用して、コンテナを実行するための非ルート ユーザーを指定する必要があります。

10. IPアドレスに頼らない

各コンテナには独自の内部 IP アドレスがあり、コンテナを起動および停止すると変更される可能性があります。アプリケーションまたはマイクロサービスが別のコンテナと通信する必要がある場合は、環境変数を使用して、正しいホスト名とポートをあるコンテナから別のコンテナに渡します。

上記は、Docker コンテナのアプリケーションにおける 10 の悪い習慣の詳細です。Docker コンテナのアプリケーションの詳細については、123WORDPRESS.COM の他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • Dockerコンテナオーケストレーション実装プロセス分析
  • Docker データボリュームコンテナの作成と使用状況分析
  • Dockerコンテナのデータボリュームの詳細な説明
  • Spring Boot プロジェクトで Docker イメージを生成し、コンテナのデプロイを完了する方法
  • Dockerコンテナ内にkibanaトークナイザーをインストールする方法
  • Dockerで最もよく使われるイメージコマンドとコンテナコマンドの詳細な説明
  • Dockerコンテナの構築と実行のプロセスの詳細な説明
  • Dockerコンテナのネットワークポート設定プロセスの詳細な説明

<<:  MySQL SQL文を最適化するためのヒント

>>:  vue+openlayer をベースにマップの集約と散乱効果を実現

推薦する

MySQL 独立インデックスと共同インデックスの選択

複数列のインデックスについては、理解が不足していることがよくあります。よくある間違いは、多数の列に独...

docker を使用して Linux 環境に Springboot パッケージをデプロイするチュートリアル

springboot には tomcat サーバーが組み込まれているため、jar パッケージにパッケ...

CSS3は水平方向の中央揃え、垂直方向の中央揃え、水平方向と垂直方向の中央揃えのサンプルコードを実装しています。

フロントエンドの担当者であれば、面接でも仕事中でも、「CSS を使用して中央揃えにする」という効果に...

vue3.0 のウォッチ リスナーの例の詳細な説明

目次序文リスナーと計算プロパティの違いvue3 で watch を使用するにはどうすればいいですか?...

単一選択折りたたみメニュー機能を実現するCSS

前回の「最もシンプルなスイッチを実現するCSS」のように、HTML5とCSS3でほとんどの機能をすで...

CSS3 マウスホバー遷移ズーム効果

以下は、純粋な CSS で記述された画像マウスホバーズーム効果です。実際、基本原理は非常に単純です。...

追加、削除、変更、クエリを実行するための JS 操作オブジェクト配列のサンプルコード

1. はじめに最近、私は友人が JSON 配列を追加、削除、変更するための簡単なページを作成するのを...

Dockerでspringcloudプロジェクトをデプロイする方法

目次Dockerイメージのダウンロードmysqlとnacosを起動する独自のJavaプロジェクトを変...

dubbo での Zookeeper リクエストのタイムアウト問題: mysql8.0.15 に接続する mybatis+spring の構成

ここ2日間Javaを復習するつもりなので、練習にdubboを使ってショッピングモールプロジェクトを書...

MySQL マスタースレーブ同期遅延の原因と解決策

歴史的な理由により、MySQL レプリケーションは、REDO ログではなく論理バイナリ ログに基づい...

Ubuntu 20.04 ダブルピンイン入力方式のインストール手順

1. 中国語入力方法を設定する 2. ダブルスペルモードを設定する 3. 注意事項20.04 で S...

JavaScriptで計算機機能を実現するプロセスの詳細な説明

目次1. 電卓機能の紹介2. 計算機ページのデザイン1. ナビゲーションバー2. データ部分3. i...

Nginx 1つのドメイン名で複数のプロジェクトにアクセスする方法の例

背景最近、複数のプロジェクトを展開する際に、1 つのドメイン名で複数のプロジェクトにアクセスする方法...

Alipay の新しいホームページのフロントエンドの実践的な概要

もちろん、ページ パフォーマンスの最適化に関する個人的な経験も含まれています。ここでいくつかの点につ...