その他
    ホーム 技術発信 DoRuby Dockerを試してみる(4)
    Dockerを試してみる(4)
     

    Dockerを試してみる(4)

    この記事はアピリッツの技術ブログ「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引数なしでコンテナを起動したときに実行されるコマンド