コンテナを作成するまでの流れ
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による開発環境構築も書くかも