初めに
今回は、初めてDockerを一から導入し、理解しながら進めてみた経験をアウトプットとして記事にまとめました。この記事は、実際のDockerの構築の仕方ではなく、Dockerの全体的な理解にフォーカスして説明してきます。
Dockerって何?
Dockerを使うと、チーム開発が非常にスムーズになります。例えば、個人で開発している場合、フロントエンド、バックエンド、データベースなどをそれぞれ個人のPC上で環境構築していることがあります。そのコードをGitHubに上げて、他の開発者がクローンし、ローカル環境で動かしたいとき、環境構築が再び必要になることがよくあります。特にデータベースなどの環境が整っていないと、その人は一から自分のPCで同じ環境を構築しなければならず、これがとても手間です。
そこで登場するのがDockerです。Dockerを使うと、仮想コンテナ内にデータベースやAPI、フロントエンドのコードなどをすべてパッケージ化できます。そのコンテナを他の人が立ち上げるだけで、ローカル環境でも同じ環境が再現され、動作確認などが簡単に行えます。このように、Dockerを使うことでチーム全体の開発効率が向上します。
ここからは、Dockerを使う際に必要なことを5つ説明していきます。
DockerFileとは
Dockerfileとは、簡単に言うと設計図のようなものです。コンテナを立ち上げるには、その設定や手順が必要ですが、その設計書にあたるのがDockerfileです。
イメージとしては、まずDockerfileという設計図を作成し、その設計図に基づいてDockerイメージをビルドします。そして、そのイメージを元にコンテナを立ち上げます。Dockerfileを作成しておけば、誰のローカル環境でもこの設計図に基づいて同じコンテナを簡単に立ち上げられる、という仕組みです。
Dockerイメージとは
Dockerイメージは、Dockerfileを元にビルドされた成果物です。このイメージには、アプリケーションのコード、依存パッケージ、環境設定などがすべて含まれています。イメージは、動作する環境をまるごとパッケージ化しており、このイメージからDockerコンテナを作成します。
Dockerコンテナとは
Dockerコンテナとは、Dockerイメージをもとに作成される実行可能な仮想環境のようなものです。コンテナは、軽量で、システムリソースを効率よく使用しながら、アプリケーションを他のプロセスから隔離して動作させます。Dockerコンテナを使用すると、イメージに基づいて簡単にアプリケーション環境を再現でき、どのPCでも同じように動作させることができます。
Docker-Composeとは
ここから少し話の流れが変わります。先ほど、Dockerの「設計書(Dockerfile)→イメージ→コンテナ」という流れについて説明しましたが、まだ不便な点があります。それは、複数のコンテナを作成したい場合です。
例えば、フロントエンド、バックエンド、データベースなどの異なるサービスを一つのコンテナにまとめるのは非常に難しいです。ここで登場するのが Docker Compose です。Docker Composeを使うことで、複数のコンテナを簡単に管理し、それらの結びつきをスムーズに設定することができます。
以下に例としてDocker Composeのソースコードを載せておきます。すべてを理解する必要はありませんが、特に注目してほしいのは app と db の部分です。app と db で別々のコンテナを作成するコードや、これらのコンテナがどのように連携しているかが書かれています。最初は「ここでそれぞれのコンテナを作っているんだな」という程度の理解で問題ありません。
version: "3" # Composeファイルのバージョン
services:
app:
build: .
ports:
- "3000:3000" # ホストのポート3000をコンテナの3000にマッピング
environment:
- DATABASE_URL=postgres://postgres:password@db:5432/mydb # DB接続情報
depends_on:
- db # appコンテナはdbコンテナに依存
volumes:
- .:/app # ローカルのカレントディレクトリをコンテナ内の/appにマウント
db:
image: postgres:14 # 使用するPostgreSQLのバージョン
environment:
POSTGRES_USER: postgres # データベースのユーザー名
POSTGRES_PASSWORD: password # データベースのパスワード
POSTGRES_DB: mydb # 作成するデータベース名
volumes:
- postgres_data:/var/lib/postgresql/data # データ永続化のためのボリューム
ports:
- "5432:5432" # ホストとコンテナ間でポート5432をマッピング
volumes:
postgres_data: # データ永続化用のボリューム定義
これでDockerの基本的な解説は以上になります。
次回の記事では、Next.jsの環境をDockerを使って構築する方法や、実際に苦戦した所について詳しく解説していきます。
ここまで読んでいただき、ありがとうございました。
