Docker前書きDockerを使用すると、アプリケーションやサービスをコンテナに簡単にラップできるため、どこでも実行できます。残念ながら、特にDockerの画像やコンテナを初めて使用する場合は、画像を構築してアプリに必要なすべてのレイヤーを統合するときに問題が発生する可能性があります。タイプミス、ランタイムライブラリとモジュールの問題、名前の衝突、または他のコンテナと通信するときに問題が発生する場合があります。Dockerを初めて使用するユーザー向けのこのトラブルシューティングガイドでは、Dockerイメージの構築時の問題のトラブルシューティング、コンテナーの実行時の名前の衝突の解決、コンテナー間の通信時の問題の修正を行います。前提条件このチュートリアルを完了するには、次のものが必要です。サーバーまたはローカルマシンにインストールされたDocker。[公式インストールドキュメント]に従ってローカルにDockerをインストールできます。+`からDockerイメージを構築するときです。始める前に、画像とコンテナの違いを明確にしましょう。+`という設定ファイルを使用して作成する読み取り専用リソースです。Hub]またはプライベートレジストリを通じて出荷および共有するものです。_container_は、作成したイメージから作成する読み取りおよび書き込みインスタンスです。これらの概念の詳細については、チュートリアルhttps://www.digitalocean.com/community/tutorials/docker-explained-using-dockerfiles-to-automate-building-of-images[Dockerの説明:Dockerfilesを使用してビルドを自動化する画像の]。+`の各行がプロセスのステップに対応しているため、Dockerがイメージをビルドするステップバイステッププロセスを明確に見ることができます。これは通常、特定のステップに到達した場合、前のステップがすべて正常に完了したことを意味します。Dockerfile`で発生する可能性のあるいくつかの問題を調査するための小さなプロジェクトを作成しましょう。~/docker_image/Dockerfileこの新しいファイルに次のコンテンツを追加します。nanoこのコードには意図的なタイプミスがあります。このファイルからイメージを構築して、Dockerが不正なコマンドを処理する方法を確認してください。次のコマンドでイメージを作成します。~/docker_imageエラーを示す次のメッセージが端末に表示されます。085fa10ffcc2最後のエラーメッセージは、ステップ2のコマンドに問題があったことを意味します。この場合、意図的なタイプミスでした。それはまた、前のステップが正しく実行されたことを意味しました。+`を修正して修正します。build`コマンドを再度実行します。~/docker_imageそして、次の出力が表示されます。tree...タイプミスを修正すると、Dockerはベースイメージを再ダウンロードするのではなく、最初のステップをキャッシュしたため、プロセスは少し速くなりました。出力からわかるように、新しいエラーがあります。+」が見つかりませんでした。基本イメージには、リポジトリや利用可能なパッケージのリストなどのキャッシュされたメタデータが付属しています。データを取得しているライブリポジトリが変更されたときに、キャッシュの問題が発生することがあります。これを修正するには、Dockerfileを変更して、新しいパッケージをインストールする前に、ソースのクリーンアップと更新を行います。構成ファイルを再度開きます。~/docker_image/Dockerfile次の強調表示された行をファイルに追加します。+`をインストールします。~/docker_image今回はプロセスが正常に完了します。3とPostgreSQLドライバーを画像に追加するとどうなるか見てみましょう。PostgreSQLドライバーをインストールするための2つの新しい手順を追加します。modulesファイルを保存し、エディターを終了して、イメージを再度ビルドします。~/docker_image出力からわかるように、パッケージは正しくインストールされます。前の手順がキャッシュされたため、プロセスははるかに迅速に完了します。978e0fa7afa7Dockerの出力に細心の注意を払ってタイプミスの場所を特定し、ビルド時にコンテナ内で更新を実行して、キャッシュされたパッケージリストによって妨げられていないことを確認します。構文エラーとキャッシュの問題は、Dockerでイメージを構築するときに発生する可能性のある最も一般的な問題です。次に、これらのイメージからコンテナを実行するときに発生する可能性のある問題を見てみましょう。ステップ2-コンテナの命名問題の解決コンテナをさらに起動すると、最終的に名前の衝突に遭遇します。ネーミング衝突は、システムにすでに存在するコンテナと同じ名前を持つコンテナを作成しようとする場所です。適切に処理する方法を調べてみましょう。前のセクションで作成したイメージからコンテナーを起動しましょう。このコンテナ内でインタラクティブなbashインタープリターを実行して、テストします。次のコマンドを実行してください。bashコンテナが起動すると、指示を待っているルートプロンプトが表示されます。コンテナが実行されたので、どのような問題に遭遇する可能性があるのか​​見てみましょう。明示的に名前を設定せずに、コンテナを上記の方法で実行すると、Dockerはコンテナにランダムな名前を割り当てます。+`コマンドを実行することで、実行中のすべてのコンテナとそれらに対応する名前を表示できます。Dockerホストで新しいターミナルを開き、次のコマンドを実行します。psこのコマンドは、次の例に示すように、名前とともに実行中のコンテナのリストを出力します。+」は、前の例でDockerがコンテナに自動的に割り当てた名前です。あなたの名前は別の名前になります。Dockerにコンテナに名前を割り当てさせることは非常に単純な場合には問題ありませんが、重大な問題を引き起こす可能性があります。デプロイするときは、コンテナに一貫した名前を付けて、それらを参照して簡単に自動化できるようにする必要があります。+」を使用するか、実行中のコンテナをよりわかりやすい名前に変更します。Dockerホストのターミナルから次のコマンドを実行します。python_box次に、コンテナーをリストします。+`コンテナが表示され、コンテナの名前が正常に変更されたことを確認します。exitそれがオプションではない場合、次のコマンドを使用して、Dockerホスト上の別のターミナルからコンテナを強制終了できます。python_boxこの方法でコンテナを強制終了すると、Dockerは強制終了されたばかりのコンテナの名前を返します。+`がもう存在しないことを確認するには、実行中のすべてのコンテナを再度リストします。ps予想どおり、コンテナーはリストされなくなりました。+`という名前の別のコンテナを起動できると思うかもしれませんが、試してみるとどうなるか見てみましょう。+`引数を使用します。--help'.画像を作成して既存の画像の名前を再利用すると、既に見たように、既存の画像は上書きされます。存在するコンテナを上書きできないため、コンテナはもう少し複雑です。」でリストされていないということです。実行されていませんが、再度起動する場合に備えて利用可能です。停止しましたが、削除しませんでした。+`コマンドは、_all_コンテナではなく、_running_コンテナのみを表示します。Exited(137)+`ステータスで存在します。これが、同じ名前の新しいコンテナを作成しようとしたときにネーミングの問題に遭遇した理由です。+`コマンドを使用します。ターミナルで次のコマンドを実行します。python_box再び、Dockerは削除されたばかりのコンテナーの名前を出力します。+`という名前の新しいコンテナを作成しましょう。bashプロセスが完了し、ルートシェルが再び表示されます。コンテナを強制終了して削除して、将来の問題を回避しましょう。Dockerホスト上の別のターミナルセッションから、次のコマンドを使用してコンテナを強制終了して削除します。python_box2つのコマンドを連鎖させたため、出力にはコンテナ名が2回表示されます。最初の出力では、コンテナが削除されたことを確認し、もう1つの出力では、コンテナが削除されたことを確認します。+」を念頭に置き、同じ名前でコンテナを再作成する前に、コンテナが停止および削除されていることを確認してください。コンテナに名前を付けると、インフラストラクチャを管理しやすくなります。名前を使用すると、次のようにコンテナ間で簡単に通信できます。ステップ3-コンテナー通信の問題の解決Dockerを使用すると、複数のコンテナを簡単にインスタンス化できるため、各コンテナで異なるサービスや冗長なサービスを実行できます。サービスに障害が発生した場合、またはサービスが危険にさらされた場合は、インフラストラクチャの残りの部分を損なわずに、新しいサービスに置き換えることができます。これらのコンテナが相互に通信する問題に遭遇する可能性があります。潜在的な通信の問題を調査できるように、通信する2つのコンテナーを作成しましょう。既存のイメージを使用してPythonを実行する1つのコンテナーと、PostgreSQLのインスタンスを実行する別のコンテナーを作成します。Hub]から入手できる公式のPostgreSQLイメージを使用します。最初にPostgreSQLコンテナを作成しましょう。+`フラグを使用してこのコンテナに名前を付けて、他のコンテナとリンクするときに簡単に識別できるようにします。以前は、コンテナを起動すると、フォアグラウンドで実行され、ターミナルを引き継ぎました。PostgreSQLデータベースコンテナをバックグラウンドで起動します。+`フラグで実行できます。+`コマンドを実行します。次のコマンドを実行して、コンテナを起動します。Hubからイメージをダウンロードし、コンテナーを作成します。次に、バックグラウンドで実行されているコンテナの完全なIDを返します。postgres:latestコンテナをリストして、この新しいコンテナが実行されていることを確認します。secondsそれでは、Pythonコンテナを起動しましょう。`コンテナに手動でリンクする必要があります。リンクを作成するには、コンテナの名前を指定し、その後にリンクの名前を指定します。+`コンテナーを参照します。次のコマンドを発行して、Pythonコンテナーを開始します。+`コンテナ内からPostgreSQLに接続してみましょう。`をインストールしたので、それを使用して単純なPythonスクリプトを作成し、PostgreSQLへの接続をテストします。pg_test.py次に、次のPythonスクリプトをファイルに追加します。psycopg2.connect(user='postgres')print(conn)ファイルを保存し、エディターを終了します。スクリプトからデータベースに接続しようとするとどうなるか見てみましょう。コンテナでスクリプトを実行します。pg_test.py表示される出力は、データベースへの接続に問題があることを示しています。+`コンテナにリンクしました。接続しようとしたときにデータベースホストを指定したことがないため、Pythonはローカルで実行されているデータベースに接続しようとしますが、サービスがローカルで実行されていないため、動作しません。別のコンピューター上にありました。リンクを作成したときに設定した名前を使用して、リンクされたコンテナにアクセスできます。+`ファイルを表示します。/etc/hosts使用可能なすべてのホストとその名前とIPアドレスが表示されます。+`サーバーがはっきりと見えます。3053f74c8c13それでは、Pythonスクリプトを変更してホスト名を追加しましょう。pg_test.py次に、接続文字列でホストを指定します。user='postgres')print(conn)ファイルを保存してから、スクリプトを再度実行します。pg_test.py今回はエラーなしでスクリプトが完了します。0>他のコンテナのサービスに接続しようとするときはコンテナ名を覚えておいて、アプリケーション資格情報を編集してそれらのコンテナのリンク名を参照してください。結論イメージの構築からコンテナのネットワークの展開まで、Dockerコンテナを使用する際に発生する可能性のある最も一般的な問題について説明しました。+`フラグがあります。Docker内部について詳しく知りたい場合は、デバッグモードでDockerコマンドを実行して、より詳細な出力を取得してください。[arguments]ソフトウェアのコンテナはしばらく前から存在していましたが、Docker自体はわずか3年しか存在せず、非常に複雑になる可能性があります。ecosystem]に慣れると、最初は少し異質だったいくつかの概念がどのようになるかがわかります。多くの意味をなします。