Contents
JenkinsとDockerによるCI/CD環境構築の実践ガイド:セキュリティ設定も含む手順を解説
JenkinsとDockerの連携は、現代のDevOpsワークフローにおいて不可欠な技術です。開発からテスト・本番環境へのスムーズな移行を実現するためには、両者の役割分担と適切な設定が鍵となります。この記事では、Jenkins Docker コンテナ CI/CD 設定 手順をステップバイステップで解説し、実務での導入を支援します。最新のDockerイメージとの連携やセキュリティ設定にも焦点を当てています。
JenkinsとDockerのCI/CD導入における役割と位置づけ
DevOpsワークフローにおいてJenkinsとDockerはそれぞれ異なる強みを持ち、その連携が効率化に大きく寄与します。このセクションでは、両者の役割とその組み合わせによるメリットについて詳しく説明します。
DevOpsワークフローにおけるツール連携の重要性
Jenkinsはコード変更を検知し、自動でビルド・テスト・デプロイを実行するCI/CDパイプラインを構築できます。一方、Dockerはアプリケーションとその依存関係をコンテナ化することで、環境差異による不具合を排除します。
具体例
開発環境で動作したコードが本番環境でエラーになるケースは、Dockerのコンテナ技術によって再現性が確保されます。Jenkinsはこのコンテナを作成・管理し、継続的デプロイを実現します。
- Jenkins: 自動化(ビルド・テスト・デプロイ)
- Docker: 環境の一貫性(アプリケーションの依存関係の固定)
最新版Dockerイメージとの連携設定手順
Jenkinsと最新版Dockerの連携には、セキュリティ強化が不可欠です。以下に具体的な設定手順を解説します。
Docker Daemonのセキュリティ強化設定
Dockerデーモンの設定ファイル(/etc/docker/daemon.json)で以下の項目を追加します。
注意: この設定はLinux環境向けであり、Windows/macOSでは異なる設定が必要です。
|
1 2 3 4 5 6 7 8 9 10 11 |
{ "exec-opts": ["native.cgroupdriver=systemd"], "log-driver": "json-file", "log-opts": { "max-size": "100m", "max-file": "3" }, "insecure-registries" : [], "registry-mirrors": [] } |
注意: 不要な
insecure-registriesの設定はセキュリティリスクになるため、適切に管理してください。
JenkinsサーバーでのDocker CLIインストール
JenkinsサーバーでDocker CLIを使用するには、以下を実行します。
-
Docker公式リポジトリを追加
bash
sudo apt-get update && sudo apt-get install -y ca-certificates curl gnupg
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update -
Docker Engineをインストール
bash
sudo apt-get install -y docker-ce docker-ce-cli containerd.io -
JenkinsユーザーにDocker実行権限を付与
bash
sudo usermod -aG docker jenkins
実践的なDockerfile作成ガイドライン
Dockerfileの品質は、CI/CDパイプライン全体の信頼性に直結します。以下にベストプラクティスを紹介します。
多段階ビルドの最適化手法
多段階ビルドでは、開発環境と実行環境を分離することでイメージサイズを削減できます。
例:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# 開発環境用(依存関係のみ) FROM node:18 as builder WORKDIR /app COPY package*.json ./ RUN npm install COPY . . RUN npm run build # 実行環境用(最小化) FROM nginx:alpine COPY --from=builder /app/dist /usr/share/nginx/html EXPOSE 80 CMD ["nginx", "-g", "daemon off;"] |
脆弱性スキャンインテグレーション
CI/CDパイプラインにtrivyやclairなどを使うことで、Dockerイメージのセキュリティを自動チェックできます。
|
1 2 3 4 5 6 |
stage('Security Scan') { steps { sh 'trivy image --format table --severity HIGH,CRITICAL my-image' } } |
| ツール | 機能 | 利点 |
|---|---|---|
| Trivy | イメージ・コンテナの脆弱性スキャン | GitHub Actionsとの連携が容易 |
| Clair | イメージ内のパッケージ脆弱性の検出 | カスタマイズ性が高い |
Jenkins PipelineでのDockerコンテナ利用
Jenkins PipelineでDockerを活用するには、Declarative Pipeline構文とDocker CLIの連携が重要です。
Pipelineアーキテクチャの設計原則
Pipelineは「ビルド→テスト→デプロイ」の3段階で設計します。Dockerイメージのバージョン管理にはタグを活用し、環境ごとに分離します。
例: 環境別タグ付け戦略
- 開発:
myapp-dev:v1.0 - ステージング:
myapp-stage:v1.0 - 本番:
myapp-prod:v1.0
Dockerイメージのバージョン管理
Pipeline内でdocker.build()やdocker.push()を使用します。以下はDeclarative Pipelineの例です。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
pipeline { agent any stages { stage('Build') { steps { script { docker.build("myapp:${env.BRANCH_NAME}", ".") } } } stage('Push to Registry') { when { branch 'main' } steps { script { docker.withRegistry('https://registry.example.com', 'my-registry-credentials') { docker.image("myapp:${env.BRANCH_NAME}").push() } } } } } } |
セキュリティ強化設定の詳細な実装
コンテナ環境におけるセキュリティリスクを回避するには、特権昇格防止やネットワークポリシー設定が必須です。
Docker.sockアクセス制限の実装例
/var/run/docker.sockへのアクセスはJenkinsユーザーに限定します。
-
sudoersファイル編集:
bash
sudo visudo -
以下の行を追加:
bash
jenkins ALL=(ALL) NOPASSWD: /usr/bin/docker -
Jenkinsジョブ内で
dockerコマンドを使用する際は、root権限で実行します。
Jenkinsユーザ権限管理のベストプラクティス
- 最小特権原則を遵守し、Jenkinsユーザーに不要な権限は付与しない。
- 定期的なパスワード変更や2段階認証(2FA)を導入する。
ステージングと本番環境の切り分け戦略
環境ごとに設定が異なる場合、Pipelineで条件分岐を実装し、自動デプロイ時のロールバック対応が必要です。
環境変数管理のベストプラクティス
環境変数はJenkinsfileやenvオブジェクトに定義します。
|
1 2 3 4 5 |
environment { STAGING_ENV = 'staging.example.com' PROD_ENV = 'prod.example.com' } |
自動デプロイ時のロールバック手順
- デプロイ前に現在のイメージをバージョン管理(例:
myapp-prod:v1.0)。 - 新しいイメージでテストが成功した場合のみ、本番環境に適用。
- 失敗時は
docker tagとdocker pushで前のバージョンに戻す。
| 環境 | デプロイ対象のイメージタグ | 備考 |
|---|---|---|
| ステージング | myapp-stage:v1.0 |
テスト後、本番に適用可 |
| 本番 | myapp-prod:v1.0 |
自動ロールバック対応 |
CI/CD環境構築の要点まとめ
JenkinsとDockerの連携でCI/CDを効率化し、セキュリティリスクを最小限に抑えることが重要です。以下はこの記事で解説した主なポイントです。
- JenkinsとDockerの役割分担と設定手順
- Dockerイメージ管理とセキュリティ強化
- Pipelineアーキテクチャ設計とロールバック対応
実務で即戦力となるJenkins + Dockerの設定ファイルやテンプレートについては、下記の注意事項に従ってご利用ください。