Skip to main content

Node.js開発者向けDocker活用のプロ技9選

著者
blog feature snyk container custom base recommendations

2024年4月11日

0 分で読めます
9 Docker Pro Tips that will LEVEL UP your Skills

コマンドラインを使ってDockerイメージやコンテナをローカルで操作し、ビルドやテストを頻繁に行っているなら、上級者向けのDockerコマンドを試してみたくなるかもしれません。

基本は省き、あまり知られていないものの非常に便利なコマンドを紹介して、Dockerの活用を大きく改善する方法を解説します。

Dockerコンテナのセキュリティが気になりますか?Dockerコマンドの詳細に入る前に、コンテナセキュリティの重要性を認識することが大切です。そこで役立つのがSnykです。Snykはコンテナ化されたアプリケーションに特化した強力なセキュリティソリューションを提供し、コンテナやその依存関係に潜む脆弱性の検出と修正を支援します。セキュリティを強化するために、Snykをワークフローに統合するところから始めましょう。

Dockerコンテナのシェルに入るには?

ログやファイルシステムの構造を調べたり、特定の仮説を検証・確認したりするために、コンテナ内の問題をデバッグする必要が生じることはよくあります。また、ローカルでビルドしたDockerイメージの中を調べたいと思うこともあるでしょう。

Dockerの対話型シェルを起動するコマンドライン引数を使えば実行できます。まずコンテナを起動し、シェルを実行して、ターミナルからの操作をコンテナに接続します。

Dockerのrunコマンドを使って、Node.js Dockerイメージのシェルを開く方法を紹介します。

$ docker run -it --rm [docker-image-name-goes-here] /bin/bash

Dockerイメージの`Dockerfile`で`ENTRYPOINT`が指定されていない場合は、上記の方法を使えます。

Node.jsのDockerイメージのバージョンを確認する方法

DockerイメージにインストールされているNode.jsランタイムのバージョンを確認する便利な方法をご紹介します。この情報は、互換性の確認やデバッグ、さまざまな環境で一貫した動作を確保するうえで重要です。

(JSON解析プログラム`jq`がインストールされていることを前提に)次のコマンドを実行します。

$ docker image inspect [image-name] | jq '.[0].Config.Env'

このコマンドは、Node.jsのバージョンを含むDockerイメージの環境変数を出力します。たとえば、次のように表示されます。

[
  "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
  "NODE_VERSION=18.2.0",
  "YARN_VERSION=1.22.19"
]

Apple M1に最適化されたDockerイメージを使用するには?

Dockerは、M1チップの基盤となるARMアーキテクチャをサポートするように進化し、このアーキテクチャに最適化された専用のコンテナイメージを提供しています。これらのイメージにより、M1搭載マシンでの互換性が高まり、パフォーマンスも向上します。現在、多くの開発者がAppleのノートパソコンを使用しているため、特に役立ちます。

まず、イメージのアーキテクチャを確認しましょう。コンテナを実行する前に、アーキテクチャに互換性があることを確認してください。このコマンドを使うと、M1に最適化されたイメージを使用しているか確認できます。

docker image inspect --format '{{ .Architecture }}' <image_name>

Docker Hubレジストリからイメージを取得する場合は、M1に最適化されたイメージを取得していることを確認しましょう。

docker pull --platform linux/arm64/v8 node:lts-bullseye-slim

Dockerイメージをビルドしてプライベートまたはパブリックレジストリにプッシュするチームに所属している場合は、M1向けのコンテナイメージをビルドすることも重要です。これにより、異なるCPUアーキテクチャ間でシームレスに動作し、幅広い互換性を確保できます。

docker buildx build --platform linux/amd64,linux/arm64 -t <your_username>/<image_name>:<tag> .

Docker diffでコンテナの変更を確認する

`docker diff`コマンドを使うと、コンテナの作成後にDockerコンテナのファイルシステムに加えられた変更を確認できます。追加、変更、削除されたファイルやディレクトリが表示されます。

コマンドは次のとおりです。

docker diff <container_id>

このコマンドは、Dockerコンテナに加えられた変更の一覧を返します。各変更について、ファイルまたはディレクトリが追加(A)、変更(C)、削除(D)のいずれであるかが示されます。

Node.jsのDockerコンテナで`docker diff`を使うと、`package.json`ファイル内の依存関係を更新した際に、`node_modules`ディレクトリで具体的に何が変わったかを確認できます。`docker diff`コマンドを実行して、変更を特定しましょう。

`docker diff`でセキュリティ脆弱性を特定するメリット

`docker diff`コマンドは、セキュリティ対策にも役立つ強力なツールです。Dockerコンテナのファイルシステムに加えられた変更をすばやく確認できるため、不正な変更や不審なアクティビティの発見につながります。

たとえば、Node.jsアプリケーションのファイルに予期しない変更があれば、セキュリティ侵害や脆弱性の悪用を示している可能性があります。定期的なチェックやCI/CDプロセスに`docker diff`を組み込むことで、アプリケーションのセキュリティを強化し、Dockerコンテナが想定どおりに動作していることを確認できます。

このように、`docker diff`コマンドを使ってDockerコンテナのセキュリティ監査を実施できます。コンテナの現在の状態と元のイメージを比較することで、セキュリティリスクにつながる可能性のある差異を特定できます。

Dockerコンテナイメージをスキャンして、脆弱性とSBOMを確認する

Snykは、開発者のアプリケーションセキュリティを支援する、無料プランを常時提供しているセキュリティプラットフォームです。Dockerイメージをスキャンして脆弱性を検出し、詳細なレポートと具体的な修正方法を提示します。

