Dockerとは何か?なぜ現代開発に欠かせないのか 

CI/CDについてこれまで書いてきましたが、今回からCI/CDを支える要素技術として、実装技術(実行基盤)でDockerについて説明します。

Dockerはコンテナ化技術により、「自分のマシンでは動いているのに」という問題を解決し、CI/CDにおける環境間の差異をなくす鍵となります。

DockerをCI/CDに組み込むことで、パッケージングやテストの自動化が実現し、ソフトウェアのリリース速度が大幅に向上します。

Dockerとは?

Docker は、アプリケーションとその実行環境(ライブラリ、設定、ランタイムなど)を一つにまとめて「コンテナ」としてパッケージ化するプラットフォームです。

これにより、開発環境・テスト環境・本番環境の違いによるトラブルを防ぐことができます。

Dockerが生まれた背景

Dockerが登場する前、次のような問題がよく発生していました。

· 開発環境では動くが、本番環境では動かない

· ライブラリのバージョン違い

· OSや設定の不一致

例 よくある事例の一つとして 、ある開発者のローカル環境ではアプリケーションが正常に動作しているのに対し、別の開発者のローカル環境では問題が発生するケースも存在します。このような課題を迅速に解決するため、Docker が誕生し、企業に大幅な時間とコストの削減をもたらしています。

Dockerfileとは何か? 

Dockerfile はテキスト形式のファイルであり、Docker が Docker イメージをビルドする際に参照する一連のコマンドを記述したものです。 

Dockerfile を用いて構築された、Java 17 を使用する Spring アプリケーションの一

例:

# ステージ1: 実行環境の構築

# Java 17 の軽量な Alpine Linux イメージをベースにする

FROM eclipse-temurin:17-jre-alpine

# 作業ディレクトリの作成

WORKDIR /app

# アプリケーションの実行ファイルをイメージにコピーする

# ホスト側の target/app.jar を container 側の app.jar としてコピー

COPY target/app.jar app.jar

# 実行時のユーザーを指定

# Rootユーザー以外で実行することが推奨されます

RUN addgroup -S spring && adduser -S spring -G spring

USER spring:spring

# アプリケーションが使用するポートを指定

EXPOSE 8080

# コンテナ起動時にアプリケーションを実行するコマンド

ENTRYPOINT ["java", "-jar", "app.jar"]

Dockerの基本概念

Image(イメージ)

イメージとは、ソフトウェアを実行するために必要なすべての要素を含んだ、読み取り専用のパッケージファイルです。

具体的には、次の内容が含まれます:

· OSのベース(例:Alpine Linux)

· ライブラリ

· アプリケーション

· 設定ファイル

などを 層(Layer)構造 で保存したものです。

イメージ自体は実行されません。実行されるのは Container です。

Containerとは何か?

Container は、イメージから生成される実行環境です。

つまり:

イメージ → 静的(設計図)

Container → 動的(実際に動いている状態)

Container は独立しています。他の Container と影響し合いません。

実際の例:

上記で作成したイメージを実行すると、Docker はそのイメージに基づいて 1つのコンテナを作成し、Docker イメージ内で事前に設定された構成が適用された状態で起動します。

まとめ

まとめると、Dockerfile、Docker イメージ、Docker Containerの関係は以下のとおりです:

Dockerfile

docker build

Image

docker run

Container

参考資料: 

Manuals | Docker Docs

Learn how to install, set up, configure, and use Docker products with this collection of user guides