Open4

Dockerと仲良くなる🤝

あっぴーあっぴー

front/Dockerfile

FROM node:19.4.0 # ビルドステージのベースイメージを指定
WORKDIR /app # Dockerコンテナ内の作業ディレクトリを設定
あっぴーあっぴー

back/Dockerfile

FROM ruby:3.2.2 # ベースイメージを指定

# システムパッケージリストの更新、Node.jsとPostgreSQLのクライアントをインストール ※1
RUN apt-get update -qq && apt-get install -y nodejs postgresql-client

WORKDIR /app # 作業ディレクトリを設定

# ホストマシンからGemfileをコピー
COPY Gemfile /app/Gemfile
COPY Gemfile.lock /app/Gemfile.lock

# bundlerをインストールし、Gemfileに定義された依存関係をインストール
RUN gem install bundler
RUN bundle install

# ホストマシン上のアプリケーションの残りのファイルを/appディレクトリにコピー
COPY . /app

# entrypoint.shスクリプトをコピーして実行可能にする ※2
COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]

EXPOSE 3002 # コンテナ3002ポートを外部に公開、外部からの接続を受け入れできるようになる

CMD ["rails", "server", "-b", "0.0.0.0"] # デフォルトのコマンドでRailsサーバーを起動 ※3

詳細の解説

※1 RUN apt-get update -qq && apt-get install -y nodejs postgresql-client
Node.js(フロントエンドのビルドプロセスやJavaScriptの実行に必要)とPostgreSQLのクライアント(PostgreSQLデータベースとの通信に必要)がDockerイメージにインストールされる。これにより、アプリケーションがこれらのツールを必要とする場合、コンテナ内で直接使用することが可能になる!!

  • RUN Dockerfileでシェルコマンドを実行。この命令が記述された行が実行されるとそのコマンドが新しいレイヤー上で実行されて、結果がイメージに適用される
  • apt-get update apt-getはDebian系Linuxディストリビューション(Ubuntuを含む)で使用されるパッケージ管理ツール。インストール可能なパッケージとそのバージョンのリストを更新
  • -qq apt-get updateコマンドに与えられたオプションで、出力を最小限に抑え(quietモード)て、ビルドプロセスのログが長くなることを避ける
  • && 前のコマンドが成功した場合のみ次のコマンドを実行。今回の場合はupdateが成功したらinstallを実行する
  • apt-get install -y nodejs postgresql-client 指令されたパッケージ(nodejsとpostgresql-client)をインストール。-yオプションでは、インストールプロセス中に確認を求めるプロンプトがあれば、自動的に「はい」と答えるようになるため、イメージのビルドが中断されることなく完了できる

※2 entrypoint.sh関連
コンテナの起動プロセスをカスタマイズするために使用される

  • COPY entrypoint.sh /usr/bin/ ビルドコンテキスト(Dockerfileが置かれているディレクトリ)にあるentrypoint.shスクリプトをコンテナの/usr/bin/ディレクトリにコピーこれによってentrypoint.shがコンテナ内のどこからでも実行可能になる
  • RUN chmod +x /usr/bin/entrypoint.sh chmod +xコマンドは、指定されたファイルに実行権限を付与します。この行では、/usr/bin/entrypoint.shに実行権限を付与しており、これによりスクリプトが実行可能ファイルとして機能する
  • ENTRYPOINT ["entrypoint.sh"] ENTRYPOINT命令は、コンテナが起動する際に実行されるデフォルトのコマンドを設定する。ここではentrypoint.shをエントリーポイントとして指定しており、コンテナが起動する際に自動的にこのスクリプトが実行される。