Node.jsプロジェクトのDockerイメージをスキャンするには、まずSnyk CLI(コマンドラインインターフェース)がインストールされていることを確認します。インストールされていない場合は、npmを使って次のコマンドを実行します。

npm install -g snyk

次に、Node.jsアプリケーションのDockerイメージ名が`my-nodejs-app`だとします。次のコマンドを使って、Snykでスキャンできます。

snyk container test my-nodejs-app

このコマンドは、`my-nodejs-app`という名前のDockerイメージを既知の脆弱性についてテストするようSnykに指示します。スキャンが完了すると、Dockerイメージで見つかった脆弱性の一覧が深刻度順に表示されます。

✗ High severity vulnerability found in lodash
  Description: Prototype Pollution
  Info: https://snyk.io/vuln/SNYK-JS-LODASH-567746
  Introduced through: lodash@4.17.15
  From: lodash@4.17.15

Snykのもうひとつの便利な機能は、Dockerイメージのソフトウェア部品表(SBOM)を生成できることです。SBOMには、依存関係とそのバージョンを含む、Dockerイメージ内のすべてのコンポーネントが記載されています。イメージの内容を把握し、潜在的な脆弱性を特定するうえで非常に役立ちます。

Snykを使ってDockerイメージのSBOMを生成する方法は次のとおりです。

snyk container test <image-name> --json | jq .packageManager

DockerイメージのSHA IDを取得する方法

Dockerイメージを正確に指定するには、DockerイメージのSHA IDを使うことが重要です。特に、自動化スクリプトで使用する場合や、環境間で一貫性を確保する場合に役立ちます。この識別子はイメージとバージョンごとに一意で、タグよりも詳細に指定できます。

このコマンドは、完全なSHA256ダイジェストとともにDockerイメージをすべて一覧表示します。SHA IDは「IMAGE ID」列に表示されます。

docker images --no-trunc

使用例:Docker Composeでイメージを固定する

Docker Composeファイルでイメージを指定する際、タグの代わりにSHA IDを使うと、特定のバージョンに固定できます。これにより、アプリケーションのテストに使用したバージョンとまったく同じイメージを常に使用でき、イメージのタグが更新された場合の予期しない変更を防げます。

services:
  your_service:
    image: your_image@sha256:<SHA_ID>

DockerコマンドでSHA IDを使うと、一貫性と信頼性を確保できます。これは、本番環境やCI/CDパイプラインで特に重要です。

DockerコンテナのIPアドレスを確認するには?

NestJS、Express、Fastifyなどのフレームワークを使ったNode.jsアプリケーションをDockerコンテナで実行している場合、コンテナのIPアドレスを確認する必要があることはよくあります。

この情報は、デバッグやログ分析、コンテナ内で稼働しているWebサーバーへの接続に欠かせない場合があります。

docker inspect --format '{{ .NetworkSettings.IPAddress }}' [container_name_or_id]

Dockerコンテナ内のNode.js子プロセスを調査するには?

Node.js開発者は、コンテナ化されたアプリケーションの状態をより深く把握し、効果的な監視やトラブルシューティングを行うにはどうすればよいでしょうか?また、プロセスが想定以上のメモリやCPUリソースを使用していないかをデバッグするにはどうすればよいでしょうか?

次のDockerコマンドを使います。

docker top node

Dockerコンテナ内でNode.jsアプリケーションを扱う場合、特に子プロセス(クラスタやワーカーを使用するアプリケーション、タスクのためにサブプロセスを起動するアプリケーションで一般的)を利用している場合は、デバッグやモニタリングのために子プロセスを調査できることが重要です。

Docker Registry APIでNode.jsコンテナイメージのメタデータを取得する

Node.jsコンテナイメージについて詳しい情報が必要な場合は、Docker Hub APIに直接クエリを送るのが効果的です。

この方法では、イメージに関する包括的なメタデータを取得できます。バージョンの詳細や依存関係、その他の重要な属性を把握するうえで役立ちます。

次のコマンドでは、HTTPリクエストに`curl`プログラムを、レスポンスを整形されたJSON形式で表示するために`jq`プログラムを使用します。

curl https://hub.docker.com/v2/repositories/library/node/tags/latest | jq

レスポンスには、次の情報が含まれます。

  • イメージの詳細:イメージのサイズ、ダイジェスト、アーキテクチャなどの情報。

  • レイヤー情報:イメージの構成を確認できます。

  • タグの詳細:「latest」タグに関する具体的なデータ。

このコマンドは、自動チェックや更新のためにCI/CDパイプラインで実行する自動化スクリプトや、プロジェクトの要件に合った正しいNode.jsイメージのバージョンを使用していることを確認するバージョン管理などに役立ちます。

最後までお読みいただき、ありがとうございました!

バージョンの不整合やパフォーマンスのボトルネックへの対処から、Docker環境での日々の作業の最適化まで、さまざまな場面を取り上げました。

この記事では、一般的なdocker runやdocker psにとどまらない、高度なDockerコマンドを紹介しました。DevOpsや開発に携わる方に向けたこれらのプロ技で、トラブルシューティング、デバッグ、コンテナ管理を効率化できます。

ここで紹介した知識やコマンドをワークフローに取り入れながら、Dockerを使いこなす道のりは続いていくことを忘れないでください。Node.js開発者の方は、DockerでNode.jsウェブアプリケーションをコンテナ化するための10のベストプラクティスで学びを深めましょう。Java開発者の方には、Brian VermeerによるDockerでJavaコンテナを構築するための10のベストプラクティスがおすすめです。

開発者ファーストのコンテナセキュリティ

Snykは、コンテナイメージとKubernetesワークロードの脆弱性を検出し、自動的に修正します。