Docker の使用上の注意

Docker の使用上の注意

著者: jakieli

1. Docker を使用する理由

当社では、レポートのプレゼンテーションに社内プラットフォームを使用する必要があります。社内プラットフォームでサポートされているデータベースはすべて正式な環境または IDC 環境であるため、ビジネス ロジックも正式な環境または IDC 環境に展開する必要があります。自社開発のリソースがクラウド上に置かれたため、テンセントは、ユーザーが IDC リソースを社内で使用する際に IDC リソースを別途申請することを推奨しなくなりました。代わりに、コンテナ サービスを使用してリソースを申請および使用することをお勧めします。具体的には、Docker を使用してテスト環境でビジネスのイメージを作成し、そのイメージをイメージ リポジトリにアップロードして、コンテナー サービスからイメージを起動する必要があります。そのため、docker を使用する必要性が生じます。

2. Dockerとは何か

Docker は、ユーザーがアプリケーションを迅速に構築、テスト、デプロイできるようにするオープン ソース プラットフォームです。 Docker は、ソフトウェアとその依存関係を軽量でポータブルなコンテナーにパッケージ化することでこれを実現します。これらのコンテナーは、コード、ランタイム、ライブラリ、環境変数、システム ツールなど、アプリケーションの実行に必要なすべてのものが含まれるスタンドアロンの実行可能パッケージです。

Docker の重要な機能は、環境の違いを保護できることです。つまり、アプリケーションとその依存関係が Docker コンテナにパッケージ化されている限り、アプリケーションはどの環境で実行されても一貫して動作します。これにより、「自分の環境では動作する」という問題がなくなり、「一度ビルドすればどこでも実行できる」という目標が達成されます。

Docker のもう 1 つの利点は、迅速な展開です。 Docker は、コンテナの起動が非常に速く、1 つのコンテナ内のプログラムが正しく実行されることを保証している限り、実稼働環境にデプロイされているコンテナの数に関係なく、正しく実行されることを確信できるため、迅速なアプリケーション デプロイに最適です。

Docker の主要コンポーネントには、Dockerfile ファイル、Docker イメージ、Docker コンテナが含まれます。 Dockerfile は、Docker イメージを組み立て、その内部に何が含まれるかを定義するコマンドを含むスクリプトです。 Docker イメージは、Docker コンテナを作成するために使用される読み取り専用テンプレートです。 Docker コンテナは、Docker イメージから起動される実行中のインスタンスです。

Docker は、アプリケーションの展開プロセスを簡素化し、開発者に移植性、一貫性、効率性を提供するため、広く使用されています。 Docker の革新的な点は、プログラムのすべての依存関係をまとめてパッケージ化することで、環境管理を実行する際の面倒な手順を簡素化できることです。

3. Dockerの使い方

1. Dockerのインストール

docker のインストール コマンドは、オペレーティング システムによって異なります。今回はUbuntuを例にdockerのインストール方法を説明します。次の手順はすべて、Hunyuan 大規模言語モデルの戻りから派生したものです。

Ubuntu に Docker をインストールするには、次の手順に従います。

(1)パッケージインデックスを更新する:

 sudo apt-get update

(2)依存関係をインストールする:

 sudo apt-get install apt-transport-https ca-certificates curl software-properties-common

(3)公式Docker GPGキーを追加します。

 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

(4)Dockerの安定版のリポジトリを設定します。

 echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

(5)パッケージインデックスを更新する:

 sudo apt-get update

(6)Dockerをインストールする:

 sudo apt-get install docker-ce docker-ce-cli containerd.io

(7)Dockerが正常にインストールされたことを確認します。

 sudo docker --version

Hunyuan モデルに記載されている手順に従ってインストールを実行しましたが、手順 4 ~ 6 で問題が発生しました。環境内の lsb_release 実行エラー:

 Traceback (most recent call last): File "/usr/bin/lsb_release", line 25, in <module> import lsb_release ModuleNotFoundError: No module named 'lsb_release'

このエラーを解決するために長い時間を費やしましたが、それでもうまくいかず、最終的には回り道をして解決しました。理論的には、4 番目のステップの目的は、現在のシステムの安定した Docker バージョンを指定することです。これは、次のコマンドで置き換えることができます。

 codename=$(cat /etc/os-release | grep "VERSION_CODENAME" | cut -d "=" -f 2)

手順 4 で codename の値を $(lsb_release -cs) に置き換え、手順 6 を実行して成功します。それでも実行が失敗する場合は、新しいファイル /etc/apt/sources.list.d/docker.list を作成し、手順 4 の前半を次のように置き換えます。

 deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu bionic stable

