読者です 読者をやめる 読者になる 読者になる

Carpe Diem

備忘録。https://github.com/jun06t

Dockerfile を作る

Docker

前回は 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 というマルチプロセスデーモンを利用します。

 

ソース: Dockerfileとdocker buildコマンドでDockerイメージの作成 (1/2)