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

こんにちは。私はダットです。ソフトウェアエンジニアです。Javaのプログラムを作ることをしています。
プログラミングの知識や経験をみなさんにシェアするのが好きです。
このブログがあなたの役に立つとうれしいです。
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
参考資料:
