Dockerfileは手順書に近いもので、書くのはすぐに書けますがその内容(=手順)が合っているかを確認するのが結構大変です。
実際作ってみてはまりどころもわかってきたので、その手順を共有しようと思います。
FROMの選択
Dockerfileは、既にあるDockerfileを継承して書くことができます。この継承に利用するのが、先頭に記述するFROM
です。
楽をするためには、自分の構築したい環境に近い&オフィシャルなDockerfileをまず見つけることが重要になります。
私の場合Pythonの環境をよく作るので、Python/MinicondaのDockerfileをFROMにより継承することが多いです。
-
Python
-
FROM python:3
のように(リポジトリ名:タグ)という形式で利用する
-
-
continuumio/miniconda
-
conda install
を環境構築で使用する場合に利用する -
FROM continuumio/miniconda3
で利用可能。必要に応じてタグを指定するつける
-
あとは、Dockerfileのサンプルなどを見ながら書いていきます。
buildのテスト
いざ書きあがったら、それできちんと環境が構築できるかをテストします。このために利用するのが、docker build
のコマンドです。
基本的な使い方は以下のような形になります。
docker build --force-rm=true -t my_image .
-
--force-rm=true
: ビルド中に作成される中間コンテナを削除するようにします。初回からbuildがうまくいくことは稀なので、失敗時に半端なコンテナを残さないようにしておきます- このオプションをつけていない場合、後述の後始末をしっかりと行う必要があります
-
-t
: 作成するimageの名前(タグ)を設定します - 最後にDockerfileがあるディレクトリ(カレントディレクトリの場合
.
)を指定します。
プロキシがある環境下でビルドをするけれども、本番環境ではプロキシなんてない、という場合は--build-arg
で環境変数を渡せます。
docker build --force-rm=true -t my_image --build-arg http_proxy=http://myproxy:8080 --build-arg https_proxy=http://myproxy:8080 .
前述のとおり一発でビルドが通ることは稀なので、その場合は構築に失敗したimageを消しておきます。これを怠ると、ディスクをガリガリ食うほか後で消すのがとても面倒です。
buildの後始末
-
docker ps -a
で、作成途中のコンテナがないか確認-
docker rm
で削除を行います。なお、コンテナの指定は実はIDの頭3文字だけで大丈夫 -
docker ps
は稼働中(running)のコンテナしか表示しないので、何もないと思ったら背後に大量のコンテナが隠れていたということが往々にしてあります。ご注意を
-
-
docker images
で、作成に失敗したイメージを確認-
docker rmi
で削除を行います
-
これできれいになりました。以後はbuildの実行・後始末、を繰り返していきます。
runのテスト
イメージが作成出来たら、実際に稼働させてみてきちんと動作するか確認を行います。イメージからコンテナを作成し、稼働させるにはdocker run
を使用します。
実際利用する際は以下のような感じになります。
docker run -p 8080:8080 --rm my_image
-
-p
のオプションにより、コンテナ側のポートとホスト側のポートを紐付けます。Webアプリケーションの動作確認などではよくこのオプションを使用します。 -
--rm
のオプションにより、stopした後自動でコンテナを削除します。このオプションを怠ると、以下の後始末が必要になります。 - コンテナ作成元となるイメージを最後に指定します
runの後始末
-
docker ps
で稼働中のコンテナのIDを確認-
docker stop
で停止 -
docker rm
でコンテナを削除
-
注意点として、docker run
は実行のたびにコンテナをイメージから作成します(イメージからのコンテナの作成と、コンテナの稼働を1コマンドで実行している)。そのため、docker run
を連打していたらコンテナであふれかえったという事態もしばしば発生します。ディスクがコンテナで占拠されないように、docker stop
からのdocker rm
を徹底しましょう。
runのテストが完了したら、Dockerfileはきっちり作成できたことになります。お疲れさまでした!