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

今日から始めるDocker【Dockerfileを書いてみよう編】

More than 1 year has passed since last update.
  • 基本的にはRuby/Node.jsなどのサーバーサイドを中心にお仕事していますが、あるきっかけでプロジェクトへのDocker導入のお手伝い(自分もこの際に初めてDocker触ったんですが...)をさせていただきました。
  • 少しでも後世の役に立てばと思い、その際に学んだことをまとめました。
  • なお、当方は正確な言葉や用語よりもイメージを重視しているので、そこの辺りは優しく読んで頂けますと幸いです。

関連記事

対象読者

  • まだDockerに触れたことがない人
  • Dockerをこれから使いたいなーと思っている人

記載していること

  • Dockerfileの書き方
  • Dockerfileを使ったコンテナの動かし方

サンプルコード

目次

  • Dockerfileを書いてみよう
  • なんとなく動かしてみよう
  • ちょっと解説
  • 次のステップ

Dockerfileを書いてみよう

  • 前回では、コマンドライン上に実行したいことをベタ書きしていましたが、今回ではそれらをコードとして管理できるようにします

Dockerfileとは

  • 作成したいイメージを作る際の設定や手順をまとめたもの
  • docker buildコマンドを実行することでDockerfileに記載した手順を実行してくれる
  • このファイルを共有すれば、誰でも同じ環境を構築できる

Dockerfileを書いてみる

  • 今回は下記のディレクトリ構成でやっていきます
docker-ruby
 ├ sample.rb
 ├ Dockerfile
  • 必要なファイルを作ります
$ mkdir docker-ruby
$ cd docker-ruby
$ touch sample.rb
$ echo "puts 'Hello, from Docker container!'" > sample.rb
$ touch Dockerfile
  • Dockerfileには下記を記載します
Dockerfile
# ベースとなるイメージを指定する
FROM ruby:2.5

# コンテナ上のワーキングディレクトリを指定する
WORKDIR /usr/src/

# ディレクトリやファイルをコピーする
# 左側がホストのディレクトリ、右側がコンテナ上のディレクトリ
COPY ./sample.rb /usr/src/sample.rb

# "docker build"時に実行される処理
RUN echo "building..."

# "docker run"実行時に実行される処理
CMD ruby sample.rb

なんとなく動かしてみよう

  • Dockerfileを作成したので、早速ビルドします
  • -t オプションにより、作成されたイメージに適用するリポジトリ名をつけています(あだ名みたいな感じですね)
$ docker build -t sample-image .
Sending build context to Docker daemon  3.072kB
Step 1/5 : FROM ruby:2.5
 ---> 857bc7ff918f
Step 2/5 : COPY ./sample.rb /usr/src/sample.rb
 ---> 8ace09a37546
Step 3/5 : WORKDIR /usr/src/
Removing intermediate container 2d1e5349eece
 ---> f654d6698be8
Step 4/5 : RUN echo "building..."
 ---> Running in ec26f70ae0fb
building...
Removing intermediate container ec26f70ae0fb
 ---> 529afa05bd55
Step 5/5 : CMD ruby sample.rb
 ---> Running in 5106aa0e6f10
Removing intermediate container 5106aa0e6f10
 ---> d24c2ec72c67
Successfully built d24c2ec72c67
Successfully tagged sample-image:latest
  • Successfully built なので、ビルドが成功していることがわかりますね
  • ちなみに、ビルドされたイメージは docker image ls コマンドで確認できます
  • 先ほどのビルドでruby:2.5もダウンロードされたので、2つのイメージが作られました
$ docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
sample-image        latest              d24c2ec72c67        2 minutes ago       869MB
ruby                2.5                 857bc7ff918f        2 weeks ago         869MB
  • ビルドが成功したので、このイメージを使ってコンテナを起動します
  • 起動すると、sample.rb内のプログラムが実行され、puts内に記載した文字が返されます
$ docker run sample-image
hello, from Docker
  • というわけで、前回コマンドラインにベタ書きした処理をDockerfileで管理できるようになりました!

ちょっと解説

  • 今までやったことをざっくり図にまとめるとこんな感じになります

dockerビルドイメージ.png

  • docker build実行によりDockerfileに記載した手続きが実行され、コンテナのイメージができます
  • docker run実行により、そのイメージがコンテナ上に展開されます
  • なお、コードの修正(例: sample.rb内のputsの文字を変更する)をした場合には、再度 docker build コマンドでビルドした上で、docker runを実行する必要があります

次のステップ

  • 今回は1つのプロセスをDockerfileで管理できるようになりましたが、実際のwebサービスを作る際には複数のプロセス(Ruby/MySQL/nginxなど)を操る必要があります
  • そのため次回は、docker-composeを用いて複数のプロセスを管理する方法について触れていきたいと思います

参考文献

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
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  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