【学習メモ】Dockerを本気で理解しにかかる〜#1-4 Dockerfileでイメージをコード化〜
概要
こちらの記事の#1-4 です。(#1-2、#1-3)
前回までで、概要、コマンド、ボリュームのマウントについてまとめていったので、今回はついに Dockerfile についてまとめていこうと思います。
Dockerfile
Dockerfile とはイメージをコード化したもの。
Docker コマンドだけだと既に用意されているベースイメージしか起動できませんでしたが、Dockerfile を使うことでベースのイメージに対してパッケージのインストールなどをしたオリジナルのイメージが作成が可能となります。より、自身の開発環境にマッチしたコンテナが出来上がるということですね!
docker-compose.yml とごっちゃになってしまいがちですが、Dockerfile はイメージをコード化したものなので、一つのファイルで最終的には一つのコンテナが起動されると覚えておくと良いと思います。
コマンド
Dockerfile に関するコマンドについてです。他のコマンドは別の記事で一通り解説したので、build だけですね!
docker build
docker build --tag {イメージ名} {Dockerfileのあるディレクトリ}
docker build
の形式は上のようになります。--tag
は-t
でも同じ意味になります。
--tag
もしくは-t
オプションをつけることで、イメージに名前をつけることができます。
・例
docker build -t mynginx_image ./
Dockerfile の構文
FROM
ベースイメージを記述できます。
これは Docker コマンドだけで起動する場合と同様にイメージ名をタグ付きで記述します。
WORKDIR
Docker コンテナ内の作業ディレクトリを指定します。指定されたディレクトリからその後のRUN
,CMD
,COPY
などのコマンドが実行されるデフォルトのディレクトリとなります。
RUN
指定された Linux コマンドを実行
- 実行タイミング:Dockerfile→ イメージ のタイミング
要はこの RUN で指定されたコマンドが Docker イメージのレイヤー構造に追加されるイメージ
CMD
指定された Linux コマンドを実行
- 実行タイミング:イメージ → コンテナ のタイミング
CMD の使い方は以下のように 3 タイプある。
CMD ["executable","param1","param2"]
CMD ["param1","param2"]
CMD command param1 param2
CMD は Dockerfile 内で一つのみ指定が可能
RUN と CMD はどちらもやることは同じですが、違うのは実行タイミングです。どのタイミングで実行したい Linux コマンドなのかによって、使い分ける必要があります。
COPY
ローカルファイルの指定したファイルをイメージに追加する。(基本的には ADD より推奨される)
以下のように第二引数がファイル指定のみ、もしくは相対パスで記載されていた場合は、WORKDIR に記載されているディレクトリを起点にコピーが実行されます。
# WORKDIRに指定のディレクトリ/index.htmlにコピー
COPY index.html index.html
WORKDIR に指定したディレクトリは無視して、適当なパスにファイルをコピーしたい場合は、第二引数を絶対パスで記述すれば OK です。
COPY index.html /var/www/html
もちろんですが、Docker コマンドの-v と同様にディレクトリの指定も可能です。
COPY ./app /app
Add
COPY と同様に指定されたファイル、ディレクトリをコンテナにコピーします。
COPY コマンドとの違いとしては、以下 2 点です。
- リモート URL からファイルをダウンロードできる。
- ダウンロードした tar ファイルを自動的に展開できる。
ただ、上記のような特別な事情がない限りは COPY コマンドを使用することが推奨されています。
COPY(ADD)とボリュームの共有
Docker コマンドで-v
や--volume
オプションでボリュームのマウントができることを以前記述しました。
混同しがちになってしまいますが、COPY、ADD コマンドで指定されたファイル、ディレクトリはビルド時にイメージの一部となります。それとは対照的にボリュームのマウントはコンテナ実行時にマウントされるため、イメージとは独立しております。
- 更新時の反映
- COPY:Dockerfile ビルド時(イメージ作成時)のファイルの内容でコピーが実行され、それ以降、ローカルで変更しても反映されない。
- ボリュームのマウント(
-v
オプション):ローカルの変更がリアルタイムでコンテナに反映される。
用途としては、開発中のコードなどはボリュームマウント、設定ファイルなどは COPY といった形になると思われます!
ENV
環境変数を設定できる。
コンテナの環境変数の確認方法は以下の 2 点
-
docker inspect
コマンドを実行後、Config > Env 内に環境変数が配列である。 -
docker exec -it
コマンドでコンテナに入ったのち、env
コマンドを実行。環境変数の一覧が表示される。
Dockerfile のベストプラクティス
ドキュメントに記載があるので、一通り目を通しておくと良いかもです!
まとめ
今回は Dockerfile についてまとめていきました。Dockerfile とはイメージをコード化できるもので、ベースイメージからオリジナルの設定が必要な場合に使用されるものでした!
次は docker-compose で複数のコンテナを起動する方法を見ていこうと思います!
Discussion