前回は docker のコマンドを叩いて試してみました。
今回は Dockerfile なるものを作ってコンテナを起動してみます。
Dockerfile の中で使われるコマンドは以下です。
コマンド | 用途 |
FROM | 元となるDockerイメージの指定 |
MAINTAINER | 作者名 |
RUN | ビルド時のコマンドの実行 |
ADD | ファイル・ディレクトリの追加 |
CMD | docker run 時の実行コマンド1 |
ENTRYPOINT | docker run 時の実行コマンド2 |
WORKDIR | 作業ディレクトリの指定 |
ENV | 環境変数の指定 |
USER | 実行ユーザの指定 |
EXPOSE | ポートのエクスポート |
VOLUME | ボリュームのマウント |
◆Apache を起動してみよう
Apache を起動するコンテナを Dockerfile から作成します。
$ emacs -nw Dockerfile
FROM ubuntu:latest MAINTAINER Cicatrice RUN apt-get update; apt-get -y install apache2 ENV APACHE_RUN_USER www-data ENV APACHE_RUN_GROUP www-data ENV APACHE_LOG_DIR /var/log/apache2 EXPOSE 80 CMD ["/usr/sbin/apache2ctl", "-D", "FOREGROUND"]
◆イメージをビルド
apacheというイメージ名でビルドします。最後に「.」があるので注意。Dockerfile のあるディレクトリを指定してます。
$ docker build -t apache . Sending build context to Docker daemon 2.56 kB Sending build context to Docker daemon Step 0 : FROM ubuntu:latest Pulling repository ubuntu ~~~~~~~~~~~~~~~~~~~~~~~~~いろいろログが出る Successfully built 3f0133501f53
確認してみましょう。
$ docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE apache latest 3f0133501f53 29 seconds ago 228.9 MB ubuntu latest 826544226fdc 10 days ago 194.2 MB
大丈夫ですね。 ちなみに「Successfully built 〜〜」と出ないと失敗したゴミイメージができちゃうので(noneと表示されます)、その時はきちんと削除しておきましょう。
◆起動
$ docker run -p 80:80 -d apache
プロセス確認。
$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 50d29075796d apache:latest /usr/sbin/apache2ctl 4 seconds ago Up 3 seconds 0.0.0.0:80->80/tcp prickly_engelbart
ちゃんと生きたコンテナがいますね。 動作確認してみましょう。
$ curl localhost
Apache のHTMLが表示されたらOKです。
◆以下解説
①FROM ubuntu:latest
最新のUbuntuを引っ張ってきます。
②MAINTAINER Cicatrice
この Dockerfile の作者の名前です。 通常つけるらしいです。
③RUN apt-get update; apt-get -y install apache2
RUN を使うと sudo ユーザでコマンドを実行できます。 なので apt でインストールします。
④ENV APACHE_RUN_USER www-data
ENV APACHE_RUN_GROUP www-data
ENV APACHE_LOG_DIR /var/log/apache2
環境変数を設定します。無いとビルド時にコケます。
⑤EXPOSE 80
使用するポートを解放します。
⑥CMD ["/usr/sbin/apache2ctl", "-D", "FOREGROUND"]
docker run 時に実行するコマンドを指定します。 Docker はなにかプロセスがフォアグラウンドで起動しないとコンテナがすぐストップしてしまいます。 なのでapacheをフォアグラウンドで起動するように引数を指定します。
またDockerは基本的に1プロセスしか起動しないので、CMDを複数使ったりENTRYPOINTを複数書いても無意味です。ご注意下さい。
複数プロセスを使いたいときは supervisord というマルチプロセスデーモンを利用します。