Perl Hackers Hub

第34回 DockerによるPerlのWebアプリケーション開発(1)

この記事を読むのに必要な時間:およそ 3 分

Dockerイメージの構築

次に,Dockerイメージを構築する方法について説明します。

dockerイメージを自前で構築するためには,Dockerfileを利用するのが簡単です。例として,nginxのDockerイメージを構築するためのDockerfileを示しますリスト1)⁠

リスト1 nginx用のDockerfile

FROM debian
RUN apt-get update -yq && \
    apt-get install -yq --force-yes nginx
RUN echo "\ndaemon off;" >> \
    /etc/nginx/nginx.conf
CMD ["nginx"]
EXPOSE 80

Dockerfileには,基本的にシェルコマンドを1行ずつ書くだけです。

まず,FROM命令にベースとなるイメージを指定します。リスト1では,Docker公式のDebian GNU/Linuxのイメージを指定しています。

次に,RUN命令にシェルコマンドを指定します。リスト1では,aptリポジトリの更新とnginxパッケージのインストールを行い,起動時にデーモン化しないようにするオプションをnginx.confに指定しています。Dockerを使用する場合はこのように,nginxのようなデーモンとして動作させるタイプのアプリケーションでもアプリケーション自体はデーモン化せずに,docker runのオプション引数として-dを指定することにより,Dockerコンテナをデーモン化します。

基本的にFROM命令とRUN命令の2つだけで,たいていのことはできます。

ほかにも,CMD命令には,docker runの引数のコマンドを省略したときのデフォルトのコマンドを指定しておけます。EXPOSE命令には,docker runのオプション引数-pを省略したときのデフォルトの公開ポート番号を指定できます。

なお,Docker公式ドキュメントのBest practices for writing DockerfilesにDockerfileの書き方のベストプラクティスが紹介されています。より詳細なDockerfileの書き方についてはこちらを参照してください。

Dockerイメージのビルド

DockerfileからDockerイメージをビルドするには,docker buildコマンドを用います。Dockerfileのパスと同一ディレクトリにて,次のコマンドを実行します。

nginxイメージのビルド

$ docker build -t mynginx .

-tオプションによりDockerイメージにタグ名を付けておくと,あとあと参照するために便利です。

Dockerfileのビルドキャッシュ

docker buildを実行するときに,Dockerfileの各命令を毎回最初から実行するのは時間がかかります。そこで,DockerfileによるDockerイメージのビルドには,デフォルトでキャッシュ機構が提供されています。

Dockerfileによるイメージのビルドでは,Dockerfileの各命令ごとに中間イメージが作成されます。そしてDockerイメージのビルドを高速化するために,中間イメージをキャッシュとして利用します。具体的には,前回のdocker buildの実行からDockerfileの内容が変化した部分を検出し,検出した命令の直前の命令までは,中間イメージを再利用してビルドをスキップします。

Dockerコンテナの起動

Dockerイメージの取得または構築ができたら,docker runコマンドにより,DockerイメージからDockerコンテナを起動します。先ほど作成したmynginxタグの付いたDockerイメージから,コンテナを起動してみましょう。

nginxコンテナの起動

$ docker run -d -p 8000:80 -t mynginx

先述したように,nginxのようなデーモンとして動作させるタイプのアプリケーションには-dオプションを付けます。また-pオプションにより,ホスト側とコンテナ側のポートのマッピングを指定します。-p8000:80の場合は,コンテナ側の80番ポートに対して,ホスト側の8000番ポートからアクセスできます。

curlコマンドやブラウザからlocalhostの8000番にアクセスして,ページが表示されれば成功です。

コンテナ内のnginxの起動確認

$ curl http://localhost:8000

Dockerコンテナの停止・削除

起動したDockerコンテナを停止するときは,docker stopコマンドまたはdocker killコマンドを使います。stopとkillでは,停止のためのシグナルが異なります。stopの場合は,まずSIGTERMシグナルを送ります。SIGTERMシグナルで停止しなければ,一定時間経過後にSIGKILLシグナルを送ります。killの場合は,最初からSIGKILLを送ります。安全にコンテナを停止させたければstop,すばやくコンテナを停止させたい場合はkillを使うとよいでしょう。

停止させる場合は,停止させるコンテナのIDを指定する必要があります。docker psコマンドにより,コンテナIDを含んだ起動中のコンテナの情報を一覧できます。

起動中のコンテナの一覧表示

$ docker ps

コンテナの停止

$ docker stop <コンテナID>

コンテナの強制停止

$ docker kill <コンテナID>

Dockerコンテナ内部にログインする方法

Dockerを用いて開発していると,Dockerコンテナ内部にログインしたいことがたびたびあります。docker execコマンドを使うと,起動中のコンテナの内部に入れます。この方法により,たとえばsshdなどの余分なサービスを起動せずに,手軽にコンテナにログインできます。

起動中のコンテナの内部に入る

$ docker exec -i -t <コンテナID> /bin/bash

<続きの(2)こちら

著者プロフィール

坪内佑樹(つぼうちゆうき)

京都出身京都在住。2013年に株式会社はてなに入社。

WebオペレーションエンジニアとしてMackerel,はてなブログを始めとしたWebサービスのサーバ・ネットワーク構築と運用を担当する。

計算機システムのしくみと性能,サーバオペレーションの自動化について関心がある。

Twitter:@y_uuk1

Blog:http://yuuki.hatenablog.com