Dockerによるシステムデプロイの基礎

DockerとJenkinsを活用した自動デプロイ

フロントエンド開発者として、デプロイの仕組みは学習が不足しているものの、実務では自社システムの構築・公開に必要な手順を経験しています。以下は個人的な運用ノウハウのまとめであり、参考程度にご活用ください。

本環境では Jenkins + Docker を用いた自動ビルド・リポジトリへのプッシュを実施しています。特にJenkinsの役割は、コード変更を検知して自動的にビルド・タグ付け・リモートレジストリへの登録を行う点にあります。

CI/CDパイプラインの設定画面で、対象のGitリポジトリとブランチを指定しておくことで、開発者が手動で npm run build を実行する必要がなくなります。コードをコミットすれば、自動的にビルドとイメージ生成が行われます。

ジョブのスクリプト設定部分では、以下のコマンドが実行されます:

cd /workspace/project
docker build -t <registry>/<project>:<tag> .
docker push <registry>/<project>:<tag>

この際、プロジェクトルートには Dockerfile が存在しており、ビルドコンテキストとして使用されます。

デプロイサーバーへの接続とコンテナ起動

Jenkinsによるビルド・プッシュが完了後、デプロイサーバー(例:セキュリティゲートウェイ)にログインし、以下の手順でサービスを起動します。

1. プライベートユーザーからroot権限へ切り替え

sudo su

2. 実行中のコンテナ一覧の確認

docker ps

現在稼働中のコンテナのみ表示されます。詳細情報として、コンテナ名、状態、ポートマッピング、使用イメージなどが確認できます。

docker ps -a

すべてのコンテナ(停止中も含む)を表示します。終了コードや作成日時も確認可能で、トラブルシューティングに有用です。

3. ローカルに保存されたイメージの一覧表示

docker images

4. イメージの取得(プル)

docker pull <ip>:<port>/<namespace>/<image>:<tag>

例:
docker pull 192.168.1.10:5000/myapp/web:v3.1
ここで tag はビルド番号やバージョンを表し、Jenkinsでの毎回のビルドで更新されます。

5. 起動スクリプトの編集

アプリケーションの起動スクリプト(例:start.sh)を開き、最新のイメージタグに差し替えます。

vim start.sh

編集モードに入るには a もしくは i キーを押下。編集後は Esc → :wq で保存・終了。

6. 編集内容の確認

cat start.sh

変更が反映されているかを再確認します。

7. 前回のコンテナを停止

docker stop <container_id>

コンテナIDは最初の数文字でも識別可能です。完全なIDではなくても動作します。

8. Nginxコンテナの起動(例)

docker run -d \
  --name nginx-server \
  -p 31655:80 \
  -v /home/apk:/usr/share/nginx/html \
  -v /etc/nginx/conf.d:/etc/nginx/conf.d \
  -v /var/log/nginx:/var/log/nginx \
  --restart=always \
  nginx:1.29.1-alpine

説明:

  • -d:バックグラウンドで実行
  • --name nginx-server:コンテナに名前を付与
  • -p 31655:80:ホストの31655ポートをコンテナの80ポートに紐づける
  • -v /home/apk:/usr/share/nginx/html:ホストのファイルディレクトリをコンテナ内の静的ファイル配信先にマウント
  • -v /etc/nginx/conf.d:/etc/nginx/conf.d:Nginx設定ファイルをホスト側から編集可能にする
  • -v /var/log/nginx:/var/log/nginx:ログ出力先をホスト側に共有
  • --restart=always:異常終了時も自動再起動
  • nginx:1.29.1-alpine:使用するイメージのバージョン

ホストに /etc/nginx/conf.d や /var/log/nginx が存在しない場合、Dockerが自動的に作成しますが、事前にディレクトリを作成してパーミッションを適切に設定することを推奨します。

9. コンテナのマウント情報の確認

docker inspect nginx-server

出力結果の Mounts セクションに、ホストとコンテナ間のマウント関係が記載されます。

"Mounts": [
    {
        "Type": "bind",
        "Source": "/host/config/nginx.conf",
        "Destination": "/etc/nginx/nginx.conf",
        "Mode": "rw"
    }
]

10. スクリプトによる起動

上記の docker run コマンドを start.sh に格納し、実行することで一貫性のある操作が可能になります。

sh start.sh

また、既存のコンテナがある場合は docker start <name> も利用できますが、実際にはスクリプト方式が主流です。

11. ログのリアルタイム監視

docker logs -f nginx-server

または、最後の100行を表示しつつ、新規ログを継続的に表示:

docker logs --tail 100 -f nginx-server

12. 不要なイメージの削除

docker rmi <image_id>

13. コンテナ内部にアクセス

docker exec -it nginx-server sh

コンテナ内でシェルを起動し、ファイルの確認やデバッグが可能です。

14. イメージをtar形式でエクスポート

docker save -o /tmp/app.tar <image_name>:<tag>

例:
docker save -o /tmp/web.tar 10.12.2.22:30003/electricity/patrol-api:30

15. tarファイルからイメージをインポート

docker load -i /path/to/web.tar

読み込み後、docker images で確認可能です。

16. docker-composeによる複数コンテナの管理

docker-compose up -d

カレントディレクトリにある docker-compose.yml ファイルに基づき、定義されたすべてのサービスコンテナをバックグラウンドで起動します。

以上が日常的に使用している主要なコマンド群です。これらはフロントエンドエンジニアとしての現場デプロイに十分に機能しており、専門的なオペレーション知識がなくても運用可能です。あくまで自己流の記録であり、他のチームの運用とは異なる可能性があります。

タグ: Docker Jenkins linux nginx docker-compose

9月18日 08:28 投稿