こんにちは,米国データサイエンティストのかめ(@usdatascientist)です.
(追記:Docker動画講座作りました.Dockerについてもっと学びたい人は是非!14時間にも及ぶ超壮大講座です.
Docker超入門も第7回まできました...この連載もあと少しです.
今回は第5回の記事で使ってみたDockerfileをもっと使いこなせるようにしようと思います.
第5回の記事では以下のDockerfileを作ってビルドしました.
1 2 |
FROM ubuntu:latest RUN touch test |
- FROM ubuntu:latest ベースになるDocker image
- RUN touch test ubuntu:latest の上に $ touch test を実行したimage layerを作成
実業務ではもっと複雑なDockerfileを作れる必要があるので,今日は FROM と RUN に加えてよく使うコマンドを一覧にして紹介したいと思います
Dockerfileのビルド時の動作をちゃんと理解する
Dockerfileのビルド時の挙動をもう少し詳細にみてみましょう.以下の手順に従って,実行してみてください.ここでは,ビルド時に指定したフォルダにファイルを作成するやり方と,ホスト側のファイルをコンテナにコピーする方法をみていきます.
まず,第5回同様, dockerフォルダを作成し,その中にDockerfileというファイルを作ります.既に作ってある人はそのDockerfileを上書けばOK
1 2 3 4 |
Desktop (🐢 ) :$ mkdir docker Desktop (🐢 ) :$ cd docker/ docker (🐢 ) :$ touch Dockerfile docker (🐢 ) :$ subl Dockerfile |
私は ~/Desktop に作りました. $subl コマンドでSublimeでDockerfileを開き,以下のコードをコピーしてください.(どのエディタでも構いませんが,本ブログではSublimeの使用を勧めています.Sublimeについてはこちら, $subl コマンドが動かない人は正しくPathが通っていないので,こちらの記事のsublime使い方④を参考にしてください.)
1 2 3 4 |
FROM ubuntu:latest RUN mkdir new_dir RUN cd /new_dir RUN touch test |
Dockerfileに上記の内容を記述(コピペでもOK)してビルドしてコンテナに入ってみましょう
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
docker (🐢 ) :$ docker build . Sending build context to Docker daemon 2.56kB Step 1/4 : FROM ubuntu:latest ---> 549b9b86cb8d Step 2/4 : RUN mkdir new_dir ---> Running in 6f858b124238 Removing intermediate container 6f858b124238 ---> a06ce751a28a Step 3/4 : RUN cd /new_dir ---> Running in ee80c7f5a2d2 Removing intermediate container ee80c7f5a2d2 ---> f51c831fd0e0 Step 4/4 : RUN touch test ---> Running in 5e715771650f Removing intermediate container 5e715771650f ---> 952db6a02f7b Successfully built 952db6a02f7b docker (🐢 ) :$ docker run -it 952db6a02f7b bash root@1aa1eeec77c7:/# ls bin boot dev etc home lib lib64 media mnt new_dir opt proc root run sbin srv sys test tmp usr var root@1aa1eeec77c7:/# cd new_dir/ root@1aa1eeec77c7:/new_dir# ls |
Dockerfileでは RUN cd new_dir してもtestファイルは /new_dir/ 配下ではなく / 配下に作られていることに注意です.Dockerfileの各コマンドは / 配下で実行されるんですね!
もしnew_dirでファイルを作成したい場合はShellのコマンドと同じように && で連結させましょう.
1 2 3 |
FROM ubuntu:latest RUN mkdir new_dir RUN cd /new_dir && touch test |
先ほどと同様に,ビルドしてみてください.ちゃんと /new_dir/test が作成されていることがわかると思います.
次は,Dockerfileをビルドする際に,ホスト側のファイルをDocker imageにコピーする方法です
通常,ビルド時にはイメージ側からホスト側のデータにはアクセスできないため,一度ファイルをコピーしてあげる必要があります.
ホストの docker/ 配下に sample_file を作成し,
1 |
docker (🐢 ) :$ touch sample_file |
Dockerfileを以下に書き換えます.COPYコマンドでコピーすることが可能です.
1 2 3 |
FROM ubuntu:latest RUN mkdir /new_dir COPY sample_file /new_dir/ |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
docker (🐢 ) :$ docker build . Sending build context to Docker daemon 2.56kB Step 1/3 : FROM ubuntu:latest ---> 549b9b86cb8d Step 2/3 : RUN mkdir /new_dir ---> Running in 736f0db8e14f Removing intermediate container 736f0db8e14f ---> 4fd77c51eabe Step 3/3 : COPY sample_file /new_dir/ ---> d265bf715dd2 Successfully built d265bf715dd2 docker (🐢 ) :$ ls Dockerfile sample_file docker (🐢 ) :$ docker run -it d265bf715dd2 bash root@367e759a3a50:/# ls bin boot dev etc home lib lib64 media mnt new_dir opt proc root run sbin srv sys tmp usr var root@367e759a3a50:/# cd new_dir/ root@367e759a3a50:/new_dir# ls sample_file |
ちゃんとファイルがありますね♪
慣れてきたと思うので,よく使うコマンド一覧を紹介します!
よく使うDockerfile定番コマンド(instruction)一覧
よく使うコマンド(Instruction)一覧です.覚える必要はないですが,だいたいこの辺のコマンドが必要になってくるので存在を知っておくと便利です.
業務で使っていくうちに理解しましょう!
Instruction(リンクは公式レファレンスやガイド) | 説明 |
FROM | イメージのベースとなるものです.なるべくDockerが公式に出しているベースのものを使いましょう. |
RUN | コンテナ内でコマンドを実行します.なるべくバックスラッシュ \ で繋げて一行して綺麗にしましょう. |
CMD | CMD [‘コマンド’, ‘引数1’, ‘引数2’]といった使い方をします.
Dockerをrunした時にコンテナに入るのではなく実行することを目的とした時に使う. 変更可能 |
ENTRYPOINT | ENTRYPOINT [‘コマンド’, ‘引数1’, ‘引数2’]といった使い方をします.
CMDと同様,実行可能コンテナを作る時に使う.変更ができず,「実行必須コマンド」にしたいときに使う.(ただし–entrypointオプションで上書きは可能) |
LABEL | イメージにメタデータをつける時に使う.例えば作成者の名前とか. |
MAINTAINER | 非推奨.LABELを使いましょう |
EXPOSE | コンテナにポートを開ける.コンテナの外からアクセスできるようにするには $ docker run -p {host_port}:{container_port} でコンテナのportをホストのportにマッピングさせる必要があります. |
ENV | 環境変数をセットする.セット後,コンテナ内で使い回し上書きも可能 |
ADD or COPY | ビルド時にホストのファイルをイメージにコピーする.基本COPY推奨.ADDを使う場合は圧縮ファイルを自動解凍(tar -x)させたい場合くらいしか使わない. |
VOLUME | ホスト側のファイルシステムをマウントするのに使用 |
USER | デフォルトはrootユーザになるので,それを避けたい場合はUSERコマンドでユーザを切り替える.なお,コンテナとホストはユーザIDとグループIDでのみ紐付かれ,名前ではマッチしない |
と,こんな感じでしょうか.
一覧みてもピンと来ないと思うので,「こんなのあるんだなぁ」程度にみて,実務で必要なときに再度ググったり公式レファレンスをみて学ぶといいと思います.
(追記:もっとDockerについて学習したい人は動画講座を作ったのでこちらで学習してください.Dockerfileの作り方など,もっと詳細に解説しています.
それでは!
[…] こちらの記事を参考にDockerfileを作成しました。RUNごとにimageが作成されてしまうので、なるべく RUN は バックスラッシュ で繋げて書くのが望ましいとされます。 […]