※3 CMD ["rails", "server", "-b", "0.0.0.0"]
Dockerコンテナ内でRailsアプリケーションが実行され、外部のユーザーがアプリケーションにアクセスできるようになる!

  • CMD コンテナが起動するときに実行されるデフォルトのコマンドを指定する。この命令で指定されたコマンドは、コンテナ起動時に引数が指定されない場合にのみ実行される。もしコンテナを起動する際にコマンドラインから別のコマンドを指定した場合、CMDで指定されたコマンドは上書きされる。
  • rails server Railsアプリケーションの組み込みWebサーバーを起動するコマンド。これにより、開発中のアプリケーションをブラウザで確認したり、外部からのHTTPリクエストを受け付けたりすることができる。
  • -b "0.0.0.0" -bオプションは、サーバーがリッスンするホストアドレスを指定する。"0.0.0.0"は、サーバーがローカルホスト以外のすべてのネットワークインターフェースでリッスンするように指示します。これにより、コンテナをホストするマシンのどのIPアドレスからもアクセスできるようになる。

その他

ホストマシンってなんのこと?
Dockerコンテナや仮想マシンなどが実行される物理的または仮想的なコンピュータのこと
個人のPCだったり、サーバーやクラウドインスタンスだったりする

あっぴーあっぴー

docker-compose.yml

複数のDockerコンテナを定義し、管理するための設定ファイル
このファイルを使うことで、複数のサービスが連携するアプリケーションを簡単に構築、起動、停止ができるようになる。
例)webサーバー、データベースサーバー、キャッシュサーバーの3つのコンテナをまとめて管理できる

version: "3"
services:
  db:
    image: postgres:latest
    environment:
      TZ: Asia/Tokyo
      POSTGRES_PASSWORD: password
      POSTGRES_DB: app_development
    ports:
      - "5432:5432"
    volumes:
      - postgres_data:/var/lib/postgresql/data
  back:
    build:
      context: ./back
      dockerfile: Dockerfile
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -b '0.0.0.0'"
    volumes:
      - ./back:/app
    ports:
      - "3000:3000"
    depends_on:
      - db
    tty: true
    stdin_open: true
  front:
    build:
      context: ./front/
      dockerfile: Dockerfile
    volumes:
      - ./front:/app
    command: yarn dev -p 4000
    ports:
      - "8000:4000"
volumes:
  postgres_data:

参考
https://qiita.com/gon0821/items/77369def082745d19c38

あっぴーあっぴー

services

作成したいサービス(コンテナ)を列挙する。今回は、back/front/dbの3つ
命名は自由だけどわかりやすきくした方が良い

services: 
  db: #サービス名
  front: #サービス名

volumes(トップレベル)

Docker Composeにボリュームを作成する

  • ここで指定するとDockerコンテナの起動・停止のサイクルから独立して管理されるため、もしコンテナが削除されてもデータは保持される
  • 複数のコンテナ間で共有することができる
services:
  db:
    volumes:
      - postgres_data:/var/lib/postgresql/data
~
volumes:
 postgres_data:  # dbのところで指定してる

image

イメージの追加の設定やカスタマイズをする必要がない場合に使う

image: postgres:latest  # 最近のPostgreSQLを使う

environment

Dockerコンテナ内で実行されるアプリケーションやサービスの動作をカスタマイズする時に使う環境変数を設定する
実行環境に依存する情報をコンテナに渡す必要がある場合に使う
※ Githubに上げる場合、機密情報は.envファイルなどを使う

    environment:
      TZ: Asia/Tokyo
      POSTGRES_PASSWORD: password
      POSTGRES_DB: app_development

ports

ホストマシンとDockerコンテナ間でのネットワークポートのマッピングを指定することで、外部からコンテナ内のアプリケーションにアクセスできるようになる
ホストマシンのポート番号:コンテナのポート番号

    ports:
      - "8080:80"

これは「ホストマシンの8080ポートをコンテナの80ポートに転送する」という意味。
つまり、外部からホストマシンの8080ポートにアクセスすると、そのリクエストはコンテナの80ポートに転送される。

volumes(内側のやつ)

build

depends_on

command