dockerとは「アプリケーションを箱に詰めて、どこでも同じように動かせる技術」です。
MacやWindowsなどのOSの違いを考えないで実行することができるようになるので、OS間の違いを気にしなくて良いためとても便利な技術です。
通常は「箱」ではなくて「コンテナ」と表現します。
docker化するためには、Dockerfileというファイルにインストールする内容や実行する内容を書いていき、その内容をdocker imageに変換してからdockerコンテナにします。
以下はrailsをdocker化する際に書いたDockerfileの内容です。
FROM ruby:3.2.2
RUN apt-get update && apt-get install -y \
build-essential \
libpq-dev \
nodejs \
postgresql-client \
yarn
WORKDIR /rails-docker
COPY Gemfile Gemfile.lock /rails-docker/
RUN bundle install
Dockerfile作成後、ターミナルでdocker build <各々のbuild context>
と打つことでdocker imageに変換できます。
更にdocker run <各々のdocker image>
と打つことでdockerコンテナが作成されます。
コンテナにすることで各サービスを使える状態になりました。
docker化する方法は以上なのですが、今回の場合だとこれだけでは動きません。
このrailsを使うためにはデータベースが必要なためです。
そのために必要なのがdocker composeです。
コンテナは1つにつき1つのサービスしか書けません。
docker composeはrailsのコンテナとデータベースのコンテナの2つが必要な際に役立ちます。(もちろん3つ以上でも大丈夫です。)
docker composeを使わないと、1つのサービスに対してDockerfileを1つずつ作成していき、dockerコンテナを使用するときにdocker run
で1つずつ起動していかないといけない面倒な状態になってしまうからです。
そのため複数のサービスを使用する際はdocker composeを使用した方が良いでしょう。
docker composeの中に起動するサービスごとに内容を書いていきます。
※下記ではwebとdbが該当
volumes:
db-data:
services:
web:
build: .
ports:
- 3000:3000
volumes:
- .:/rails-docker
environment:
- DATABASE_PASSWORD=postgres
tty: true
stdin_open: true
depends_on:
- db
db:
image: postgres:12
volumes:
- db-data:/var/lib/postgresql/data
environment:
- POSTGRES_PASSWORD=postgres
ここまで書いたらターミナルにコマンドを打てば起動しますが、docker composeの場合はdocker run
ではなくdocker-compose up
になります。
コマンドは異なりますが、やっていることは同じでdockerを起動しているだけです。
これで2つのコンテナが同時に起動している状態です。
あとは作業に応じてコンテナを
docker-compose exec <サービス名> <bashやshなど>
で実行中にすれば通常通りに各サービスが使えるようになります。
Dockerfileやアプリ起動後の操作はお使いのアプリにより変わってくるので省いていますが、webアプリをdockerとdocker composeでdocker化する流れは以上です。