はじめに
ソフトウェア開発において、変更を素早く本番環境に届ける「継続的デリバリー(CD)」は、今や欠かせない開発プロセスとなりました。
しかし、環境差異や手動デプロイの煩雑さが障壁となることも少なくありません。
そこで登場するのが、DockerとCI/CDの連携です。
Dockerによるコンテナ化とCI/CDパイプラインの自動化を組み合わせることで、環境構築・テスト・デプロイを一貫して自動化し、再現性と信頼性の高いリリースを実現できます。
本記事では、DockerをCI/CDに統合する基本概念から、実際の構築手順(GitHub Actionsを例に)までをハンズオン形式で解説します。
CI/CDとは何か?
継続的インテグレーション(CI)
継続的インテグレーションとは、開発者がコードをリポジトリに頻繁に統合し、自動ビルドとテストを通して品質を維持する仕組みです。
これにより、コードの衝突や依存関係の問題を早期に検知できます。
継続的デリバリー(CD)
CD(Continuous Delivery)は、CIで検証されたアプリケーションを自動的にデプロイ可能な状態まで持っていくプロセスです。
本番環境へのリリースも自動化する場合は「継続的デプロイメント」と呼ばれます。
Dockerを組み合わせる利点
- テスト・本番で同じ環境を再現可能
- コンテナ単位でデプロイ可能(スケーラビリティ向上)
- CIサーバーでのビルド・テストが高速かつ安定
DockerをCI/CDに統合する仕組み
Dockerを利用することで、CI/CDパイプラインの中で一貫した環境を実現できます。
主な流れ
- ソースコードをリポジトリにプッシュ
- CIがトリガーされ、自動的にDockerイメージをビルド
- コンテナ上でテストを実行
- 成功時にDocker HubやGitHub Container Registryにプッシュ
- 本番・ステージング環境へ自動デプロイ
この流れを設定することで、開発者は「pushするだけでデプロイ」が可能になります。
ハンズオン:GitHub ActionsでDockerを自動ビルド&デプロイ
ここでは、GitHub Actionsを使ってDockerイメージを自動ビルド・デプロイする例を紹介します。
手順1:GitHubリポジトリを用意
まず、アプリケーションのソースコードをGitHubにプッシュします。
手順2:Dockerfileを用意
プロジェクトルートにDockerfile
を作成します。
FROM node:20-slim
WORKDIR /app
COPY package*.json ./
RUN npm install --production
COPY . .
CMD ["npm", "start"]
手順3:GitHub Actionsのワークフロー設定
.github/workflows/docker-ci.yml
を作成します。
name: Docker CI/CD
on:
push:
branches: [ main ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout source
uses: actions/checkout@v4
- name: Build Docker image
run: docker build -t myapp:${{ github.sha }} .
- name: Push to Docker Hub
run: |
echo "${{ secrets.DOCKERHUB_TOKEN }}" | docker login -u ${{ secrets.DOCKERHUB_USER }} --password-stdin
docker tag myapp:${{ github.sha }} myrepo/myapp:latest
docker push myrepo/myapp:latest
手順4:Secretsを設定
GitHubのリポジトリ設定から「Settings → Secrets and variables → Actions」を開き、
以下を登録します。
DOCKERHUB_USER
: Docker Hubのユーザー名DOCKERHUB_TOKEN
: アクセストークン
これで、pushすると自動的にDockerイメージがビルド・プッシュされるようになります。
GitLab CI/CDでも応用してみよう
GitLab CI/CDでも同様の仕組みを構築可能です。
以下は.gitlab-ci.yml
の例です。
stages:
- build
- deploy
build:
image: docker:24.0
services:
- docker:dind
script:
- docker build -t registry.gitlab.com/myuser/myapp:latest .
- docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY
- docker push registry.gitlab.com/myuser/myapp:latest
docker:dind
(Docker in Docker)を利用して、Runner内でDockerを操作できるようにしています。
ベストプラクティスと注意点
CI/CDとDockerの連携を効率的に運用するために、次のポイントを意識しましょう。
1. キャッシュ活用でビルド時間短縮
Dockerのレイヤーキャッシュを最大限活用するため、package.json
のCOPYを先に行うなどの工夫をしましょう。
2. Secrets管理を徹底
アクセストークンや環境変数をコードに直書きせず、必ずSecretsとして登録します。
3. 環境別のデプロイ設定
ステージングと本番環境で異なるタグ・レジストリを使う構成を推奨します。
4. パイプライン監視
GitHub Actions InsightsやSlack通知を利用して、ビルドの成功率やデプロイ状況を可視化しましょう。
まとめ
DockerとCI/CDを組み合わせることで、アプリケーションのリリースプロセスを完全自動化できます。
「pushするだけでデプロイ」が可能となり、開発スピードと品質を両立することができます。
特にGitHub ActionsやGitLab CIを活用すれば、わずか数十行の設定でパイプラインを構築できるため、
小規模チームから大規模プロジェクトまで幅広く導入可能です。
次のステップ
- 実際にGitHub Actionsを導入して自動ビルドを試す
- Docker Composeを使ったステージング環境を自動デプロイ
- TerraformなどのIaCツールと組み合わせてインフラも自動化
- CI/CDパイプラインの可視化・監視を導入して信頼性を高める
この仕組みを一度構築してしまえば、開発者は本来の価値創造に集中できます。
次回は「Docker ComposeとCI/CDを組み合わせたマルチコンテナ自動デプロイ」をテーマに、さらに実践的な自動化構築を紹介します。
コメントを残す