Yanonoblog!

こつこつと

Dockerの設定周りと基本コマンドの解説

はじめに

Dockerでアプリケーション構築 - Rails7 × Next.js

上記の記事では手順のみを書いていきましたが今回の記事では詳細に関する内容をまとめていきたいと思います。

docker-compose.ymlとは

Dockerコンテナを複数同時に実行するための設定ファイルのことです。

各サービス(Dockerコンテナ)の設定を定義し、サービス間の依存関係を定義することができます。

今回のようにbackend、frontend、postgresなどの複数のDockerコンテナを使用するWebアプリケーションを開発している場合、Docker Composeを使ってコンテナの起動や停止、削除を一括で管理することができます。

コンテナ間の通信を簡単に設定することができるため、開発環境の構築やテスト環境の構築などにも利用されます。

Dockerコンテナの操作に使用される主要なコマンド

以下にDockerコンテナの操作に使用される主要なコマンドを表にまとめます。

コマンド 説明
docker run イメージから新しいコンテナを作成し、実行する
docker start 停止されたコンテナを開始する
docker stop コンテナを停止する
docker restart コンテナを再起動する
docker rm コンテナを削除する
docker ps 実行中のコンテナのリストを表示する
docker ps -a すべてのコンテナのリストを表示する
docker images ローカルイメージのリストを表示する
docker build Dockerfileからイメージを作成する
docker-compose up コンテナを作成し、開始する
docker-compose down コンテナを停止し、削除する

Docker ComposeとDockerコマンドの違い

Dockerコマンドは、単一のコンテナを管理するために使用されるのに対し、Docker Composeは、複数のコンテナを管理するために使用されます。

詳細を以下の表にまとめます。

Docker Compose Docker
複数のコンテナを定義して管理できる 個々のコンテナの管理に特化している
コンテナ間の依存関係を定義して、一括で起動や停止、削除ができる 個々のコンテナの起動や停止、削除などを行う
YAMLで定義された複数のコンテナを、docker-composeコマンドで一括管理できる コマンドラインで直接個々のコンテナの管理を行う

Dockerの構築する際の参考

基本的にはDocker Hubで配布されているものを利用して作成します。

今回は他の記事も参考にさせていただきました。

postgres: https://hub.docker.com/_/postgres

docker-compose.yml - 記述例と解説

version: '3.7'

services:
# PostgreSQLサービスを定義
  postgres:
# Docker Hubの公式イメージを指定
    image: postgres:11.6-alpine
    ports:
# ホスト側のポートとコンテナ側のポートをマッピング
      - '5432:5432'
# postgresのログイン・環境設定
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: postgres
      POSTGRES_INITDB_ARGS: '--encoding=UTF-8 --locale=ja_JP.UTF-8'
      TZ: Asia/Tokyo
# データ永続化のためのボリュームをマウント
    volumes:
      - postgres_volume:/var/lib/postgresql
# コンテナのホスト名を指定
    hostname: postgres
# Railsアプリケーションのバックエンドサービスを定義
  backend:
# コンテナの起動時にttyを割り当てる(デバッグのためにログを表示することや、コンテナ内でコマンドを実行する)
    tty: true
# 起動時にPostgreSQLサービスが先に起動されるように指定
    depends_on:
      - postgres
    build:
# ビルドに使用するDockerfileのあるディレクトリを指定
      context: ./backend/
# ビルドに使用するDockerfileを指定
      dockerfile: Dockerfile
    ports:
      - 3000:3000
    volumes:
# ソースコードのマウント
      - ./backend:/app
# コンテナの起動時に実行するコマンドを指定
    command: rails server -b 0.0.0.0

# Reactアプリケーションのフロントエンドサービスを定義
  frontend:
    build:
      context: ./frontend/
      dockerfile: Dockerfile
    volumes:
      - ./frontend/app:/usr/src/app
    command: 'yarn dev'
    ports:
      - "8000:3000"

# ボリュームを定義
volumes:
  postgres_volume:
    driver: local

Dockerfileとは

DockerfileはDockerイメージをビルドするための手順を記述したスクリプトファイルです。

Dockerfileには、以下のような内容を記述することができます。

  1. ベースイメージの指定
  2. 必要なパッケージやソフトウェアのインストール
  3. ファイルのコピー
  4. 環境変数の設定
  5. ポートのエクスポート
  6. コンテナ起動時に実行されるコマンドの指定

