Dockerの設定周りと基本コマンドの解説
- はじめに
- docker-compose.ymlとは
- Dockerコンテナの操作に使用される主要なコマンド
- Dockerの構築する際の参考
- docker-compose.yml - 記述例と解説
- Dockerfileとは
- Dockerの起動の流れ
- frontendコンテナのDockerfile - 記述例と解説
- backendコンテナのDockerfile - 記述例と解説
- database.yml - 記述例と解説
- おわりに
はじめに
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には、以下のような内容を記述することができます。
- ベースイメージの指定
- 必要なパッケージやソフトウェアのインストール
- ファイルのコピー
- 環境変数の設定
- ポートのエクスポート
- コンテナ起動時に実行されるコマンドの指定
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です♪
こちらのリンクを経由すると1万円引きになります。
RUNTEQを通じて開発学習の末、受託開発企業をご紹介いただき、現在も双方とご縁があります。
もし、興味がありましたらお気軽にコメントか、TwitterのDMでお声掛けください。