Help us understand the problem. What is going on with this article?

【Docker】Dockerfileを書いて既存Railsの開発環境をDocker化してみた。

コンテナを作成するまでの流れ

Dockerfileからdocker imageを作り、docker imageを元に「コンテナ」が作られます。

そもそもDockerfileとは?

Dockerの上で動かす「コンテナ」の構成を記述するためのファイルのことです。つまり、DockerfileからDocker imageが作られ、それを元にコンテナが起動するという感じですね。

そもそもdocker imageとは

コンテナの元と捉えると良いかもしれません。Dockerfileを元にイメージを作ることができます。また、このdocker imageを共有することで、同じ実行環境でアプリケーションを動かすことが可能になります。

そもそもコンテナとは?

簡単にいうと、アプリケーションの実行環境のことです。ミドルウェアを含んだ実行環境の中でアプリケーションが動作します。また、Docker Engineがこのコンテナを管理します。(停止,再起動等)

実際にコマンドを追ってみる。

下記のコマンドでDockerfileからdocker imageを作成できます。【Dockerfile→docker image

docker build -t [image名]:[tag名] Dockerfileの場所

下記のコマンドでdocker imageからコンテナを作成することができます。【docker image→コンテナ】

docker create --name コンテナ名 image名

下記のコマンドでコンテナを起動させることができます。

docker start コンテナ名

ともかく実際にコンテナを作ってみる

Dockerfileを用意

Dockerfile内の基本コマンド

【FROM】

ベースイメージを指定します。ここに指定したimageを元にimageを作成することになります。基本的には公式のイメージを取得すればOK。

【RUN】

指定したコマンドを実行します。ミドルウェアをインストールする時に使われがち。何回も使用することができ、結果はデフォルトでキャッシュされる。

【CMD】

指定したコマンドを実行します。RUNとの違いは、コンテナの起動時にコマンドが実行されるということです。一つのDockerfileに一つだけ指定することができます。

【EXPOSE】

公開ポートを指定することができます。

【ENV】

Dockerfile内で使用する環境変数を指定することができます。

【ADD】

指定したホストのファイルやディレクトリ,リモートファイルをコンテナ内の指定したpathにコピーします。

【COPY】

指定したホストのファイルやディレクトリ,リモートファイルをコンテナ内の指定したpathにコピーします。

*ADDはリモートファイルはコピーできますがCOPYはできません。ADDは自然解凍されますが、COPYは自然解凍されません。

【ENTRYPOINT】

指定したコマンドをコンテナ起動時に実行します。
CMDがあれば省略可能です。

【VOLUME】

dockerが管理するデータ領域にマウントする機能。

【WORKDIR】

コマンド実行をする時のworking directoryをここで指定します。

では、基本的なコマンドはさらえたので実際に書いていきましょう!

Dockerfileを実際に書いていく

今回はRailsの環境構築のためのDockerfileを書いていきます。

# ベースとなるimageをFROMに指定
FROM ruby:2.6.3
# 基本的なソフトウェアをRUNコマンドでインストール
RUN apt-get update -qq && \
    apt-get install -y build-essential \ 
                       libpq-dev \        
                       nodejs           

# コンテナ内に/appディレクトリを作成
RUN mkdir /app
# working dirに/appを指定
WORKDIR /app
# ホストのGemfile,Gemfile.lockファイルをコンテナ内の/app内にコピー
COPY Gemfile /app/Gemfile
COPY Gemfile.lock /app/Gemfile.lock

# bundlerをインストール
RUN gem install bundler
# bundle installを実行
RUN bundle install
# ホストのカレントディレクトリをコンテナ内の/appにコピー
COPY . /app
# 公開ポートを指定。
EXPOSE 3001
# コンテナを起動するのと同時にrails server立ち上げる
CMD ["rails", "server", "-b", "0.0.0.0"]

 Dockerfileからimageを作成

タグ名とimage名は適当です。本来ならば、タグ名はバージョン管理に使われます。

docker build -t test:test .

では、docker imagesでimage一覧をみてみましょう

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
test                test                f41bb9a8148e        31 seconds ago      1.07GB

ちゃんと作成されていますね!

docker imageからコンテナを作る

コンテナを作るコマンドは下記でしたね。

docker create --name コンテナ名 image名

では、下記のコマンドを実行してください。

docker create --name hoge test

処理が完了したら下記のコマンドを実行して、作成されているか確認してください。

docker ps -a

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                   PORTS               NAMES
45ed30bea859        test:test           "rails server -b 0.0…"   14 seconds ago      Created                                      hoge

いい感じに作れていますね!

コンテナを起動してみる

docker start コンテナ名でコンテナを起動できるので、今回は

docker start hogeでコンテナが起動できるかと思います。

以上です。お疲れ様でした🙇‍♂️

PS:Railsのdocker-composeによる開発環境構築も書くかも

onikan
都内の自社開発企業で長期インターン(週5フルタイム)でエンジニアしています。| Ruby | Rails | React.js | 未経験→実務ベースの/プログラミング/エンジニア/インターンなどについて発信していきます!文系大学2年生(休学中)
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away