🌟

今までなんとなく使ってたDockerをちゃんと理解する

に公開

なんとなくの操作で使っていたDocker

今までなんとなくの操作で、用意してもらったDocker環境を利用していた。
今回自分でDocker環境を一から構築しようと思って、勉強した内容のまとめ。

実際のコード

Dockerで[Nextjs x PostgreSQL]の構成で構築

services:
  app:
    container_name: app
    tty: true
    networks:
      - app_network
    build:
      context: .
    ports:
      - "3000:3000"
    volumes:
      - ./:/app
      - node_modules:/app/node_modules
    depends_on:
      - db

  db:
    image: postgres:15
    hostname: db
    container_name: db
    env_file:
      - ./.env
    networks:
      - app_network
    environment:
      - TZ=Asia/Tokyo
      - POSTGRES_DB=$DB_NAME
      - POSTGRES_USER=$DB_USER
      - POSTGRES_PASSWORD=$DB_PASS
      - PGDATA=/var/lib/postgresql/data/pgdata
    ports:
      - 5432:5432
    volumes:
      - db_data:/var/lib/postgresql/data
      - ./sql:/docker-entrypoint-initdb.d

networks:
  app_network:
    driver: bridge

volumes:
  node_modules:
  db_data:
Dockerfile
FROM node:18-alpine

RUN apk add g++ make py3-pip

WORKDIR /app/

COPY ./ /app/
RUN apk add --no-cache git
RUN npm install -g npm@9.7.2
RUN npm install -g node-gyp
RUN npm upgrade --save --legacy-peer-deps
RUN npm install

Node環境構築部分

  app:
    container_name: app
    tty: true          
    networks:
      - app_network
    build:
      context: .
    ports:
      - "3000:3000"
    volumes:
      - ./:/app
      - node_modules:/app/node_modules
    depends_on:
      - db

networks:
  app_network:
    driver: bridge

volumes:
  node_modules:

1. container_name

コンテナの名前を明示的に設定することができる。
設定しない場合、自動で命名される。

2. tty

仮想端末を配置するためのコマンド

true  → 配置する
false → 配置しない
※配置しないなら書かなくてもよい

仮想端末を配置することでフォアグラウンドで実行するプロセスが無い場合に起こる、自動的な正常終了を防ぐ役割を持つ。

3. networks

デフォルトのbridgeは、同じホスト上の他のコンテナと通信する必要がある場合に設定。
その他の設定値は下記公式を参照
https://docs.docker.com/engine/network/drivers/

4. build

Dockerfileを使用する場合、Dockerfileの相対パスを記載

5. ports

ローカルホストとコンテナのポートを繋げる設定
左側にローカルホストのポート番号、右側にDocker内でのポート番号を指定します。

6. volumes

データファイルの保存場所を設定。
左側にローカルホストの相対パス、右側にDocker内の絶対パスを指定します。
https://docs.docker.jp/compose/compose-file/compose-file-v3.html#compose-file-v3-volume-configuration-reference

7. depends_on

Service間の依存関係を指定するもの
起動時、depends_onが指定されたServiceは、depends_onで指定されたServiceが起動した後に起動するようになる。
終了時、depends_onが指定されたServiceは、depends_onで指定されたServiceが終了する前に終了するようになる。
https://docs.docker.jp/compose/compose-file/compose-file-v3.html#depends-on

PostgreSQL環境構築部分

  db:
    image: postgres:15
    hostname: db
    container_name: db
    env_file:
      - ./.env
    networks:
      - app_network
    environment:
      - TZ=Asia/Tokyo
      - POSTGRES_DB=$DB_NAME
      - POSTGRES_USER=$DB_USER
      - POSTGRES_PASSWORD=$DB_PASS
      - PGDATA=/var/lib/postgresql/data/pgdata
    ports:
      - 5432:5432
    volumes:
      - db_data:/var/lib/postgresql/data
      - ./sql:/docker-entrypoint-initdb.d

networks:
  app_network:
    driver: bridge

volumes:
  node_modules:
  db_data:

※nodejs環境構築部分で説明済みの項目はスキップ

1. image

DockerHubから、Dockerコンテナの動作環境となるテンプレート(DockerImage)をしてするパラメーター。
指定方法は使用するイメージに依存するので、DockerHubを参照。
https://hub.docker.com/search?badges=official

hostname

ホスト名の明示的な指定する。
コンテナ間の通信を行う際などに利用する。

2. env_file

.envに指定した環境変数を読み込ませるための指定。
ファイルの相対パスとファイル名を記載する。

3. environment

TZ・・・タイムゾーンの設定(日本時間ならAsia/Tokyo)
POSTGRES_DB・・・DB名
POSTGRES_USER・・・デフォルトのユーパーユーザー名
POSTGRES_PASSWORD・・・デフォルトのユーパーユーザーのパスワード
PGDATA・・・DBデータの保存場所を指定
その他のパラメーターは以下を参照
https://hub.docker.com/_/postgres

Discussion