Docker
Docker:記事リスト
Dockerのカテゴリーには以下の記事がリストされています。
Dockerfile postgresを組み込む設計パターン|初期化SQLと永続化の実装例
問題の本質は、postgresイメージの設計を正しく理解していないことにある。
docker-entrypoint-initdb.d と named volume の2つを押さえれば、初期化処理とデータ永続化の両方が解決する。この記事では、Dockerfileにpostgresを組み込む設計パターンを解説する。初期化SQLの自動実行から named volume によるデータ保全まで、Ubuntu 24.04 LTS / Docker 26.1の実機出力を交えて説明する。
この記事のポイント
・initdb.d以下のSQLは「初回起動時のみ」自動実行される
・named volumeを使えばコンテナ削除後もデータが保持される
・DockerfileのENV・COPY順序がDB初期化の動作に影響する
・healthcheck付きdepends_onでDBの準備完了を待機できる
diveコマンドでDockerイメージのレイヤーを分析する方法|不要ファイルの検出とDockerfile最適化の実践手順
Dockerfileを設計していると、RUN命令の書き方次第でキャッシュや一時ファイルが最終イメージに混入し、予期せずサイズが膨らむことがあります。
docker image inspectではレイヤー構造の詳細は見えないため、どこが問題なのか特定が難しい。この記事では、Dockerイメージのレイヤーを対話型UIで可視化できるdiveコマンドの使い方を解説します。Rocky Linux 9.4 + Docker 26.1.4の実機で動作確認した、インストールから基本操作・問題パターンの発見・Dockerfile改善・CI組み込みまでをひとつの流れで紹介します。
この記事のポイント
・diveコマンドはDockerイメージのレイヤーをファイル単位で可視化するツール
・対話型UIで各レイヤーのファイル追加・削除・変更を確認できる
・効率スコアで「無駄なスペース」を数値化しDockerfile改善の優先度を把握できる
・--ciフラグでCIパイプラインへの組み込みが可能
続きを読む "diveコマンドでDockerイメージのレイヤーを分析する方法|不要ファイルの検出とDockerfile最適化の実践手順"
Docker Swarmは今も選択肢になるか|Kubernetesとの違いを冗長化・運用負荷・撤退容易性で比べる
Docker Composeで複数コンテナを1台のホストで動かすことに慣れてくると、次に直面するのが「マルチノードでの冗長化」という課題です。Composeはシングルホストの仕組みなので、ホストが落ちれば全サービスが落ちます。複数のサーバーにまたがってコンテナを管理する仕組み——オーケストレーション(orchestration)——が必要になる瞬間です。
この記事では、Dockerに付属するオーケストレーション機能「Docker Swarm」が今も現場で選択肢になりうるかを、Kubernetesとの違いを「冗長化の粒度」「運用負荷」「学習コスト」「撤退容易性」の4軸で整理します。マネージドKubernetesではなく3台規模のオンプレサーバーを前提とした判断基準を示すので、自分の状況に当てはめながら読んでください。動作確認環境はDocker Engine 26.1.3 / Rocky Linux 9.4(manager 1台 + worker 2台)です。
この記事のポイント
・docker swarm initとswarm joinだけで最小クラスターが構成できる
・SwarmはKubernetesより習得コストが低く小規模オンプレに向く
・Kubernetesは本番スケールの運用機能が豊富だが学習・維持コストが高い
・3ノード以下なら撤退容易性の観点でもSwarmが合理的な選択肢になる
続きを読む "Docker Swarmは今も選択肢になるか|Kubernetesとの違いを冗長化・運用負荷・撤退容易性で比べる"
Docker Swarmのボリューム設計|localドライバがノードをまたげない理由と共有ストレージの選び方
「localボリュームを設定したはずなのに、ノードごとにデータが食い違う」
そういったトラブルに直面したことはないでしょうか。
Docker Swarmのボリューム設計でハマりやすい最大の落とし穴は、localドライバが「ノードごとに独立した実体」を作るという仕様です。単一ホストで使い慣れたnamed volumeをそのままSwarm構成に持ち込むと、タスクが再配置された瞬間に別ノードの空ボリュームを参照してしまいます。
この記事では、localドライバがなぜノードをまたげないのかを構造から整理し、placement constraintによる回避策の限界、NFSやCIFSを使った共有ストレージの構成手順、そしてバックアップ経路の考え方まで、実サーバーの確認例を交えて解説します。
動作確認環境: Rocky Linux 9.4(Swarm manager 1台 + worker 2台・Docker Engine 26.x)
この記事のポイント
・localドライバはノードごとに別の実体を持ち、ノードをまたいだデータ共有はできない
・タスクが別ノードへ再配置されると直前のデータは参照できなくなる
・placement constraintで縛る回避策は再配置時の可用性とのトレードオフがある
・NFSをvolume driverオプションで指定すると全ノードが同一データを共有できる
続きを読む "Docker Swarmのボリューム設計|localドライバがノードをまたげない理由と共有ストレージの選び方"
Docker Swarmにcompose.ymlをそのまま持ち込めるか|docker stack deployで効くdeployキーと無視されるbuildの扱い
こう尋ねるエンジニアをセミナーでもよく見かける。手元のPCではdocker compose upで問題なく動作していても、docker stack deployに切り替えた瞬間に「buildキーは無視される」「depends_onが機能しない」という壁にぶつかる。
この記事では、compose.ymlをDocker Swarmへ持ち込む際の互換性を体系的に整理し、docker stack deployで有効なdeployキーと無視されるキーの違い・対処法をコマンド実例付きで解説します。Rocky Linux 9.4 / Ubuntu 24.04 LTSで動作確認済みです。
この記事のポイント
・docker stack deployはdeployブロック(replicas・placement・restart_policy)を読み取りSwarmサービスを構成する
・build・depends_on・restartキーはdocker stack deployでは完全に無視される
・buildを使っているサービスは「ビルド→レジストリpush→image:書き換え」の3ステップで対応する
・depends_onの代替はhealthcheck + deploy.restart_policy.condition: on-failureで吸収できる
続きを読む "Docker Swarmにcompose.ymlをそのまま持ち込めるか|docker stack deployで効くdeployキーと無視されるbuildの扱い"
Docker Composeのビルド設計|buildセクションのcontext・args・キャッシュでイメージ更新を制御する
「DockerfileのARGに値を渡したいが、compose.ymlでどう書けばいいかわからない」
Composeを使い始めると、こうしたビルド周りの疑問が必ず出てきます。
Docker Composeには、コンテナの起動設定と同じcompose.ymlの中でDockerfileからのビルドを完全に制御できる
buildセクションがあります。コンテキストパスの指定・ビルド時引数の注入・キャッシュ戦略の構成まで、imageキーで既成イメージを使うだけでは実現できない柔軟な設計が可能になります。この記事では、buildセクションの主要パラメータである
context・args・cache_from/cache_to・targetを整理し、実サーバーの確認例を交えて解説します。動作確認環境: Rocky Linux 9.4 / Ubuntu 24.04 LTS(Docker Engine 26.x・Docker Compose Plugin v2.28)
この記事のポイント
・docker compose buildのbuildセクションでコンテキスト・Dockerfile・引数を一元管理できる
・argsとDockerfileのARGを対応させることでビルド時にcompose.ymlから値を注入できる
・cache_from/cache_toでCI/CDのビルドキャッシュをレジストリに保存・再利用し高速化できる
・--no-cacheフラグとtargetでビルドの再実行と対象ステージを明示的に制御できる
続きを読む "Docker Composeのビルド設計|buildセクションのcontext・args・キャッシュでイメージ更新を制御する"
Dockerのbind mountとtmpfsをどう使い分けるか|マウント種別ごとの性能・権限・バックアップ適性
コンテナにデータを持たせる方法はDockerに3種類あります。named volume、bind mount、そしてtmpfsです。それぞれ用途が明確に異なるのに、とりあえずbind mountで済ませているケースを現場でもよく見かけます。
この記事では、bind mountとtmpfsの仕組みと使い方を実行例とともに解説し、named volumeを含めた3種類のマウント種別をどのような基準で選ぶかを整理します。RHEL 9.4 / Ubuntu 24.04 LTS、Docker 27.x で動作確認済みです。
この記事のポイント
・bind mountはホストのパスをコンテナに直接共有する(ホストに残るが可搬性は低い)
・tmpfsはメモリ上の一時領域でコンテナ停止と同時にデータは消える(機密データ向き)
・バックアップが必要なデータはnamed volume、ホスト連携はbind mount、機密一時データはtmpfs
・選定基準は「永続性・ホスト依存・バックアップ・セキュリティ」の4軸で決める
続きを読む "Dockerのbind mountとtmpfsをどう使い分けるか|マウント種別ごとの性能・権限・バックアップ適性"
PostgreSQLコンテナをDocker Composeで運用する設計|データ永続化と初期化スクリプト、ダンプ取得の実務
「コンテナを作り直すたびにデータベースが初期化されてしまう」
Dockerを使い始めたエンジニアがPostgreSQLを扱うとき、ほぼ必ずぶつかる壁です。
コンテナはそれ自体が使い捨て設計のため、ボリューム(永続化ストレージ)を明示しないと、コンテナを削除した瞬間にデータも一緒に消えます。
加えて「初期テーブルをどう投入するか」「バックアップをどうとるか」という運用の疑問も、最初はなかなかまとまった答えが見つかりません。
この記事では、PostgreSQLコンテナをDocker Composeで永続化する設計パターン、初期化スクリプト(/docker-entrypoint-initdb.d)の使い方、稼働中コンテナからpg_dumpでダンプを取得する手順まで、実務ですぐ使える形で解説します。
動作確認環境: Rocky Linux 9.4 / Ubuntu 24.04 LTS(Docker Engine 26.1.x・Docker Compose Plugin v2.27)
この記事のポイント
・docker composeのnamedボリュームでコンテナ削除後もDBデータが残る永続化を実現できる
・/docker-entrypoint-initdb.dにSQLファイルを置くと初回起動時だけ自動実行される
・pg_dumpはdocker compose exec経由で稼働中コンテナから直接取得できる
・ボリュームが既に存在すると初期化スクリプトが再実行されない点が最大のはまりどころ
続きを読む "PostgreSQLコンテナをDocker Composeで運用する設計|データ永続化と初期化スクリプト、ダンプ取得の実務"
docker compose downの前に確認すべきこと|停止で消えるリソースと残る匿名ボリュームの扱い
`docker compose down` は単純に「止める」コマンドではなく、コンテナとネットワークを「片付ける」コマンドです。ボリュームは原則として残り、指定するフラグによって削除対象が変わります。この挙動を正しく理解していないと、本番環境でのデータ消失や開発環境でのディスク逼迫につながります。
この記事では、`docker compose down` と `docker compose stop` の根本的な違い(docker compose down 違い)から始め、停止時に削除されるリソース・残るリソースの全体像、匿名ボリュームの正体と確認方法、本番・開発環境それぞれに適した停止設計パターンまでを順番に解説します。
この記事のポイント
・ docker compose down はコンテナとデフォルトネットワークを削除するが、ボリュームは残る
・ 匿名ボリュームもデフォルトでは削除されず `docker volume ls` で確認できる
・ `--volumes` フラグを付けると名前付き・匿名ボリュームが両方削除されるため本番では要注意
・ 本番は `down` のみ、開発は `down --volumes --remove-orphans` で使い分けるのが基本設計
続きを読む "docker compose downの前に確認すべきこと|停止で消えるリソースと残る匿名ボリュームの扱い"
Docker in Dockerとdocker.sockマウントはどちらを選ぶか|CIパイプラインでイメージをビルドする2方式の比較
CIパイプライン上でDockerイメージをビルドしようとすると、この壁に必ずぶつかります。
コンテナの内側でDockerを動かす代表的な方法は2つです。「Docker in Docker(DinD)」と「docker.sockマウント」。どちらを選ぶかで、パイプラインの設計方針・セキュリティリスク・日々のトラブルの種類がまったく変わります。
この記事では、docker in docker 設計の仕組みを実際の設定ファイルと実行出力例を使って比較し、どちらを選ぶべきかの判断基準を示します。
動作確認環境:Docker 26.1.4 / GitLab Runner 17.2(Ubuntu 24.04 LTS)
この記事のポイント
・DinDはコンテナ内に独立したDockerデーモンを起動する方式で --privileged が必須になる
・docker.sockマウントはホストのデーモンを共有する方式で、実質rootと同等の権限になる
・セルフホスト型RunnerではDinD推奨、Kubernetes上ではKanikoへの移行を検討すること
・どちらも権限は広く、本番Kubernetesクラスターへの直接適用は避けること
続きを読む "Docker in Dockerとdocker.sockマウントはどちらを選ぶか|CIパイプラインでイメージをビルドする2方式の比較"
DockerのコンテナランタイムをOCI仕様から理解する|containerd・runc・dockerdの役割と連携フロー
Dockerを数ヶ月以上使っていても、そう感じているエンジニアは少なくありません。コマンドが動けばそれでいい——と言いたいところですが、Kubernetesへの移行・containerd停止時のトラブルシュート・rootlessモードの設計、どれを突き詰めようとしても、Dockerの内部構造を知らないと手が止まります。
この記事では、Dockerのコンテナランタイムがdockerd・containerd・runcの3層で構成される理由、OCI(Open Container Initiative)仕様との関係、コンテナが起動するまでの内部シーケンスを実機出力を交えて解説します。nerdctlやctrコマンドを使ってcontainerdを直接確認する手順、実務での活用場面(Kubernetes理解・障害切り分け)まで一通り整理します。
動作確認環境: RHEL 9.4 / Ubuntu 24.04 LTS、Docker Engine 26.1.x
この記事のポイント
・DockerはdockerD・containerd・runcの3層でコンテナを起動している
・OCI仕様により、DockerとKubernetesで同じruncランタイムを共用できる
・containerdはKubernetes環境ではDockerなしで直接使われる
・ctr・nerdctlコマンドでcontainerdを実機から直接操作して確認できる
続きを読む "DockerのコンテナランタイムをOCI仕様から理解する|containerd・runc・dockerdの役割と連携フロー"
Dockerイメージを署名して検証する方法|cosignとDocker Content Trustでサプライチェーン攻撃を防ぐ実践手順
「CIでビルドしたイメージが、レジストリにpushされてから本番にデプロイされるまでの間に、誰にも気づかれず改ざんされていないか不安だ」
docker pullでイメージを取得しても、Dockerはそのイメージが「誰によって」「どのソースコードからビルドされたものか」を検証してくれません。タグは誰でも上書きでき、レジストリへの侵入や中間者攻撃、タイポスクワッティング(似た名前の悪意あるイメージを紛れ込ませる手口)によって、正規のイメージがすり替えられるリスクは常に存在します。
この記事では、Sigstoreプロジェクトのcosignを使ってDockerイメージにデジタル署名を付与し、pull・デプロイの前にその署名を検証する方法を、Ubuntu 24.04 LTS(Docker Engine 26.1・cosign 2.4系)での実機出力を交えて解説します。鍵ペアによる署名、GitHub ActionsでのKeyless署名、レガシーなDocker Content Trustとの違いと使い分けまでカバーします。
この記事のポイント
・cosign sign --keyでイメージに署名し、改ざん・なりすましを検知できるようにする
・cosign verify --keyで署名を検証し、未署名や改ざんイメージのデプロイを防ぐ
・GitHub Actions上ではKeyless署名(OIDC連携)で秘密鍵の管理自体を不要にできる
・レガシーなDocker Content Trust(Notary)との違いを理解し、現在はcosignを標準とする
続きを読む "Dockerイメージを署名して検証する方法|cosignとDocker Content Trustでサプライチェーン攻撃を防ぐ実践手順"
Dockerイメージをダイジェストで固定する方法|FROM image@sha256による再現性のあるビルド設計
「latestはもちろん避けているが、python:3.12-slimのような固定タグでも本当に同じイメージが降ってくるのか不安だ」
Dockerのイメージタグは、実は「上書き可能な参照」にすぎません。python:3.12-slimのような具体的なタグを指定していても、公式メンテナがベースイメージにセキュリティパッチを当てて同じタグ名のまま再pushすれば、中身(レイヤーの実体)はいつの間にか入れ替わります。「タグを固定しているのにCIだけビルドが壊れた」「開発機と本番で微妙に挙動が違う」という事故の多くは、このタグの可変性が原因です。
この記事では、イメージの中身そのものを一意に特定する「ダイジェスト(sha256ハッシュ)」を使ってDockerfileのFROM命令を固定し、いつビルドしても同じイメージから同じ結果を再現する方法を、Ubuntu 24.04 LTS + Docker 26.1での実機出力を交えて解説します。タグとダイジェストの使い分け、Renovateによる自動更新運用まで、本番運用に耐える設計をカバーします。
この記事のポイント
・Dockerのイメージタグは上書き可能で、同じタグでも中身が変わることがある
・FROM イメージ名@sha256:ハッシュ でダイジェスト固定すると常に同一イメージを取得できる
・docker buildx imagetools inspectでマルチアーキ対応のダイジェストを確認できる
・Renovate等でダイジェストを自動更新すれば安全性と再現性を両立できる
続きを読む "Dockerイメージをダイジェストで固定する方法|FROM image@sha256による再現性のあるビルド設計"
Dockerのファイル権限エラーを解決する方法|ホストとコンテナのUID・GIDズレをUSER命令とPUID・PGIDで防ぐ設計
「named volumeの中身をホストから見たら、所有者がrootや見覚えのない数字になっていて編集できない」
Dockerを実務で使い始めると、ほぼ全員が一度はこのUID・GIDのズレにつまずきます。
この記事では、ホストとコンテナでファイルの所有者がズレる仕組みから、DockerfileのARG・USER命令、docker-compose.ymlのuser指定、entrypointでの動的調整まで、実機の出力例つきで解決策を解説します。
動作確認環境: Rocky Linux 9.4 / Ubuntu 24.04 LTS(Docker Engine 26.x・Docker Compose Plugin v2.27)
この記事のポイント
・Permission deniedの正体は、ホストとコンテナでUID・GIDの数値が一致しないこと
・DockerfileのARG+USER命令で、ビルド時にホストのUIDへ合わせられる
・docker-compose.ymlのuser: "1000:1000"で実行時にも指定できる
・配布イメージにはPUID/PGID環境変数+entrypointでの動的chown設計が定番
続きを読む "Dockerのファイル権限エラーを解決する方法|ホストとコンテナのUID・GIDズレをUSER命令とPUID・PGIDで防ぐ設計"
hadolintでDockerfileを静的解析する方法|ベストプラクティス違反の検出とCI組み込みの実践手順
そんな不安を抱えながらDockerfileを書き続けていないでしょうか。apt-getのバージョン固定忘れ、キャッシュ層の壊し方、rootのままの実行など、動作はするのに後々トラブルの種になる書き方は、レビューだけでは見落とされがちです。
この記事では、OSSのDockerfile静的解析ツール hadolint(ハドリント)を使って、ベストプラクティス違反を機械的に検出する方法を解説します。インストールから基本実行、ルールの読み方、.hadolint.yamlでの除外設定、GitHub ActionsへのCI組み込みまで一通り説明します。動作確認環境:Rocky Linux 9.4 / Ubuntu 24.04 LTS(hadolint v2.12.0)。
この記事のポイント
・docker run --rm -i hadolint/hadolint < Dockerfile でインストール不要のまま即座に解析できる
・DLxxxxのルール番号ごとにバージョン固定漏れやapt-getキャッシュ残存を検出できる
・.hadolint.yamlでプロジェクトの事情に合わせたルール除外・重要度変更ができる
・GitHub Actionsに組み込めばDockerfile変更のたびに自動でレビューされる
続きを読む "hadolintでDockerfileを静的解析する方法|ベストプラクティス違反の検出とCI組み込みの実践手順"
Dockerのuserns-remap設計|user namespaceリマップでコンテナのroot権限をホストから分離する方法
「ベースイメージが非rootユーザーに対応しておらず、rootのまま動かさざるを得ない」
そんな不安を抱えたままDockerを本番運用しているサーバー管理者は少なくありません。
この記事では、コンテナ内のroot(UID 0)をホスト側の非特権UIDへマッピングし直す
userns-remapの仕組みを、daemon.jsonでの設定手順から動作確認、ボリューム権限エラーのトラブルシュートまで実機で解説します。動作確認環境: Rocky Linux 9.4 / Ubuntu 24.04 LTS(Docker Engine 26.x・Docker Compose Plugin v2.27)
この記事のポイント
・userns-remapはコンテナ内rootをホストの非特権UIDへ丸ごとマッピングし直すdockerd機能
・非rootユーザー実行やrootlessモードとは別レイヤーの防御で、両者は併用できる
・daemon.jsonに1行追加してdockerd再起動するだけで、既存コンテナすべてに一律適用される
・有効化後はbind mountや既存volumeのPermission deniedが起きやすく、chownでの権限調整が必須
続きを読む "Dockerのuserns-remap設計|user namespaceリマップでコンテナのroot権限をホストから分離する方法"
Docker Composeのextendsで共通設定を複数ファイルに分割管理する方法|環境別オーバーライドとの使い分け
「開発用と本番用でビルド設定やログ設定だけ違うのに、サービス定義を丸ごと2重管理している」
そんな悩みを抱えたままcompose.ymlを運用しているチームは少なくありません。
Docker Composeには、共通のサービス定義を別ファイルに切り出し、複数のサービス・複数のプロジェクトから再利用できる
extendsという仕組みがあります。公式ドキュメントでの扱いが小さく、「override(環境別の設定上書き)」との違いを理解しないまま使うと、意図しない設定崩れを招くことがあります。
この記事では、extendsの基本構文から共通base定義を切り出す実践例、override(docker-compose.override.yml)との使い分け、設定が反映されない時のトラブルシュートまで、実サーバーの確認例を交えて解説します。
動作確認環境: Rocky Linux 9.4 / Ubuntu 24.04 LTS(Docker Engine 26.x・Docker Compose Plugin v2.27)
この記事のポイント
・extendsは共通のサービス定義を別ファイルに切り出し、複数サービス・複数プロジェクトから再利用する仕組み
・override(docker-compose.override.yml)は同一プロジェクト内の環境差分、extendsは共通化そのものが目的で役割が違う
・Composeのマージ規則では、ports・volumesなどのリスト項目は結合ではなく丸ごと置き換えになる点が事故の原因になりやすい
・docker compose configで結合後の設定を出力し、意図した内容にマージされているかを毎回確認するのが鉄則
続きを読む "Docker Composeのextendsで共通設定を複数ファイルに分割管理する方法|環境別オーバーライドとの使い分け"
docker compose watchで開発環境のホットリロードを実現する方法|sync・rebuild・sync+restartの使い分けと実践設計
docker compose restart を叩くのが面倒」——Docker開発中にそう感じたことはないでしょうか。Docker Compose v2.22 から正式機能になった
docker compose watch を使えば、ファイルを保存した瞬間にコンテナへの反映が自動で走ります。手動での再起動は不要になり、開発の「変更→確認」ループが大幅に短縮されます。この記事では、
compose.yml の develop ブロックの書き方から、sync・rebuild・sync+restart 3つのアクションの使い分け、Node.js アプリを使った実践例、よくあるトラブルの対処まで、実機で確認した手順を解説します。動作確認環境:Docker Engine 26.1.4 / Docker Compose v2.27.1(Ubuntu 24.04 LTS)
この記事のポイント
・docker compose watch は v2.22+ で正式化された自動反映機能
・compose.yml の develop.watch ブロックに path・action・target を設定する
・sync(即時同期)・rebuild(再ビルド)・sync+restart(同期後再起動)を用途で使い分ける
・docker compose up --watch の一発起動でも同じ効果が得られる
続きを読む "docker compose watchで開発環境のホットリロードを実現する方法|sync・rebuild・sync+restartの使い分けと実践設計"
Dockerデーモンをdaemon.jsonで設定する方法|ログ設定・insecure-registries・live-restoreの実践手順
こういった現場のトラブルを一括解決するのが、Dockerデーモンの設定ファイル
daemon.json です。デフォルト設定のままでは、ログ肥大化・HTTPレジストリへの接続拒否・デーモン再起動時のコンテナ強制停止など、本番運用でよく踏む落とし穴があります。この記事では、
/etc/docker/daemon.json の基本構造から、ログローテーション・insecure-registries・live-restore・data-rootの実務設定まで、Ubuntu 24.04 LTS / RHEL 9.4の実機出力を交えて解説します。この記事のポイント
・daemon.jsonは/etc/docker/daemon.jsonに置き、JSON形式でDockerデーモン全体の挙動を制御する
・"log-driver"と"log-opts"でコンテナのデフォルトログサイズ・ファイル数を一括制限できる
・insecure-registriesでHTTP接続のプライベートレジストリを許可する
・dockerd --validateで構文エラーを事前確認してからsystemctl restart dockerで反映する
続きを読む "Dockerデーモンをdaemon.jsonで設定する方法|ログ設定・insecure-registries・live-restoreの実践手順"
Docker ComposeのYAMLアンカーとExtension fields(x-プレフィックス)でcompose.ymlの重複を排除する方法
これはよく聞く現場の声です。Webサーバー・DBコンテナ・ジョブワーカー・メールモック・ログ収集エージェントと構成が増えるにつれ、全サービスに同じlogging設定やenvironment変数を何度もコピーペーストする作業が繰り返されます。設定を1か所変えると、10か所を修正しなければならない状態です。
この記事では、YAMLの標準機能であるアンカー(&・*・<<)と、Docker Compose固有のExtension fields(x-プレフィックス)を組み合わせてcompose.ymlの重複設定を削減する方法を解説します。さらに、profiles機能と組み合わせて開発・本番・テスト環境のサービス起動を切り替える実践パターンも紹介します。加えて、アンカー・extends・includeの使い分け指針も整理します。最後に、docker compose configコマンドで設定が正しく展開されているかを確認する手順まで含めます。
動作確認環境: Docker Compose v2.24.6以降 / RHEL 9.4、Ubuntu 24.04 LTS
この記事のポイント
・YAMLアンカー(&)でブロックに名前を付け、*(エイリアス)で複数サービスから参照できる
・<<(マージキー)でアンカーをマージしつつ、個別サービス側で一部だけ上書きできる
・Extension fields(x-プレフィックス)でアンカーをファイル先頭に集約して管理できる
・アンカーはファイル内DRY化、extendsはサービス継承、includeはファイル分割と役割が異なる
・docker compose configで展開後の設定を確認してから本番へ適用するのが安全な手順
続きを読む "Docker ComposeのYAMLアンカーとExtension fields(x-プレフィックス)でcompose.ymlの重複を排除する方法"
DockerfileのRUN --mountオプションでビルドを高速化・セキュア化する方法|cacheマウントとsecretマウントの実践設計
Docker BuildKitの
RUN --mount オプションを使うと、パッケージキャッシュをビルド間で共有してビルド時間を大幅に短縮できます。また --mount=type=secret を使えば、APIキーやSSH鍵をイメージにまったく含めずにビルド時だけ参照することもできます。この記事では、Rocky Linux 9 / Docker 26.x(BuildKit有効)の実機で動作確認した
RUN --mount の実践的な使い方を、ビルド時間の実測値とともに解説します。cacheマウントでビルドを速くし、secretマウントでビルドを安全にする2本の柱を中心に説明します。この記事のポイント
・RUN --mount=type=cacheでpip/npm/aptのキャッシュを再利用できる
・RUN --mount=type=secretでAPIキーをイメージに含めずビルドに使える
・DOCKER_BUILDKIT=1(または compose build)で自動的に有効になる
・docker build --secret id=...,src=...でsecretをビルドに渡す
続きを読む "DockerfileのRUN --mountオプションでビルドを高速化・セキュア化する方法|cacheマウントとsecretマウントの実践設計"
Dockerボリュームのバックアップと復元|named volumeのデータを別サーバーへ移行する実践手順
「docker-compose downしたら、MySQLのデータが全部消えた。バックアップはどう取ればいい?」
コンテナを止めてもデータが消えない仕組みがnamed volumeです。しかし、サーバー自体が壊れた場合や誰かが
docker volume rmを実行してしまった場合は、named volumeごとデータが失われます。この記事では、named volumeをtarアーカイブでバックアップする手順と、別サーバーへの移行・復元の方法を解説します。コンテナを停止してバックアップする安全な方法、停止できない場合のダーティコピー、cronによる定期バックアップ自動化、PostgreSQLの実践例まで体系的にカバーします。
実行環境:Rocky Linux 9.4 / Ubuntu 24.04 LTS、Docker 26.1.x
この記事のポイント
・named volumeのバックアップは docker run --rm -v で一時コンテナを使うのが定石
・本番DBは必ず停止バックアップ。停止できない場合は pg_dump / mysqldump を使う
・別サーバーへの移行は tar + rsync/scp の2ステップで完結する
・cronで夜間に自動バックアップすれば、誤削除・障害時に数分で復元できる
続きを読む "Dockerボリュームのバックアップと復元|named volumeのデータを別サーバーへ移行する実践手順"
Dockerのgraceful shutdown設計|STOPSIGNALとstop_grace_periodでコンテナを安全に終了させる方法
その原因の多くは、
docker stopがSIGKILLで強制終了しているからではなく、SIGTERMがアプリに届いていないからです。docker stopは最初にSIGTERMをコンテナのPID 1プロセスに送り、指定時間(デフォルト10秒)が経過してもコンテナが終了しない場合にのみSIGKILLで強制終了します。アプリがSIGTERMを正しく受け取って後始末を完了できれば、強制終了は発生しません。この記事では、PID 1問題の原因と解決策(tini・init: true)、DockerfileのSTOPSIGNAL命令、Composeのstop_grace_periodの設定を実測例つきで解説します。動作確認はUbuntu 24.04 LTS + Docker 26.1で実施済みです。
この記事のポイント
・docker stopはSIGTERM→10秒待機→SIGKILLの順で終了させる
・PID 1問題でSIGTERMが届かないことが最多の原因
・STOPSIGNALとstop_grace_periodで終了挙動を制御する
・tiniとinit: trueでPID 1問題を根本解消できる
続きを読む "Dockerのgraceful shutdown設計|STOPSIGNALとstop_grace_periodでコンテナを安全に終了させる方法"
docker compose secretsでパスワードを安全に渡す方法|environmentを使わないシークレット設計
「コンテナの中に入ってenvコマンドを実行すると、パスワードを含む環境変数が全部見えてしまう。もっと安全な管理方法があるはずだが、何を使えばいいかわからない」
環境変数でパスワードを渡すと、
docker inspectコマンドでコンテナの詳細情報を表示した際に機密情報が平文で表示されます。さらに、docker-compose.ymlをgitで管理していれば、リポジトリの履歴にパスワードが永久に残るリスクも伴います。この記事では、Docker Composeが提供するsecrets機能を使い、パスワードやAPIキーなどの機密情報をコンテナへ安全に渡す設計を解説します。ファイルベースのsecrets設定、PostgreSQLへの実践適用、複数シークレットの管理、よくあるエラーの対処まで、実際の設定ファイルと動作確認の出力例を交えて網羅します。動作確認環境はUbuntu 24.04 LTS、Docker Engine 27.1、Docker Compose v2.29です。
この記事のポイント
・docker compose secretsはパスワードを /run/secrets/ にtmpfsでマウントする
・docker inspectで機密情報が見えない安全な設計になっている
・compose.ymlのsecretsセクションにfile:でパスを指定するだけで使い始められる
・POSTGRES_PASSWORD_FILE等の_FILE変数対応イメージとそのまま連携できる
続きを読む "docker compose secretsでパスワードを安全に渡す方法|environmentを使わないシークレット設計"
docker contextで複数サーバーのDockerをローカルから一元管理する方法|ssh contextの設定とTLS接続の実践手順
サーバーが増えるほど、この手間は比例して増えていきます。
DOCKER_HOST=ssh://...を毎回設定するのも使えますが、スクリプトに埋め込んだ瞬間に管理が難しくなります。この記事では、
docker contextコマンドを使って複数のDockerホストをローカルのPCから一元管理する方法を解説します。SSH contextの作成・切り替えから複数ホストの運用Tips、TLS接続によるセキュアな設定まで、RHEL 9.4 / Ubuntu 24.04 LTSで動作確認した実機の出力例とともに紹介します。この記事のポイント
・ docker context createでSSH contextを作成し、複数Dockerホストを名前で切り替えられる
・ docker context useで対象ホストに切り替えると、以降のdockerコマンドが全てリモートに向く
・ ~/.ssh/configとの組み合わせで接続先の管理をシンプルに一元化できる
・ DOCKER_CONTEXT環境変数でスクリプト・CI/CDにも安全に組み込める
続きを読む "docker contextで複数サーバーのDockerをローカルから一元管理する方法|ssh contextの設定とTLS接続の実践手順"
Docker Composeのネットワーク設計|サービス名での名前解決・カスタムネットワーク・external接続の実践手順
「サービス名でDBにアクセスできたが、なぜ動くのか仕組みがわからない」
そんな疑問を抱えたまま使い続けているエンジニアは少なくありません。
Docker Composeはデフォルトで専用ネットワークを自動作成し、サービス名をそのままDNSホスト名として機能させます。しかし本格的な環境では「DBをフロントエンドから直接見えなくしたい」「別のComposeプロジェクトのネットワークに接続したい」といった要件が必ず出てきます。
この記事では、Docker Composeのネットワークの仕組みをゼロから整理し、カスタムネットワーク定義・複数ネットワークによる通信分離・external接続の実践手順まで、実サーバーの確認例を交えて解説します。
動作確認環境: Rocky Linux 9.4 / Ubuntu 24.04 LTS(Docker Engine 26.x・Docker Compose Plugin v2.27)
この記事のポイント
・Composeはdocker compose up時に専用ブリッジネットワークを自動作成しサービス名をDNSホスト名にする
・networks:ブロックでカスタムネットワークを定義しサービスに複数割り当てると通信経路を分離できる
・external: trueでComposeの外側に存在する既存Dockerネットワークに接続できる
・docker network inspectとdocker compose execで通信障害を迅速に切り分けられる
続きを読む "Docker Composeのネットワーク設計|サービス名での名前解決・カスタムネットワーク・external接続の実践手順"
DockerからKubernetesへ進む最初の一歩|minikubeとkindで学ぶコンテナオーケストレーション入門
DockerでWebアプリを動かせるようになると、次の壁として現れるのがコンテナ数の増加です。コンテナが3つ、5つ、10と増えてくると、手作業での起動・停止・再起動は現実的ではなくなります。
そこで登場するのがKubernetes(クバネティス)です。Kubernetesはコンテナを自動で管理・スケールさせる「コンテナオーケストレーター」で、現在の本番インフラの標準となっています。
この記事では、手元のPCでKubernetesを動かせる minikube と kind を使い、インストールからPod・Deployment・Serviceの作成まで実際のコマンド出力を交えて解説します。
動作確認環境: Rocky Linux 9.4 / Ubuntu 24.04 LTS(minikube v1.33.1・kind v0.23.0・kubectl v1.30.2)
この記事のポイント
・minikube start 1コマンドでKubernetesクラスターが手元のPCで起動できる
・kubectl apply でPodやDeploymentをYAMLファイルから作成・管理できる
・kindはDockerだけで動く軽量クラスターでCI環境のテストに適している
・minikubeとkindの違いを理解して用途に合わせて使い分けられる
続きを読む "DockerからKubernetesへ進む最初の一歩|minikubeとkindで学ぶコンテナオーケストレーション入門"
DockerイメージをCIで自動ビルドしてレジストリへプッシュする手順|GitHub Actionsのタグ戦略とキャッシュ活用
「毎回手でdocker buildしてdocker pushするのが面倒だし、push忘れが怖い」
Dockerイメージを手動でビルド・プッシュしていると、誰かが古いイメージのまま本番にデプロイしてしまうリスクがあります。GitにコードをプッシュしたタイミングでDockerイメージが自動的にビルドされてレジストリへ登録される仕組みを作れば、この問題は根本から解消されます。
この記事では、GitHub ActionsでDockerイメージを自動ビルドしてghcr.io(GitHub Container Registry)またはDocker Hubへプッシュする手順を解説します。タグ戦略(semver・sha・latest)、BuildKitのキャッシュ活用(cache-from/cache-to)、よくあるエラーと対処法まで、実際のworkflow.ymlサンプルとともに網羅します。動作確認環境はGitHub Actions ubuntu-24.04 runner、Dockerイメージのベースはubuntu:24.04です。
この記事のポイント
・docker/build-push-actionでビルド~プッシュをワンステップで自動化できる
・ghcr.ioはGITHUB_TOKENだけで認証できるため外部シークレット不要
・cache-type=ghaを使うとGitHub Actionsのキャッシュでビルド時間を大幅短縮できる
・タグはgit sha・semverタグ・latestを組み合わせて再現性と利便性を両立する
続きを読む "DockerイメージをCIで自動ビルドしてレジストリへプッシュする手順|GitHub Actionsのタグ戦略とキャッシュ活用"
docker saveとdocker loadでイメージをオフライン移送する方法|閉域網サーバーへの持ち込み運用
docker pull が使えない」インターネット非接続の環境(閉域網・エアギャップ環境)でコンテナを動かす場面は、金融・官公庁・製造業の制御系など、セキュリティ要件の厳しい現場では決して珍しくありません。
この記事では、
docker save と docker load を使い、インターネット接続のある環境でイメージをtarファイルに書き出し、閉域網サーバーへ安全に持ち込む手順を解説します。基本コマンドの構文から、複数イメージの一括保存・gzip圧縮による容量削減・転送後の整合性確認・よくあるエラーの対処法まで、現場で即座に使える内容を網羅します。
動作確認環境: Rocky Linux 9.4 / Ubuntu 24.04 LTS(Docker Engine 26.x)
この記事のポイント
・docker save -o image.tar イメージ名 でイメージをtarファイルに保存できる
・docker load -i image.tar でtarファイルからイメージを復元する
・gzipと組み合わせると転送ファイルサイズを50~70%削減できる
・docker images --digests で転送前後のダイジェスト一致を確認して整合性を保証する
続きを読む "docker saveとdocker loadでイメージをオフライン移送する方法|閉域網サーバーへの持ち込み運用"
DockerのENV・ARG・env_fileを正しく使う設計|ビルド時と実行時の値の渡し方とsecrets
「ENVとARGの違いがよくわからず、とりあえずENVを使っているが本当に安全なのか不安だ」
コンテナ開発を進める中で、環境変数とシークレットの扱いに迷うエンジニアは多い。ENVとARGは書き方が似ているが、値が「どのタイミングで」「どこに」残るかがまったく異なる。誤った使い方をすると、APIキーやパスワードがイメージレイヤーに焼き込まれ、
docker historyコマンド一発で誰にでも見えてしまう。この記事では、DockerのENV・ARG・env_fileの正しい使い分けと、BuildKit secretsを使ったシークレット管理を実例で解説する。docker composeでの設計パターンとよくあるミスへの対策も含め、RHEL 9.4 / Ubuntu 24.04 LTSで動作確認済みだ。
この記事のポイント
・ENVは実行時の変数、ARGはビルド時限定でイメージに残らない
・ARGにシークレットを渡すとdocker historyで漏洩する危険がある
・env_fileで.envを外部化し必ず.gitignoreに追加する
・BuildKit --mount=type=secretならレイヤーにシークレットが残らない
続きを読む "DockerのENV・ARG・env_fileを正しく使う設計|ビルド時と実行時の値の渡し方とsecrets"
docker buildxでマルチアーキテクチャイメージをビルドする方法|ARM・x86両対応のビルド設計
「AWS GravitonのARM64インスタンスに移行したいが、既存のイメージがamd64専用で使えない」
そう困っているなら、docker buildxのマルチアーキテクチャビルドが解決策です。
docker buildxを使えば、linux/amd64とlinux/arm64の両方に対応したイメージを1回のビルドで作成し、Docker Hubにpushできます。
この記事では、BuildKitとbuildxの関係から、QEMU設定、builderインスタンスの作成、実際のマルチプラットフォームビルド、Dockerfile内のARG TARGETARCH活用まで、実際のコマンド出力を交えて解説します。
動作確認環境: Ubuntu 24.04 LTS / Rocky Linux 9.4(Docker Engine 27.x・buildx v0.17.x)
この記事のポイント
・docker buildx build --platform linux/amd64,linux/arm64 で両アーキに対応できる
・QEMUを使うとx86マシン上でもARMイメージをクロスビルドできる
・ARG TARGETARCHをDockerfileに組み込むとアーキ別バイナリ配置を自動化できる
・--push オプションでビルドと同時にDocker Hubへマルチプラットフォームpushできる
続きを読む "docker buildxでマルチアーキテクチャイメージをビルドする方法|ARM・x86両対応のビルド設計"
プライベートDockerレジストリを構築する方法|registryコンテナの運用とDocker Hub rate limit対策
こういった問題に直面したことはないだろうか。
Docker Hubは無料プランだと6時間ごとに100回のpull制限がある。開発チームが増えてくると、CIが同時走行するたびに
toomanyrequestsエラーが返ってきてビルドが止まる。この記事では、Dockerが公式に提供する
registryコンテナを使って、社内LAN上にプライベートDockerレジストリを構築する方法を解説する。docker composeによる基本構成から、TLS証明書・htpasswd認証によるセキュア化、さらにDocker HubのPull through Cacheとして使う設定まで、RHEL 9.4 / Ubuntu 24.04 LTSで動作確認した実行例付きで紹介する。この記事のポイント
・docker run registry:2 で5分以内にプライベートレジストリを起動できる
・push/pullはイメージに「ホスト:ポート/」タグを付けるだけでよい
・TLS + htpasswd認証でセキュアな社内専用レジストリを構築できる
・pull through cache設定でDocker Hub rate limitを実質回避できる
続きを読む "プライベートDockerレジストリを構築する方法|registryコンテナの運用とDocker Hub rate limit対策"
Dockerコンテナの自動起動設計|restart policyとsystemd連携でサーバー再起動に耐える構成
Dockerコンテナはデフォルトではサーバー再起動後に自動で起動しません。docker restart policy(再起動ポリシー)を正しく設定することで、Dockerデーモンが起動するたびにコンテナも自動で起動させることができます。
この記事では、restart policy の4種類と使い分け、docker-compose.yml での設定方法、systemd ユニットファイルによるコンテナ管理、そして本番環境での推奨設計パターンを段階的に解説します。RHEL 9.4 / Ubuntu 24.04 LTS + Docker 26.x で動作確認済みです。
この記事のポイント
・docker restart policy の unless-stopped がサーバー再起動後の自動起動に本番推奨
・4種類(no / on-failure / always / unless-stopped)を用途に応じて使い分ける
・docker-compose.yml の restart フィールドで複数コンテナに一括設定できる
・起動順序や依存関係の詳細制御が必要な場合は systemd ユニットファイルが有効
続きを読む "Dockerコンテナの自動起動設計|restart policyとsystemd連携でサーバー再起動に耐える構成"
docker system pruneでディスク容量を管理する方法|overlay2肥大の原因調査と安全な削除手順
Dockerを運用していると、こういった状況に必ずぶつかります。原因のほとんどは、停止済みコンテナ・dangling image(タグのない中間イメージ)・未使用ボリュームが/var/lib/docker/overlay2に蓄積していることです。
この記事では、docker system dfで現状を正確に把握してから、docker system pruneの各オプション(--all・--volumes・--filter)を使い分けて段階的に削除する手順を解説します。Ubuntu 24.04 LTS / RHEL 9.4の実機出力を交えながら、CI/CD環境や本番環境での定期prune設計まで網羅します。
この記事のポイント
・overlay2肥大の原因は停止コンテナ・dangling image・未使用volumeの3つ
・docker system dfで種別ごとの使用量を確認してから削除する
・docker system prune --all --volumesで一括削除できるが本番では段階的に実行する
・--filterで「until=168h」と指定して直近7日以上のリソースのみ削除できる
続きを読む "docker system pruneでディスク容量を管理する方法|overlay2肥大の原因調査と安全な削除手順"
trivyでDockerイメージの脆弱性をスキャンする方法|CI組み込みとベースイメージ更新の運用
そんな経験をしたことはないでしょうか。コンテナ技術が現場に普及した今、イメージに含まれるOS・ライブラリの脆弱性を継続的に把握することは、Linuxサーバー管理と同様に不可欠なスキルになっています。
この記事では、OSSの脆弱性スキャナー trivy(トリヴィ)を使って、DockerイメージのCVE(脆弱性)をスキャンする方法を解説します。インストールから基本スキャン、CI/CD(GitHub Actions)への組み込み、ベースイメージ更新の運用設計まで一通り説明します。動作確認環境:Rocky Linux 9.4 / Ubuntu 24.04 LTS。
この記事のポイント
・trivy image <イメージ名> でDockerイメージの脆弱性を数十秒でスキャンできる
・--severity CRITICAL,HIGH フィルタで優先対応すべきCVEだけ絞り込める
・GitHub Actions の aquasecurity/trivy-action でCI段階に自動スキャンを組み込める
・ベースイメージをalpine/distrolessに変え、定期cronスキャンで継続管理が基本戦略
Dockerのセキュリティ設計|非rootユーザー実行とrootlessモードでコンテナを堅牢化する方法
「コンテナ内でrootユーザーのまま動かしているが、これで本当に問題ないのか」
Dockerはデフォルトでコンテナ内をrootユーザーとして動かします。この設計は学習・開発では問題ありませんが、本番環境では深刻なセキュリティリスクを抱えることになります。コンテナの脆弱性を突かれた際、root権限があればホストOS側にも影響が及ぶ可能性があるからです。
この記事では、Dockerセキュリティの根幹となる「非rootユーザー実行」と「Rootless Docker(rootlessモード)」の2つの対策を、Ubuntu 24.04 LTS / RHEL 9.4での実機出力を交えて体系的に解説します。Dockerfileの設計からrootlessモードの導入・制限事項まで、本番環境に耐えうるコンテナ設計を習得しましょう。
この記事のポイント
・Dockerコンテナはデフォルトでrootユーザーとして動作しリスクがある
・USER命令で非rootユーザーに切り替えるのがDockerfile設計の基本
・Rootless DockerはDocker daemon自体を一般ユーザーで動かす強力な防御策
・両方を組み合わせることで本番環境のコンテナセキュリティが大幅に向上する
続きを読む "Dockerのセキュリティ設計|非rootユーザー実行とrootlessモードでコンテナを堅牢化する方法"
Dockerのログ運用設計|loggingドライバとjson-fileローテーションで肥大化を防ぐ方法
「コンテナIDの長いディレクトリ名の中に2GBを超えるjsonファイルが潜んでいた」
こういった事故は、Dockerのlogging driver(ログドライバ)の設定を理解していないことで起きます。Dockerはデフォルトでjson-fileドライバを使いますが、ローテーション設定がない場合、コンテナが動き続けるほどログファイルは無制限に膨らみます。
この記事では、Dockerのlogging driverの種類と選択基準、json-fileドライバのmax-size/max-fileによるローテーション設定、/etc/docker/daemon.jsonでのグローバル適用、docker-compose.ymlでのサービス別設定まで、Ubuntu 24.04 LTS / RHEL 9.4の実機出力を交えて解説します。
この記事のポイント
・max-size/max-fileでログローテーションを設定できる
・daemon.jsonで全コンテナに一括設定を適用できる
・docker-compose.ymlのloggingセクションで個別設定できる
・本番環境ではjournaldやsyslogへの転送も検討する
Dockerコンテナのリソース制限と監視|--memory・--cpusとdocker statsでホストを守る設計
Dockerを本番で使い始めると、こうした事故に一度は直面します。
Dockerはデフォルトでは、コンテナがホストのリソース(メモリ・CPU)を無制限に使用できてしまいます。アプリのバグやメモリリーク、突発的なスパイクで1つのコンテナが暴走すると、同じホスト上の他のコンテナやシステムプロセスが道連れになります。
この記事では、
--memory・--cpusオプションによるリソース制限の設計と、docker statsを使ったリアルタイム監視の実践方法を解説します。Docker Composeのdeploy.resources設定、cgroupsを使った実体確認まで、本番ホストを守る設計を一通りカバーします。この記事のポイント
・--memory でコンテナのメモリ上限を設定し、OOM Killerでホストを守る
・--cpus=1.5 でCPU使用量を、--cpu-shares で優先度を制御する
・docker stats --no-stream でリソース使用量をスナップショット確認できる
・Composeではdeploy.resources.limitsでまとめて制限を宣言する
続きを読む "Dockerコンテナのリソース制限と監視|--memory・--cpusとdocker statsでホストを守る設計"
docker buildのキャッシュと.dockerignore設計|Dockerfileの命令順序でCIビルドを高速化する実践手順
原因の多くはDockerfileの命令順序の誤りと .dockerignore ファイルの未設定にあります。Dockerのビルドキャッシュを正しく活用すると、変更のないレイヤーは再利用されるため、5分かかっていたビルドが30秒以下になることも珍しくありません。また .dockerignore を追加するだけで、1GB超のビルドコンテキストが数十KBまで削減されたケースは現場では珍しくなく、機密ファイルのイメージへの混入も同時に防げます。
この記事では、Dockerのビルドキャッシュの仕組みから命令順序の最適化、.dockerignoreの設計(言語別パターン集・セキュリティリスクの防ぎ方)、BuildKitのキャッシュマウント、そして
docker historyを使った肥大レイヤーの診断まで、実務で即使えるノウハウを順番に解説します。RHEL 9.4 / Ubuntu 24.04 LTS + Docker 26.x で動作確認済みです。この記事のポイント
・Dockerのキャッシュは命令が変わった行以降すべて無効化される
・変更頻度の低い命令(apt install)を上に、ソースのCOPYを最後に書く
・.dockerignoreでビルドコンテキストを削減し、転送時間と機密情報漏洩を同時に防ぐ
・BuildKitの--mount=type=cacheでパッケージキャッシュを永続化できる
続きを読む "docker buildのキャッシュと.dockerignore設計|Dockerfileの命令順序でCIビルドを高速化する実践手順"
Docker Composeのdepends_onとHEALTHCHECK|サービス起動順序を確実に制御する設計パターン
Docker Compose の depends_on に
condition: service_healthy を指定し、Dockerfile の HEALTHCHECK 命令を組み合わせると、DBが完全に起動するまでアプリコンテナの起動を遅らせることができます。この記事では、depends_on の3種類のconditionとHEALTHCHECKの設定方法を、PostgreSQL・MySQL・Redisへの適用例を交えて解説します。curl・nc・専用CLIを使ったヘルスチェックパターンとexec形式・shell形式の使い分け、unhealthyになった場合のデバッグ手順(docker inspect・docker events活用)も含めて網羅しています。profiles機能を使った環境別サービスの選択起動と、profiles付きサービスへのdepends_on設計パターンも解説します。また、DBマイグレーション・テスト実行・シードデータ投入など「1回きり処理」を確実に実行する docker compose run の実践パターンも取り上げます。RHEL 9.4 / Ubuntu 24.04 LTS + Docker 26.x / Compose v2.x で動作確認済みです。
この記事のポイント
・depends_on の condition: service_healthy でDBの準備完了を待ってからアプリを起動できる
・HEALTHCHECK 命令でコンテナの「準備完了」基準を定義する(Dockerfile / Composeファイル両方に書ける)
・MySQLは -h 127.0.0.1・start_period: 30s が必須の設定ポイント
・docker inspect と docker events でヘルスチェックのログと進捗をリアルタイム確認できる
・profiles: [dev] でサービスを環境別に選択起動し、開発ツールを本番に混入させない(Compose v2.2以降)
・adminerのポートを 127.0.0.1:8081:8080 にバインドするとdevプロファイルが誤起動されても外部アクセスを防げる
・Mailhog等のSMTPモックを devプロファイルに隔離し、SMTP接続先を環境変数デフォルト値で切り替えられる
・--profile オプションは docker compose の直後・サブコマンドの前に指定する
・initプロファイルを使えばシードデータ投入などの一回限り処理を分離できる
・COMPOSE_PROFILES 環境変数や .env ファイルで起動プロファイルを環境ごとに自動切り替えできる
・docker compose config --profiles で定義済みプロファイル一覧を確認できる(Compose v2.15以降)
・profiles付きサービスをdepends_onで参照するときは依存関係の設計に注意が必要
・docker compose run --rm でマイグレーション・テスト・シードを1回きり実行できる(終了後コンテナ自動削除)
・GitHub Actions から docker compose --profile ci run --rm migrate でCIマイグレーションを一時起動できる
・docker compose run と docker compose exec の使い分けは「サービスが停止中か起動中か」で判断する
・deploy.replicas でスケールした各レプリカには独立してヘルスチェックが実行される(Compose v2.x は Swarm なしでも有効)
・deploy.resources.limits でコンテナごとのCPU・メモリ上限を設定し、レプリカ増加時のリソース過消費を防ぐ
・debug プロファイルで netshoot コンテナを app コンテナのネットワーク名前空間に接続し、本番コンテナへの影響ゼロで ss / tcpdump / curl によるネットワーク診断ができる
・.env.dev / .env.production のように環境別 .env ファイルを用意し、cp .env.dev .env だけでプロファイルを自動切り替えできる
続きを読む "Docker Composeのdepends_onとHEALTHCHECK|サービス起動順序を確実に制御する設計パターン"
DockerfileのENTRYPOINTとCMDを正しく使い分ける方法|シェル形式・exec形式の設計指針と実践例
「ENTRYPOINT と CMD の違いを調べても同じことしか書いていなくて、結局どちらを使えばいいかわからない」
Dockerfile を書き始めた段階で多くの人がつまずくのが、ENTRYPOINT と CMD の使い分けです。
この記事では、2つの命令の明確な違い、「シェル形式」と「exec形式」の落とし穴、そして実務で役立つ設計パターンを実際のコマンド実行例とともに解説します。
Compose を使った上書き方法、エントリーポイントスクリプトの設計まで含めて、現場で即使える内容をまとめています。
動作確認は Rocky Linux 9 / Ubuntu 24.04 LTS + Docker 26.x で行っています。
この記事のポイント
・ENTRYPOINT は「コンテナが必ず実行するプログラム」を固定する命令
・CMD は「ENTRYPOINT へのデフォルト引数」または単独のデフォルトコマンド
・exec形式(JSON配列)を使わないとシグナルが届かず docker stop が10秒かかる
・Compose では entrypoint: / command: キーで Dockerfile の設定を上書きできる
続きを読む "DockerfileのENTRYPOINTとCMDを正しく使い分ける方法|シェル形式・exec形式の設計指針と実践例"
docker execコマンドでコンテナ内を調査・デバッグする方法|docker logs・docker inspectの実践例も
そんな場面で真っ先に使うべきツールが docker exec・docker logs・docker inspect の3つです。
この記事では、Rocky Linux 9 / Ubuntu 24.04 LTS の実機で確認した手順をもとに、Dockerコンテナのデバッグに欠かせない3コマンドの実践的な使い方を解説します。
コンテナ内部への入り方から、ログの絞り込み、設定値の取り出しまで、障害切り分けの現場でそのまま使える内容を網羅しています。
この記事のポイント
・docker exec -it でコンテナ内のシェルにインタラクティブに接続できる
・docker logs -f でリアルタイムのコンテナログをtail感覚で追える
・docker inspect --format でIPアドレスや設定値を1行で取り出せる
・起動に失敗したコンテナはdocker startしてからexecでデバッグする
続きを読む "docker execコマンドでコンテナ内を調査・デバッグする方法|docker logs・docker inspectの実践例も"
Dockerのネットワーク設計入門|コンテナ間通信とbridge・host・noneの使い分け
「Docker Composeで組んだWebとDBがつながらず、名前解決でエラーが出る」
こういったトラブルは、Dockerネットワークの仕組みを理解していないことが原因のほとんどです。
Dockerはコンテナ起動時に自動でネットワークへ接続しますが、デフォルトのbridgeネットワークでは「コンテナ名での名前解決」ができません。ここで詰まるエンジニアは非常に多い。
この記事では、Dockerの4つのネットワークモード(bridge・ユーザー定義bridge・host・none)の違いと使い分け、コンテナ間通信の実践手順、Docker Composeでのネットワーク分離設計を、Ubuntu 24.04 LTS / RHEL 9.4の実機出力を交えて解説します。
この記事のポイント
・Dockerデフォルトのbridgeではコンテナ名での名前解決ができない
・コンテナ間を名前で繋ぐには「ユーザー定義bridgeネットワーク」が必須
・Docker Composeは自動でユーザー定義ネットワークを作成しサービス名で通信できる
・本番環境ではfrontend/backendを別ネットワークに分離するのが基本設計
Dockerボリュームとバインドマウントでデータを永続化する方法|コンテナを消してもデータを守る設計
そんな失敗、Dockerを使い始めて一度は経験するはずです。コンテナはプロセスと同じで、停止・削除すると内部に書き込んだデータはすべて消えます。
この記事では、Dockerのボリューム(docker volume)とバインドマウントの仕組みを基礎から解説し、コンテナが消えてもデータを安全に永続化するための実践的な設計手順を紹介します。
Docker Composeでのvolumes定義まで、実際のサーバー出力例を交えて説明します。
動作確認環境: Rocky Linux 9.4 / Ubuntu 24.04 LTS(Docker Engine 26.x・Docker Compose Plugin v2.27)
この記事のポイント
・コンテナのデータはデフォルトで揮発性。永続化にはvolumeかバインドマウントを使う
・docker volume createで名前付きボリュームを作り、-vまたは--mountオプションでコンテナに接続する
・バインドマウントはホストのディレクトリを直接マウントし、開発環境のソース共有に向く
・Docker ComposeではvolumesセクションでDB・アプリのデータを永続化して管理する
DockerfileのマルチステージビルドとCompose設計|本番イメージの軽量化・セキュリティ・環境分離の実践手順
そう感じたことはないでしょうか。
Dockerfileの基本構文は比較的すぐ覚えられますが、本番環境で安全に使えるイメージを作るとなると話が変わります。サイズの肥大化、rootで動くコンテナ、開発用の認証情報が本番イメージに残ったまま——こうした問題は、設計をきちんと理解していないと見過ごしがちです。
この記事では、マルチステージビルドを中心に、本番向けDockerfileの設計と、Docker Composeを使った環境分離の実践手順を解説します。alpine・slim・distrolessといったベースイメージの選び方、.envファイルによる認証情報の安全な管理、override構成・profilesを使った環境切り替えまで、「なぜそう書くのか」という設計の意図まで踏み込みます。
この記事のポイント
・マルチステージビルド+distrolessで本番イメージを1/10以下に軽量化できる
・Dockerfile設計の鉄則はCOPY --from でビルド成果物だけを本番に持ち込むこと
・GoはCGO_ENABLED=0+distroless/staticでバイナリ1本分のイメージを作れる(約22MB)
・Node.jsはnpm ci --omit=devで本番依存のみに絞り、devDependenciesをイメージから排除できる
・コンテナをroot以外のユーザーで動かすことがセキュリティの最低ライン
・.envファイルは自動読み込みされるがGitに含めてはいけない——認証情報はファイルで分離する
・Composeのoverride構成とprofilesで開発・本番・CI環境を1ファイル体系で管理できる
・COPY --fromは自分のステージだけでなく外部イメージからも直接コピーでき、CA証明書や設定ファイルの取り込みに応用できる
続きを読む "DockerfileのマルチステージビルドとCompose設計|本番イメージの軽量化・セキュリティ・環境分離の実践手順"
OllamaをDockerコンテナで運用する方法|docker-compose.ymlとGPU設定で本番環境に安定デプロイする
「チームメンバーのUbuntuバージョンが違うせいで、同じ手順を実行しても動かない」
そんな悩みを抱えるインフラエンジニアやサーバー管理者は少なくない。Ollamaは単体でも動作するが、本番運用を見据えるとDockerコンテナ化が断然有利だ。この記事では、docker-compose.ymlを使ってOllamaをコンテナとして立ち上げ、GPUパススルー設定・リソース制限・Open WebUI連携・ヘルスチェック・日常運用コマンドまでをステップ順に解説する。さらに、profilesキーを使ったサービスの選択起動とdocker-compose.override.ymlを活用した開発・本番・CI設定の分離パターン、マージルールの落とし穴まで詳しく紹介する。Ubuntu Server 22.04 LTS + NVIDIA GPUの構成を基本とするが、GPUなしのCPU運用でも手順はほぼ同じだ。
この記事のポイント
・docker-compose.ymlとNVIDIA Container Toolkitで再現性のある運用環境を構築できる
・GPUパススルー・ヘルスチェック・環境変数の外部化で本番品質の構成に仕上げる手順を解説
・profilesキーで特定サービスを選択起動し、COMPOSE_PROFILES変数で環境ごとに制御できる
・docker-compose.override.ymlで開発・本番設定を分離し、本番への誤設定混入を防ぐ方法も紹介
・--env-fileオプションで本番用の.envを明示指定し環境変数を切り替える手順を解説
・compose.ci.ymlと--abort-on-container-exitでCIテスト実行を自動化する手順も解説
・マージルールの落とし穴(配列は追加マージ・マッピングはキー単位上書き)を理解して設定混入を防ぐ
・deploy.resources.limitsでCPU/メモリを制限し、ホスト全体の安定性を守る方法も紹介
・docker statsで実消費量を把握してから制限値を設定する手順を解説
・Open WebUIをcomposeに同梱することでチーム共有UIをワンコマンドで起動できる
続きを読む "OllamaをDockerコンテナで運用する方法|docker-compose.ymlとGPU設定で本番環境に安定デプロイする"
コンテナとは何か|Dockerで理解する仮想マシンとの違いと利点
コンテナという言葉はよく耳にするのに、どうもしっくり来ない。仮想マシンとの違いを聞いてもピンとこない。そんな方が多いのではないでしょうか。
この記事では、コンテナと仮想マシンの根本的な違いから、Dockerが実現する軽量・高速な仕組み、DockerfileやDocker Composeを使った実践的な活用方法まで解説します。「コンテナ docker」を調べている完全初心者の方でも、読み終わった後には「なぜエンジニアがDockerを使うのか」が腑に落ちるように構成しています。
この記事のポイント
・コンテナはOSカーネルを共有する軽量な実行環境で、VMより数十倍速く起動する
・Dockerはコンテナを手軽に使うためのツール群(CLI・デーモン・イメージ管理)
・Dockerfileで環境を「コード化」すれば、誰でも同じ環境を再現できる
・Docker Composeを使えば複数コンテナをyaml1ファイルで一括管理できる
dockerコマンドの使い方|コンテナ起動・停止・イメージ管理の実践例
「コンテナを起動したはいいけど、止め方や削除の方法がよくわからない」
Linuxサーバーを触り始めてしばらく経つと、必ずDockerに出会います。
開発環境の構築、アプリのデプロイ、CI/CDの整備——現場のあらゆる場面でDockerが使われるようになっています。
この記事では、Dockerコマンドの実践的な使い方を、RHEL 9.4 / Ubuntu 24.04 LTSでの動作確認済みの手順で解説します。
インストールから、イメージの取得・コンテナの起動・停止・削除・内部操作、さらにDocker Composeによる複数コンテナ管理まで、現場でよく使う操作を一通りカバーします。
この記事のポイント
・docker run でコンテナを起動、docker stop/rm で停止・削除できる
・docker ps -a で起動中・停止中の全コンテナを一覧表示できる
・docker exec -it でコンテナ内部に入りコマンド実行が可能
・Docker Composeを使えば複数コンテナをymlファイル1つで一括管理できる
netBIOS(Network Basic Input∕Output System)
このようなトラブルの根本には、NetBIOSの仕組みを理解していないことがあります。NetBIOS(Network Basic Input/Output System)は1983年にIBMが開発し、Microsoftが採用した分散アプリケーション向けのプログラミングインターフェイスです。今なおWindowsのファイル共有(SMB/CIFS)の基盤として現役で動いています。
この記事では、NetBIOSの基本的な仕組みからLinuxでNetBIOS名前解決を実践するコマンド操作まで、実機の出力例を交えながら解説します。
この記事のポイント
・NetBIOSはWindowsネットワークの基盤。SMB/CIFSによるファイル共有で今も現役で動いている
・NetBIOS名前解決にはブロードキャスト・WINSサーバー・lmhostsの3方式がある
・LinuxからはnmblookupコマンドでNetBIOSホスト名の照会・名前解決ができる
・ポート137/138(UDP)と139(TCP)を理解することがトラブル対応の第一歩になる
