こんにちは!りゅうです。
今回は業界スタンダードになっているというDockerで使用するDockerfileの書き方について書いてみました。
直近の現場で初めてDockerを使用し、Udemy等の教材も合わせ学習したので、その振り返りとしてまとめています。
この記事で実現したいこと
Dockerの大雑把なイメージ、Dockerfileの基本的な書き方と内容がわかるようになる
Dockerが使える環境を前提で書いています。
Dockerはコンテナと呼ばれる一つの開発環境を作ることができます。
メリットとしては、
・誰でも同じ開発環境をすぐに利用することができる
・フレームワークなどのパッケージをローカルにインストールする必要がない
などなど環境整備が楽になるということが最大のメリットです。
Dockerを使ってコンテナを作成するには、Dockerイメージが必要になります。
そのイメージの元となるのがDockerfileです。
…Dockerイメージってなんぞや?
Dockerfileはただのテキストファイルです。
それに対してDockerイメージには必要なフレームワークやOSなどがインストールされている状態です。
コンテナにして開発環境として使える状態になります。
Dockerfileによく登場する基本的な記述についてまとめてみました。
実際に動かした画面と合わせて記載していきます。
環境のベースは何を使うかの指定をします。
# FROM OSの名前:バージョン FROM ubuntu:18.04
# バージョン指定なし FROM ubuntu # = FROM ubuntu:latest
バージョンを指定しないとlatestが選ばれ、最新のバージョンを取得してくれます。
この後RUNと合わせて動かしたものを書いています。
イメージを作成する際、実行したいコマンドなどを記載します。イメージのサイズを抑えるため、複数指定する場合は「&&」が推奨されています。
# RUN 実行コマンド # 記載例 RUN uptget update && uptget install -y vim
以下のFROMとRUNだけの簡単なDockerfileをビルド、起動してみます。
RUNには「hello world」と書かれたsampleファイルをルート直下に作成するとなっています。sampleファイルは元々ありませんがechoが生成してくれます。
FROM ubuntu:18.04 RUN echo "hello wrold" > sample
ターミナルを開き、Dockerfileがあるディレクトリで以下のコマンドを実行してみます。
docker build .
buildの後ろはDockerfileのあるディレクトリを指定しています(ここではカレントディレクトリなので .を記述)。
実行すると以下のような感じで、Dockerfileに記載した内容でイメージに必要なものを入れてくれます。
ビルドが終わったら以下のコマンドで作成されたイメージを確認してみます。
docker images
repositoryとtagが<none>で分かりにくいので、build時に -t でタグ指定をしてみます。
docker build -t ubuntu-sample:18.04 .
Dockerイメージができたら以下のコマンドでDockerコンテナを起動してみます。
docker run -it ubuntu-sample:18.04 bash
-itはdocker run のオプションコマンドで以下の2つを繋げて書いています。
-i Interactiveモードで操作ができる(入力できるようになる)
-t tty 詳細が難しかったので簡潔に言うと、表示が見やすくなる
コンテナを起動できたらルート直下に接続できていると思います。
RUNで作成したsampleファイルに「hello world」と書かれているか確認してみます。
ls
cat sample
ちゃんとありました。
コンテナ起動時に実行するコマンドとオプションを変更できます。 原則は末尾に記載です。
# CMD ["実行コマンド", "オプション1", "オプション2"...] # 記載例 CMD ["ls", "-a"]
ubuntuイメージのデフォルトコマンドは「bash」を使っているので、コンテナ起動時bashが起動してくれます。
試しに以下のコマンドで起動中のコンテナのデフォルトコマンドを確認してみます。
docker ps
(docker ps -aで起動していないのも含めた全てのコンテナが見れます)
COMMANDは”bash”になっているのが確認できました。
CMDを使ってみる
# CMD ["実行コマンド", "オプション1", "オプション2"...] FROM ubuntu:18.04 RUN echo "hello wrold" > sample CMD ["ls", "-1"]
FROMとRUNで記載したDockerfileにCMDを追記して起動時に「bash」ではなく「ls -1」が実行するように変更しました。-1 は一覧を縦表示するオプションです。
runコマンドで実行してみます(デフォルトコマンドは省略可)。
docker run -it ubuntu-sample:18.04 ls
一覧が縦表示で確認できました。
コンテナのデフォルトコマンドもしっかりlsになっています。
操作するディレクトリの絶対パス(推奨)を指定します。以降はそのディレクトリを基準にDockerfileに書いた操作が実行されます。
# WORKDIR 絶対パス # 記載例 WORKDIR /opt
今まで書いてきたDockerfileにTestフォルダを作成すること、WORKDIRでそのTestフォルダを指定、それからRUNでsampleファイルを作成することを指定してみます。
FROM ubuntu:18.04 RUN mkdir Test WORKDIR /Test RUN echo "hello wrold" > sample
ビルドし直してコンテナ起動すると、WORKDIRの効果が続くため/Testで起動しました。
WORKDIRの使いどころは、それ以降の操作を指定したディレクトリで行いたいときなどです。
一度だけであればRUNを以下のように「&&(複数コマンドが書ける)」と「 \(改行して書ける)」で繋げ、cd で実行してみてもいいんだと思います。
FROM ubuntu:18.04 RUN mkdir Test && \ cd /Test && \ echo "hello wrold" > sample
環境変数の設定ができます。
# ENV 環境変数名=値 # 記載例 ENV DB_USER="user" \ DB_PASSWORD="password" \ DB_DATABASE="sample_db"
今まで作ったDockerfileに特に意味はないですが、環境変数を設定してみます。
FROM ubuntu:18.04 RUN mkdir Test WORKDIR /Test RUN echo "hello wrold" > sample ENV BD_USER_="user" \ DB_PASSWORD="password"
envコマンドで設定した環境変数の確認ができました。
どちらもコンテナに指定したフォルダやファイルをコピーします。
使い分けとしては容量が大きいファイル等をtarで圧縮した場合はADDでコピー、それ以外はCOPYといった感じです。
# COPY コピー元 コピー先 # ADD コピー元 コピー先 #記載例 COPY ./file.conf /etc/conf ADD ./file.tar /etc/conf
Dockerfileと同じ階層にsample2というファイルを作成しておきました。
それからDockerfileにCOPYを追記し、ビルド、起動してみます。
FROM ubuntu:18.04 RUN mkdir Test WORKDIR /Test RUN echo "hello wrold" > sample ENV BD_USER_="user" \ DB_PASSWORD="password" COPY ./sample2 /Test
/Test直下にsample2を確認できました。
現場ではDockerに精通した方が環境構築用のDockerfileを作ってくれるんじゃないかと思います(直近の現場はそうでした)。それなので現場で自分で一から作っていくということはあまりないのかもしれません。
ですがアプリケーションの環境としてしっかりしたものが書けたらより良いので、個人学習などでDockerを積極的に使っていこうと思っています。
今回は書きませんでしたが、docker-compose.ymlという複数のコンテナを作成できるものが一般的かもしれないので、そちらについても記載できたらと思います。
今回は以上になります。
ご覧いただき、ありがとうございました。