ファイルに書き込みます。「bionic」は上記のコード名です。このコマンドは正しく記述する必要があることに注意してください。 deb で始まる必要があり、stable の前にコード名の値が必要です。

2. 画像を生成する

(1)Dockerfileを作成する

イメージを構築する最初のステップは、Dockerfile を作成することです。私の場合は、公式ドキュメントを参考に、Hunyuan プラットフォームを使用して、ほぼ使用可能な Dockerfile を生成しました。 Hunyuan との会話は次のとおりです (もちろん、最初は要件をそれほど明確に伝えませんでしたが、数回の会話の後、要件は次のように最適化されました。

写一个Dockerfile,满足下面的要求: 0、创建一个Ubuntu镜像1、在docker中安装python3 2、使用requirements.txt安装依赖3、把accuracy_recall_for_ehp、cos_log_download_process和test_rule_checker三个文件夹拷贝到docker中4、写一个start.sh,在脚本中分别使用python来启动accuracy_recall_for_ehp、cos_log_download_process和test_rule_checker三个文件夹中的main.py,每个python脚本的执行记录都写到日志文件中,且每个程序保持在后台运行5、使用start.sh作为docker的启动命令

Hunyuan の戻り値は次のとおりです。

 # 0. 创建一个Ubuntu镜像FROM ubuntu:latest # 设置工作目录WORKDIR /app # 1. 在docker中安装python3 RUN apt-get update && \ apt-get install -y python3 python3-pip # 2. 使用requirements.txt安装依赖COPY requirements.txt . RUN pip3 install -r requirements.txt # 3. 把accuracy_recall_for_ehp、cos_log_download_process和test_rule_checker三个文件夹拷贝到docker中COPY accuracy_recall_for_ehp cos_log_download_process test_rule_checker /app/ # 4. 写一个start.sh,在脚本中分别使用python来启动accuracy_recall_for_ehp、cos_log_download_process和test_rule_checker三个文件夹中的main.py,每个python脚本的执行记录都写到日志文件中,且每个程序保持在后台运行RUN echo '#!/bin/bash' > start.sh && \ echo 'python3 /app/accuracy_recall_for_ehp/main.py > /app/accuracy_recall_for_ehp.log 2>&1 &' >> start.sh && \ echo 'python3 /app/cos_log_download_process/main.py > /app/cos_log_download_process.log 2>&1 &' >> start.sh && \ echo 'python3 /app/test_rule_checker/main.py > /app/test_rule_checker.log 2>&1 &' >> start.sh && \ chmod +x start.sh # 5. 使用start.sh作为docker的启动命令CMD ["/app/start.sh"]

テスト後、この Dockerfile が利用可能になります。ある側面から見ると、大規模言語モデルは作業効率の向上に非常に効果的であることも示しています。

(2)ミラーリポジトリ

Docker イメージを正式に作成する前に、イメージ リポジトリについて説明しましょう。

①ミラーリポジトリとは?

イメージ リポジトリは、ソフトウェア イメージ (Docker イメージなど) を保存、配布、取得するための集中型サービスです。イメージ リポジトリを使用する理由はいくつかあります。

  • 利便性: イメージ リポジトリを使用すると、ユーザーはローカル イメージを構築せずに、事前に構築されたイメージをすばやく取得して実行できます。これにより、時間とリソースが節約され、開発効率が向上します。
  • バージョン管理: ミラー リポジトリを使用すると、ユーザーはソフトウェアのバージョン履歴を追跡およびトレースでき、ソフトウェアを以前のバージョンに簡単にロールバックできます。これは、運用環境でのトラブルシューティングや問題の修正に非常に役立ちます。
  • セキュリティ: イメージ リポジトリを使用すると、ユーザーはイメージへのアクセス権を集中的に管理および制御できます。これにより、不正アクセスや潜在的な悪意のある攻撃を防ぐことができます。
  • コラボレーション: ミラー リポジトリは、複数の人が同じプロジェクトで共同作業することをサポートします。リポジトリにイメージを保存することで、チーム メンバーはソフトウェア イメージを簡単に共有および同期できるため、チームのコラボレーションの効率が向上します。
  • スケーラビリティ: イメージ リポジトリは、多数のユーザーとイメージを簡単にサポートできます。これは、大規模な組織や企業がソフトウェア イメージを世界中に配布および展開するのに非常に役立ちます。

要約すると、イメージ リポジトリを使用すると、ユーザーはソフトウェア イメージをより迅速かつ安全に、便利に管理および配布できるため、開発効率とチームのコラボレーションが向上します。

② よく使われる画像リポジトリ

一般的に使用される Docker リポジトリには次のものがあります。

  • Docker Hub: Docker が公式に提供するパブリック リポジトリで、多数の公式イメージとコミュニティによって管理されているイメージが含まれています。ユーザーは、docker pul コマンドを使用して Docker Hub からイメージを取得できます。
  • プライベート ウェアハウス: カスタム イメージを保存および管理するためにローカルまたはプライベート ネットワーク内に構築できるプライベート Docker ウェアハウス。一般的なプライベート リポジトリには、Docker Registry、Harbor などがあります。
  • サードパーティのリポジトリ: Docker Hub とプライベート リポジトリに加えて、特定の分野や目的向けのイメージを提供するサードパーティの Docker リポジトリもいくつかあります。たとえば、Google Cloud Container Registry、AWS Elastic Container Registry などです。
  • その他のパブリック リポジトリ: Docker Hub に加えて、Quay.io、Azure Container Registry など、さまざまなイメージやサービスを提供するパブリック リポジトリもいくつかあります。

これらのリポジトリは、ユーザーに便利で安全かつ効率的な Docker イメージの保存および配布ソリューションを提供し、ユーザーがアプリケーションをより適切に管理および展開できるようにします。

(3)Dockerfileを使ってイメージを作成する

Dockerfile を生成したら、Dockerfile を使用してイメージを生成します。ローカルでテストするだけの場合は、docker build コマンドを使用できます。

 sudo docker build -t my-image .

イメージをイメージリポジトリに保存する場合は、イメージを作成するときに、イメージの名前をより「詳細」で美しくする必要があります。具体的には、コンテナ サービスで後で使用するためにイメージをイメージ リポジトリに保存する場合は、イメージに名前を付けるときに、後で使用する必要があるイメージ リポジトリのアドレスと個人用フォルダーをイメージ名に書き込む必要があります。最初にテスト用の個人用イメージを作成することをお勧めします。独自の倉庫アドレスを作成したら、イメージをビルドするときに、イメージ名として倉庫アドレスを指定する必要があります。

 sudo docker build -t myusername/myimage:latest .

その中でも最新のものは倉庫のタグです。イメージを作成した後、次のコマンドを使用して、イメージが正常に作成されたかどうかを確認できます (結果は投稿されませんが、成功したかどうかは一目でわかります)。

 sudo docker images

3. 画像を開始する

イメージを作成したら、次のコマンドで起動できます。

 sudo docker run -d -p 80:80 --name test-container myusername/myimage

test-container は、イメージが起動された後のコンテナの名前です。起動後、次のコマンドを使用してコンテナの現在の実行ステータスを確認できます。

 sudo docker ps -a

返される形式は次のとおりです。

ps の代わりに ps -a を使用することをお勧めします。 ps -a を使用すると、過去に停止されたコンテナも含め、すべてのコンテナのステータスを表示できます。

(1)コンテナの稼働状況

前述のように、ps -a コマンドを使用してコンテナの現在の実行ステータスを表示できます。STATUS 列には、さまざまなコンテナの現在の実行ステータスが表示されます。 STATUS の可能な値には、Up、Exited、Created、Restarting、Removing、Dead などがあります。これらの値の具体的な意味は次のとおりです。

  • Up: コンテナは実行中です。
  • 終了: コンテナが終了しました。これは通常、コンテナ内のメイン プロセスが完了し、正常に終了したことを意味します。
  • 作成済み: コンテナは作成されましたが、まだ起動されていません。
  • 再起動中: コンテナが再起動しています。
  • 削除中: コンテナを削除中です。
  • デッド: コンテナがデッドになりました。通常、コンテナ内のメイン プロセスがクラッシュしたか終了したことを示します。

① 検査コマンド

上記の値は、Docker のバージョンとオペレーティング システムによって異なる場合があります。より詳細な情報を取得するには、docker inspect コマンドを使用してコンテナの詳細情報を表示します。例えば:

 docker inspect 9c436ea546b9

検査コマンドの戻り値は、オブジェクトのすべてのプロパティと構成を含む JSON ファイルです。一般的なフィールドには、「Id」、「Name」、「State」、「Mounts」、「NetworkSettings」などの値が含まれます。ここでは詳しくは説明しませんので、興味のある方はご自身で試してみてください。

②退出理由分析

STATUS の Exited ステータスに戻りましょう。このステータスのさまざまな値は、コンテナが終了した理由を反映している可能性があります。 Docker ps コマンドの STATUS 列に Exited と表示されている場合、コンテナが終了したことを意味します。 Exited の後の数字は、コンテナが終了したときのステータス コードを示します。ステータス コード 0 はコンテナーが正常に終了したことを示し、ステータス コード 0 以外の場合はコンテナーが異常終了したことを示します。

ゼロ以外のステータス コードは通常、コンテナーの実行中にエラーが発生したことを示します。以下に、一般的なゼロ以外のステータス コードとその意味を示します。

  • 1: 一般的な不明なエラー
  • 2: 適用できないシェルまたは構文エラー
  • 126: コマンドは実行できません
  • 127: コマンドが見つかりません
  • 128: 終了パラメータが無効です
  • 128+n: シグナルnによってプログラムが終了しました
  • 130: Ctrl+C によってプログラムが終了しました
  • 255: 終了ステータス コードが有効範囲外です

これらのステータス コードは一意ではなく、特定のステータス コードはアプリケーションごとに異なる場合があることに注意することが重要です。

③ ログコマンド

実際の使用時には、エラーに関するより詳細な情報を取得するためにコンテナのログを確認することをお勧めします。コンテナが実行後に Exited 状態になっている場合は、inspect コマンドを使用して現在の終了の考えられる理由を表示するだけでなく、docker logs コマンドを使用してコンテナの実行中のログを表示することもできます。具体的なコマンドは以下のとおりです。

 sudo docker logs 9c436ea546b9

「9c436ea546b9」は Container_Id です。実際のアプリケーションでは、プロセスが異常終了した理由を調べるために logs コマンドを使用しました。

 ubuntu@VM-77-147-ubuntu:~$ sudo docker logs 5ade7c784050 start.sh: line 7: ture: command not found

スクリプトが間違って書かれていて、true が ture と書かれていました (これは私が Hunyuan の戻り値に基づいて書いた数少ないコードの 1 つで、これも人々がそれほど信頼できないことを示しています)。笑。

さらに、起動スクリプトで nohup を使用してアプリケーションを起動し、プログラムの実行ログをファイルにリダイレクトすることをお勧めします。スクリプトがデーモン プロセスのみを起動する場合は、起動スクリプトの後にループ ステートメントまたは wait コマンドを追加して、イメージを継続的に実行できるようにすることができます。

4. コンテナに入る

コンテナに入るには、次のコマンドを使用できます。

 sudo docker exec -it “CONTAINER ID” /bin/sh

CONTAINER ID は、上記の docker ps コマンドによって返される最初の列です。コンテナに入った後は、ローカル システムと同じようにデバッグできます。スクリプトや他のコマンドを起動することで、実行したいコマンドが正しいかどうかを確認できます。

5. 容器を閉じる

一般的に、ローカルでデバッグする場合は、次のコマンドを使用してコンテナをシャットダウンできます。

 sudo docker stop “CONTAINER ID”

CONTAINER ID は、上記の docker ps コマンドによって返される最初の列です。 stopコマンドを使用した後、ps -aコマンドを再度呼び出して、現在のdockerプロセスの状態を表示できます。

6. 画像をプッシュする

ローカル テストに合格したら、次のコマンドを使用して、生成されたイメージをイメージ リポジトリにプッシュできます。

 sudo docker push myusername/myimage:latest

このとき、3.2.3 で述べたイメージ作成時に指定した -t name が効いてきます。ここで、イメージのコマンドを指定してプッシュします。プッシュが成功すると、ウェアハウスで、myusername ディレクトリの下のタグが最新のミラーであることを確認できます。

7. 画像を更新する

テスト中に、いくつかの環境上の問題が発生しました (ここではイメージを更新する方法の例を示します。環境上の問題は後で他の手段で解決されました)。たとえば、Python 3.12 を使用する必要がありますが、Python 3.12 は公式の Python Web サイトで正式にサポートされていません。 apt-install ではインストールできず、次のコマンドを実行すると失敗します。

 sudo add-apt-repository ppa:deadsnakes/ppa

PPA のインストールに失敗しました。少し努力しましたが、問題は解決しませんでした。このとき、Python 3.12 をローカルにインストールし、Python 3.12 のインストールフォルダをダウンロードして、このフォルダをイメージにコピーし、3.4 で述べた方法を使用してコンテナに入り、Python 3.12 のパスを入力して ./configure、make -j、make altintall を通じてインストールするという回り道も考えました。インストール成功後の結果:

このとき、コンテナを終了し、docker commit メソッドを使用して前回の操作を保存します。 docker commit の定義は docker --help から確認できます。

 commit Create a new image from a container's changes

このことから、コミットの役割は現在のコンテナに変更を保存することであることがわかります。具体的なコマンドは次のとおりです。

 sudo docker commit 10074a786927 myusername/myimage:v2

ここで、「10074a786927」は上記の「コンテナ ID」です。送信が成功したら、イメージリポジトリにプッシュします。

8. コンテナを削除する

3.3 ではコンテナの起動方法について説明し、3.4 ではコンテナに入る方法について説明します。これら 2 つのポイントに加えて、docker ps -a コマンドを使用して、コンテナの現在の実行ステータスを表示することもできます。コマンドの戻り結果には、コンテナの名前が表示されます。いくつかのコンテナを削除したい場合は、次のコマンドを使用して削除できます。

 sudo docker rm my_container

ここで、my_container はコンテナの名前です。

9. 画像を削除する

前回の 3.2.3 では、docker イメージを使用して現在のイメージのステータスを表示できることを説明しました。一部のイメージが不要になり、削除する必要がある場合は、次のコマンドを使用して削除できます。

 sudo docker rmi image_id

ここで、image_id は画像の ID です。

4. イメージの展開

イメージをウェアハウスにアップロードした後、独自のコンテナ構成プラットフォームにイメージをデプロイできます。イメージの展開環境やプラットフォームはそれぞれ異なるため、展開については独自のプラットフォーム構成ガイドを参照してください。ここでは例を挙げません。

<<:  適切なクラウド サービス プロバイダーを選択するにはどうすればよいでしょうか? IDCの見解を見る

>>:  Kubernetes PodでIPアドレスを取得する方法

推薦する

著作権法改正案が発表され、著作権侵害に対する賠償金は最大100万元となる。

著作権法改正案では、インターネットに関するいくつかの規定が定められている。侵害に対する賠償金は最大1...

百度検索は今年後半に混乱に陥り、赤字が続く

最近、百度が発表した「百度ウェブ検索品質白書」がウェブマスターの間で広く流布され、白書に関する議論も...

VMwareインフラストラクチャ上でNvidia vGPUを実行できるようになりました

VMware と Nvidia のコラボレーションの新たな章である Project Monterey...

SEO分析に基づいて、ナビゲーションバーのデザインにはいくつかの詳細に注意を払う必要があります。

サイトナビゲーションはサイトデザインの重要な部分です。ナビゲーションバーがないと、ユーザーは必要な情...

SEOの基本を無視しないでください

SEO、この3つの簡単な言葉は、ウェブマスターが毎日目にする最も一般的な言葉だと思います。SEOを行...

ServerPronto の簡単な紹介

Serverpronto は、長い歴史 (2003 年) と強力なバックグラウンドを持つ IDC で...

クコの反撃:農業におけるセクシーなマーケティングは1ポンドあたり2,000元で販売される

私たちは、農業事業が少々田舎っぽかったり、少々小規模であったりすることを恐れません。しかし、農業ビジ...

SEO シソーラスの完全ガイド

以前、SEO チャネルについてお話ししましたが、その中で非常に重要なステップは語彙データベースの確立...

「イカゲーム」のマーケティングに失敗した人は誰ですか?

「イカゲーム」の人気に伴い、「イカ」マーケティングも開始されました。このマーケティングには失敗と成功...

VMware、マルチクラウド管理を推進するVMware Ariaを発表

パブリック クラウド全体とエッジでアプリケーションを提供する企業が増えており、Kubernetes ...

アップグレード時にクラッシュします。K8s には LTS バージョンが必要です。

著者 |ヤン・ジェン制作 | 51CTO テクノロジースタック (WeChat ID: blog) ...

企業のウェブマスターは、どのように最適化して企業に利益をもたらすことができるのでしょうか?

ウェブマスターはどうすれば鋭いエッジを避けて企業に利益をもたらすことができるのか会社の従業員として、...

dediserve-インドネシア/Kvm/5 ユーロ/1G メモリ/20g SSD/500g トラフィック/500m ポート

dediserve.com はアジアのインドネシア データ センターにサーバーを立ち上げたばかりで、...

モバイルインターネットが新たな賭けをリセット 馬化騰:時が来れば儲かる日が来る

最近、テンセントは組織構造の調整とモバイルインターネット戦略のアップグレードを発表しました。テンセン...