Dockerの起動の流れ

例えばdocker-compose build コマンドを実行すると、docker-compose.yml ファイルに定義された各サービスのbuildセクションに指定されたコンテキストをもとに 各サービスの Dockerfile のビルドが行われます。

先程の「docker-compose.yml - 記述例と解説」でそれぞれのコンテナの記述にbuildがありましたね。あそこにbuildする際のDockerfileの指定などが設定されています。

Dockerfile のビルド中には、Docker イメージを作成するために必要なすべての依存関係が自動的に解決されます。

docker-compose build コマンドで必要なイメージをビルドしたあと、docker-compose up コマンドを実行すると、docker-compose.yml ファイルに定義されたサービスを起動します。

それぞれのサービスは、指定されたイメージから新しくコンテナを作成し、起動します。

frontendコンテナのDockerfile - 記述例と解説

# Dockerイメージの元となるNode.jsの16-alpineバージョンを取得する
FROM node:16-alpine

# コンテナ内での作業ディレクトリを設定する
WORKDIR /usr/src/app

# package.jsonとyarn.lockをローカルからコンテナ内にコピーする
COPY package.json yarn.lock ./

# 必要なNode.jsパッケージをインストールする
RUN yarn install

# ローカルのファイルを全てコンテナ内にコピーする
COPY . .

# コンテナ起動時に実行されるコマンドを指定する
CMD ["yarn", "dev"]

backendコンテナのDockerfile - 記述例と解説

# Rubyのバージョンを指定する
FROM ruby:3.2.2

# apt-getコマンドで各種パッケージをインストールする
RUN apt-get update -qq \
  && apt-get install -y nodejs postgresql-client npm \
  && rm -rf /var/lib/apt/lists/* \
  && npm install --global yarn

# コンテナ内の作業ディレクトリを指定する
WORKDIR /app

# Gemfileなど必要なファイルをコピーする
COPY Gemfile /app/Gemfile
COPY Gemfile.lock /app/Gemfile.lock

# bundle installコマンドでRailsアプリに必要なgemをインストールする
RUN bundle install

# entrypoint.shファイルをコンテナ内にコピーする
COPY entrypoint.sh /usr/bin/

# entrypoint.shファイルの実行権限を与える
RUN chmod +x /usr/bin/entrypoint.sh

# コンテナ起動時のエントリーポイントを設定する
ENTRYPOINT ["entrypoint.sh"]

# ポート3000を公開する
EXPOSE 3000

# コンテナ起動時に実行するコマンドを指定する
CMD ["rails", "server", "-b", "0.0.0.0"]

database.yml - 記述例と解説

database.ymlはRailsアプリケーションがコンテナ内で動作する場合の設定を定義するために使用されます。

Dockerコンテナの起動時に、このファイルに定義された接続情報を使用してPostgreSQLコンテナに接続します。

# デフォルトの設定を定義
default: &default
  adapter: postgresql
  encoding: unicode
 # Railsが使用するスレッド数の最大数を設定
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: postgres # データベースのユーザ名
  password: postgres # データベースのパスワード
  host: postgres # データベースのホスト名

# 開発環境の設定
development:
  <<: *default # デフォルトの設定を引き継ぐ
  database: postgres_development # データベース名を設定

# テスト環境の設定
test:
  <<: *default # デフォルトの設定を引き継ぐ
  database: postgres_test # データベース名を設定

# 本番環境の設定
production:
  <<: *default # デフォルトの設定を引き継ぐ
  database: postgres_production # データベース名を設定
  password: <%= ENV["POSTGRES_DATABASE_PASSWORD"] %> # データベースのパスワードは環境変数から取得

おわりに

コメント

本記事の内容は以上になります!

参考になったり学びのきっかけになりますと幸いです。

間違いがありましたら修正いたしますので、ご指摘ください。

興味があれば他の記事も更新していきますので是非ご覧になってください♪


プログラミングスクールのご紹介 (卒業生より)

お世話になったプログラミングスクールであるRUNTEQです♪

https://runteq.jp/r/ohtFwbjW

こちらのリンクを経由すると1万円引きになります。

RUNTEQを通じて開発学習の末、受託開発企業をご紹介いただき、現在も双方とご縁があります。

もし、興味がありましたらお気軽にコメントか、TwitterのDMでお声掛けください。

https://twitter.com/outputky