Dockerとは　開発環境やファイルについて解説

# はじめに
Dockerの開発環境とはどのようなものか、Dockerでの環境構築の際に作成するファイルについてまとめました。
＊この記事は環境構築のやり方を解説した記事ではないため、この記事を参考にして環境構築した場合の動作の保証は一切しません。
# Dockerの開発環境
Dockerのソフトウェアをインストールすると、Moby LinuxというLinuxの軽量な仮想マシンが裏で作成されます。
そして、DockerでRubyの実行環境を立ち上げると、Moby Linux上にコンテナという仮想環境が作成されます(RubyのコンテナはDockser HubというサイトにあるファイルをDLして作成される)。
コンテナのもとになるファイルをまとめたものをイメージと呼びます。Rubyのイメージには、RubyそのもののプログラムやRubyに関するライブラリが含まれています。また、Linuxとして動作するために最低限必要なファイルも含まれています。このコンテナにPC上のRails用のフォルダをマウントして開発を行う。これによって動作確認が行えるわけです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245592/f1777d21-1165-f7d4-d749-1dd90aae26d5.png)

# Dockerfileについて
Dockerの新しいイメージを作成する際に使用します。この設定ファイルには、Railsアプリケーション実行に必要なファイルやパッケージをイメージに含めるための定義が書いてあります。このイメージをもとにコンテナが作成されます。
```
# Ruby3.1.1の実行環境のイメージをベースと　します
FROM ruby:3.1.1

# 上記のイメージからコンテナを起動してコンテナ内で実行するコマンドを定義
# ubuntuの管理システムであるapt-getで、必要なパッケージをインストールします
RUN apt-get update -qq && apt-get install -y build-essential nodejs

# 作業ディレクトリをappディレクトリに変更
WORKDIR /app

# GemfileとGemfile.lockをコンテナ内の/appディレクトリ内にコピーしています（この２つのファイルは、Rubyのライブラリであるgemを管理するためのファイル）
COPY Gemfile Gemfile.lock /apｐ/

# entrypoint.shをコンテナ内の/usr/bin/にコピー
# entrypoint.shにはコンテナ立ち上げ時に実行するスクリプトを書きます
COPY entrypoint.sh /usr/bin/

# EXPOSE ... コンテナがリッスン（待機）するポート番号を指定します
EXPOSE 3000

# CMD ... ソフトウェアを実行するコマンドです
CMD ["rails", "server", "-b", "0.0.0.0"]
```

# Gemfile、Gemfile.lock
`Gemfile`は、インストールするgemを定義しておくためのファイルです。
`Gemfile`のあるディレクトリで`bundle install`コマンドを実行することで、Railsのgemがダウンロードされてインストールが実行されます。

`Gemfile.lock`は直接編集するものではなく、`bundle install`を実行した際に、実際にインストールしたgemのリストとバージョンが自動的に記載されます。
用途は、別の環境で同じRailsアプリを動かす場合に、同じgemをインストールするために使います。

# docker-compose.yml
Dockerで、複数のコンテナを設定に従ってまとめて起動するために使用します。Railsを使用するコンテナとDBサーバーを実行するコンテナの２つを起動する定義を記載します。

```
version: "3"
# MySQLサーバコンテナの定義
services:
  db:
    image: mysql:5.7
    volumes:
      - db-volume:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: password
volumes:
  db-volume:

# Railsコンテナの定義
  web:
    build: .
    command: bash -c "rm -f tmp/pids/server.pid && \
                      bin/rails db:create && \ 
                      bundle exec rails s -p 3000 -b '0.0.0.0'"
    volumes:
      - .:/app
    ports:
      - "3000:3000"
    tty: true
    stdin_open: true
    depends_on:
      - db
```
それぞれ解説します。
```
volumes:
      - db-volume:/var/lib/mysql
```
PC上に`db-volume`という名前で作成したボリューム(データ保持領域)をコンテナの`/var/lib/mysql`ディレクトリにマウントします。これを設定しないと、DBのデータは直にコンテナ上に保存されますが、コンテナが削除された場合にはデータも一緒に消えます。それを回避するためにPC上の領域にDBのデータを保存しておき、コンテナを作り直したとしてもデータが保持されるように設定します。
```
build: .
```
`dokcer-compoe.yml`ファイルと同じディレクトリにあるDockerfileをもとにイメージを作成して使用。buildとは、Dockerfileからイメージを作成することです。

```
command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
```
コンテナを起動したときに、デフォルトで実行されるコマンドです（RailsのWEBサーバーを起動するコマンド）。
`bundle exec`とすることで、gemfileでインストールしたRailsコマンドが実行できます。sはサーバー、pは公開するポート番号、bでバインドするIPアドレスを設定。
0.0.0.0とすることで、コンテナがもっているすべてのネットワーク・インターフェースにおいて3000番ポートに通信が来たらRailsサーバーが応答するようにしています。
```
volumes:
      - .:/myapp
```
PC上のディレクトリを、コンテナの`/myapp`ディレクトリにマウントします（PC上の`docker-compoes.yml`が置いてあるフォルダが、コンテナの`/myapp`ディレクトリに共有されるようになります）。これによって、PC上で修正したソースコードがコンテナ上でも反映され、即座に動作を確認しながら開発を行えます。
```
ports:
      - "3000:3000"
```
コンテナ外部に3000番ポートで公開します。これを設定しないと、PCからコンテナで動作しているRailsに通信できません。
[公開するポート番号]：[コンテナ内部の転送先ポート番号]
```
depends_on:
      - db
```
Railsサーバーが起動するまえにDBサーバーが起動するように設定します

# 参考サイト
https://www.udemy.com/course/rails-kj/

https://qiita.com/tanutanu/items/808850ed7e4e8461b24b