この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。
Dockerを試してみる(3)の続きです。今回はDockerfileを試してみます。 前回はdocker-composeについて試したので、順番逆なんじゃね?って感じがしますが置きになさらず
Image と Container
Dockerfileを使う前にあらためて ImageとContainerについておさらいします。
DockerはOS上で軽量の仮想環境(コンテナ(Container)と呼ばれる)を実行するためのエンジンとエンジンを操作するツールを提供したものです。たとえば docker run
コマンドでは、次のコマンドでDBコンテナを起動させることができます。
$ docker run -d -e "MYSQL_ROOT_PASSWORD=password" --name mysql mysql:5.6
起動したコンテナは次のコマンドで確認できます。
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f78a4be66ee8 mysql:5.6 "docker-entrypoint.sh" 15 seconds ago Up 14 seconds 3306/tcp mysql
この出力にIMAGEという列があります。これはコンテナの大本となる、ファイルや起動コマンドを定義したイメージと呼ばれるものです。上の出力だと mysql:5.6
というイメージを使用しています。docker run
コマンドの引数でも指定していますね。
このイメージは、Docker Hubというレポジトリにあるものを利用しています。mysqlやmemcachedなどのDocker Hubにあるイメージを使う(pullする)だけで十分かと思います。
しかししばらくすると自分のアプリケーションもコンテナにしたい、ということがあると思います。
その場合、Dockerfileを使ってオリジナルのイメージを作成することができます。
Dockerfile
Dockerのイメージを作成する際に必要なルールを定義したファイルです。
ソースファイルをコンパイルするときに使うMakefileに似たようなものです。
例と実行方法
Dockerfileの例は以下のとおり。
FROM ruby23
RUN yum -y install mysql-community-devel
COPY docker-entrypoint.sh /
RUN chmod 755 /docker-entrypoint.sh
ENV RAILS_ENV production
ENV PATH /usr/local/ruby-2.3.3/bin:/usr/local/bin:/bin:/usr/bin
ENV RAILS_SERVE_STATIC_FILES false
VOLUME /usr/src/app
WORKDIR /usr/src/app
ENTRYPOINT ["/docker-entrypoint.sh"]
EXPOSE 8080
CMD ["bundle", "exec", "unicorn", "-E", "production"]
このファイルをdocker build
コマンドを使ってビルドします。
$ cd /some/directory
$ vi Dockerfile
$ docker build -t myapp .
文法
Goというプログラミング言語をベースにしています。コマンド名 引数
が1コマンドで行の先頭から実行されます。
コマンド
コマンド名内容
FROM基本となるイメージを作成する
RUNイメージ内でシェルコマンドを実行する。yumなどでアプリケーションをインストールする場合などに使う。
COPYローカルのファイルを、イメージ内にコピーする
ADDローカルのファイルやディレクトリを、イメージ内に追加する
ENV環境変数を定義する
EXPOSE公開するポートを明示する
VOLUMEマウントポイントを指定する
ENTRYPOINTコンテナ起動時に実行するコマンド(CMDの前に実行される)
CMD引数なしでコンテナを起動したときに実行されるコマンド