Docker

Docker CI/CD with Microservices: A Step-by-Step Guide

ⓘ本ページはプロモーションが含まれています

もっとスキルを活かしたいエンジニアへ

スポンサードリンク
働き方から選べる

無料で使えて良質な案件の情報収集ができるサービス

エンジニアの世界では、「いつでも動ける状態を作っておけ」とよく言われます。
技術やポートフォリオがあっても、自分に合う案件情報を日常的に見れていないと、いざ動こうと思った時に比較や判断が難しくなってしまいます。
普段から案件情報が集まる環境を作っておくと、良い案件が出た時にすぐ動きやすくなりますよ。
筆者自身も、メガベンチャー勤務時代に年収1,500万円を超えた経験があります。振り返ると、技術だけでなく「どんな案件や働き方があるか」を日頃から見ていたことが、キャリアの選択肢を広げるきっかけになりました。
このブログを読んでくれた方に感謝を込めて、実際に使っている情報収集サービスを紹介します。

フルリモート・週3日・高単価、どんな条件も妥協したくないなら

フリーランスボードに無料会員登録する

利用者10万人以上。業界最大規模45万件の案件。AIマッチ機能や無料の相場情報が人気。

年収800万円以上のキャリアアップ・ハイクラス正社員を視野に入れているなら

Beyond Careerに無料相談する

内定獲得率90%以上。紹介先企業とは役員クラスのコネクションがある安心と信頼できるエージェント。


スポンサードリンク

Dockerとマイクロサービスを活用したCI/CDパイプラインの具体的手順

Dockerとマイクロサービスの組み合わせは、現代のソフトウェア開発において効率的なデプロイメントを実現する重要な技術です。しかし、CI/CDパイプラインを構築する際には、「イメージのビルド手順が明確でない」「依存関係が複雑化する」などの課題に直面することがあります。本記事では、GitHub ActionsとDockerを組み合わせて実装できる具体的なステップを解説し、マイクロサービス環境でのCI/CDパイプライン構築のノウハウをお伝えします。


Dockerイメージの構築手順

マイクロサービスアーキテクチャでは、各サービスごとに個別のDockerイメージを作成する必要があります。この際、ベースイメージの選定マルチステージビルドの活用が不可欠です。以下に具体的な手順とサンプルコードを示します。

マルチステージビルドの最適化

マルチステージビルドは、開発環境と実行環境を分離し、イメージサイズの削減やセキュリティ強化に寄与します。以下にその手順と効果を比較表にまとめました。

項目 補足
コンパイル環境 build-stage ソースコードのビルドや依存関係インストール用
実行環境 runtime-stage バイナリファイルと必要なライブラリのみを含む
イメージサイズ 30%〜50%削減 コンパイルツールを含まない最終ステージに分離

注意点:ベースイメージはalpineslimなど軽量なバージョンを選ぶことで、CI/CDパイプライン全体の速度向上が期待できます。

Dockerfileの基本構成例

Dockerfileはサービスごとに個別に作成し、共通するコンポーネントを分離することで保守性を高めます。たとえば、NginxサーバーとNode.jsアプリケーションそれぞれのDockerfileが以下のように記述されます。

Nginx用Dockerfile

Node.js用Dockerfile


GitHub Actionsでの自動ビルド設定

GitHub Actionsを用いることで、プルリクエスト時やmainブランチへのPush時に自動でビルド・テストを実行できるようになります。以下にワークフローYAMLファイルの構成例を示します。

ワークフローYAMLファイル構成例

ベストプラクティスとして、Docker BuildKitを活用することでビルドのパフォーマンス向上が期待でき、GitHub Container Registry (GHCR)はリポジトリと連携しやすく、セキュリティスキャンの自動化にも対応しています。

イベントハンドラ設定のポイント

  • Pull Request時developブランチでの変更をテストする。
  • Push時:本番環境向けにmainブランチで自動ビルドとプッシュを実施。

マイクロサービス間の依存関係管理

マイクロサービスではサービス同士が連携するため、起動順序通信テストの自動化が重要です。Docker Composeは依存関係を定義しやすく、GitHub Actionsでその起動順序を制御できます。

サービス起動順序の制御方法

  1. Docker Composeでの依存サービス定義
    docker-compose.ymldepends_onを記述することで、起動順序を指定できます。
    yaml
    services:
    db:
    image: postgres
    app:
    depends_on:
    - db
    build: .

  2. GitHub Actionsでの起動順序制御
    GitHub Actionsのrunステップでサービスごとに実行順を分離し、依存関係を検出。
    yaml

  3. name: Start dependent services
    run: |
    docker-compose up -d db
  4. name: Build and test service
    run: |
    docker-compose build app
    docker-compose run --rm app npm test

  5. サービス間通信テストの自動化
    curlhttpieで各サービス間の通信を検証し、失敗時の通知を設定。


パイプラインのテスト段階設計

