メインコンテンツまでスキップ

1

Dockerの基本的な仕組みやフォルダ構成、サンプルファイルを使ったプロジェクト例を紹介します。


1. Dockerの基本的な仕組み

Dockerは、アプリケーションをコンテナ化することで、環境依存を減らし、どこでも同じ環境で動作させることができる技術です。基本的な仕組みは以下のようになります。

  1. Dockerfile を作成し、コンテナの環境を定義する。
  2. Docker Image をビルドする(Dockerfileから作成)。
  3. Docker Container を起動する(イメージから作成)。
  4. 必要に応じて Docker Compose を使い、複数のコンテナを管理する。

2. シンプルなプロジェクト構成

例えば、Node.js + Express を Docker で動かすプロジェクトのフォルダ構成は以下のようになります。

my-docker-app/
│── docker-compose.yml # 複数のコンテナ管理(DB などを含む場合)
│── Dockerfile # コンテナのビルド定義
│── .dockerignore # 除外ファイル
│── app/ # アプリケーション本体
│ ├── package.json
│ ├── package-lock.json
│ ├── server.js
│ └── src/
│ ├── routes/
│ ├── controllers/
│ └── views/

3. 必要なファイルの詳細

(1) Dockerfile(コンテナのビルド定義)

# ベースイメージ(Node.js 18)
FROM node:18

# 作業ディレクトリの設定
WORKDIR /usr/src/app

# 依存関係のコピーとインストール
COPY package*.json ./
RUN npm install

# アプリケーションファイルのコピー
COPY . .

# サーバーを起動するポート
EXPOSE 3000

# コンテナ起動時に実行するコマンド
CMD ["node", "server.js"]

(2) docker-compose.yml(複数コンテナの管理)

version: "3.8"
services:
app:
build: .
ports:
- "3000:3000"
volumes:
- .:/usr/src/app
- /usr/src/app/node_modules
environment:
- NODE_ENV=development

(3) .dockerignore(不要なファイルを除外)

node_modules
npm-debug.log
.DS_Store

(4) server.js(シンプルな Express アプリ)

const express = require("express");
const app = express();

app.get("/", (req, res) => {
res.send("Hello Docker!");
});

app.listen(3000, () => {
console.log("Server running on port 3000");
});

4. 実行手順

  1. Docker イメージをビルドする

    docker build -t my-docker-app .
  2. コンテナを起動する

    docker run -p 3000:3000 my-docker-app
  3. ブラウザで http://localhost:3000 にアクセス

  4. docker-compose を使う場合

    docker-compose up --build

5. 応用例(データベースとの連携)

もし、PostgreSQL を追加したい場合は、docker-compose.yml に以下のように追加します。

services:
app:
build: .
ports:
- "3000:3000"
environment:
- NODE_ENV=development
- DATABASE_URL=postgres://user:password@db:5432/mydatabase
depends_on:
- db

db:
image: postgres:14
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: password
POSTGRES_DB: mydatabase
ports:
- "5432:5432"

このプロジェクト例をベースにすれば、AWSやDocker Hubにデプロイすることもできます。何か他に知りたいことがあれば聞いてください! 🚀