CI/CDパイプラインでは、ユニットテスト静的解析を組み込むことで、品質を確保します。GitHub Actionsで自動化し、テストが失敗した場合はビルドを停止するロジックも重要です。

ユニットテストと静的解析の実装例

  1. ユニットテストの実行手順
    bash
    npm install jest --save-dev
    npm test

  2. 静的解析ツールの導入(ESLint)
    bash
    npx eslint . --ext .js,.ts

  3. GitHub Actionsでテスト失敗時にビルド停止する設定例
    yaml

  4. name: Run tests
    run: |
    npm test
    if [ $? -ne 0 ]; then
    echo "Tests failed!"
    exit 1
    fi

テストカバレッジの計測にはnycistanbulなどのツールを活用し、85%以上のカバレッジを目指すことが推奨されます。


本番環境へのデプロイベストプラクティス

本番環境へのデプロイでは、ロールアウト戦略の選定セキュリティスキャンが必須です。Kubernetesと連携させることで安定性を高められます。

ロールアウト戦略と監視設定

  1. Blue/Greenデプロイの実装手順
  2. 新しいバージョンを別環境に配置し、トラフィックを切り替える。
  3. Kubernetesのrollout set imageコマンドを使用。
    bash
    kubectl rollout set image deployment/my-service my-microservice=ghcr.io/username/my-microservice:v1.2.3

  4. Health Checkの自動検出

  5. プロベ(Liveness/Readiness Probe)を設定し、サービスが正常に動作しているかを監視。
    yaml
    livenessProbe:
    httpGet:
    path: /health
    port: 8080
    initialDelaySeconds: 15

  6. セキュリティスキャンの導入例(Clair)

  7. バージョン管理されたDockerイメージに対して、脆弱性をスキャン。
    bash
    clair scan ghcr.io/username/my-microservice:v1.2.3

セキュリティスキャンはビルド時に実行することを推奨します。Clairの導入手順は以下の通りです:

  • ClairのDockerイメージをGitHubから取得。
  • clairコマンドでスキャンを行い、結果を自動的に通知するように設定。

実装後の課題共有と改善アプローチ

CI/CDパイプライン構築には、イメージプル失敗依存サービスの競合などのトラブルが発生することがあります。読者からのフィードバックをもとに、共通の対応策として以下のような解決法があります。

よくあるトラブルシューティング事例

  • イメージプル失敗
  • 原因:認証情報が不正、またはリポジトリにアクセス権がない。
  • 解決策:docker loginコマンドで正しい認証情報を入力し、リポジトリのプライバシー設定を確認。

  • 依存サービスの競合

  • 原因:Docker ComposeやKubernetesで起動順序が不適切。
  • 解決策:depends_oninitContainersを使って起動順序を明示的に管理。

Kubernetesでのロールアウト戦略の具体例

Kubernetesでは、ロールアウト方式に応じて異なる手順が必要です。以下に代表的な3つの戦略を比較します。

戦略 説明 用途
Blue/Greenデプロイ 新しいバージョンと現行バージョンを並列で運用し、トラフィックを切り替える。 高可用性が必要な環境
Rolling Update サービスを段階的に更新し、中断なしに変更を反映する。 スケールが大きいクラスタでも安定したロールアウトが可能
Canary Release 一部のユーザーに新しいバージョンを提供し、問題がないことを確認後に本番環境全体へ適用。 バグ検出やパフォーマンス監視が必要な場合

記事内で紹介したサンプルコードをベースに、自身のプロジェクトでCI/CDパイプラインを構築してみてください。実装中に出会った課題があれば、コメント欄で共有いただけると、今後の改善点としてとても参考になります。


スポンサードリンク

もっとスキルを活かしたいエンジニアへ

スポンサードリンク
働き方から選べる

無料で使えて良質な案件の情報収集ができるサービス

エンジニアの世界では、「いつでも動ける状態を作っておけ」とよく言われます。
技術やポートフォリオがあっても、自分に合う案件情報を日常的に見れていないと、いざ動こうと思った時に比較や判断が難しくなってしまいます。
普段から案件情報が集まる環境を作っておくと、良い案件が出た時にすぐ動きやすくなりますよ。
筆者自身も、メガベンチャー勤務時代に年収1,500万円を超えた経験があります。振り返ると、技術だけでなく「どんな案件や働き方があるか」を日頃から見ていたことが、キャリアの選択肢を広げるきっかけになりました。
このブログを読んでくれた方に感謝を込めて、実際に使っている情報収集サービスを紹介します。

フルリモート・週3日・高単価、どんな条件も妥協したくないなら

フリーランスボードに無料会員登録する

利用者10万人以上。業界最大規模45万件の案件。AIマッチ機能や無料の相場情報が人気。

年収800万円以上のキャリアアップ・ハイクラス正社員を視野に入れているなら

Beyond Careerに無料相談する

内定獲得率90%以上。紹介先企業とは役員クラスのコネクションがある安心と信頼できるエージェント。


-Docker