Dockerfileの書き方と使い方
はじめに
お仕事でDocker(実際はECS/ECR)を触る可能性が出てきたので、
以下の3点について復習も兼ねて記事にしておきます。
- Dockerfileについて
- DockerfileからDockerイメージ作成
- Containerデプロイの流れ(オンプレ環境Docker)
Dockerfileについて
Dockerイメージをそのまま使うのではなく、必要なパッケージやアプリ、各種設定を含んだDockerイメージを自分で作成して使用するケースが増えてきています。
Dockerfileを使用することで必要なDockerイメージを作成することができます。
Dockerfileとは
- 独自のDockerイメージを作るための設計図
- DockerHubに公開されているDockerイメージ+独自カスタマイズ(ミドル追加etc..)
- ベースとなるDockerイメージに対して実行する処理を定義していく
Dockerfile書き方
解説の前に、完成したDockerfileはこちらです。
FROM centos:7 RUN set -x \ && yum update -y \ && yum install -y epel-release \ && yum install -y nginx \ && yum clean all \ && sed -i -e "s/index index.html index.htm/proxy_pass http:\/\/ip-api.com\/json/" \ /etc/nginx/nginx.conf.default \ && ln -sf /dev/stdout /var/log/nginx/access.log \ && ln -sf /dev/stderr /var/log/nginx/error.log EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]
[FROM]
ベースとするDockerイメージを設定する
docker images
で表示されるイメージ or DockerHubのイメージ
[RUN]
ベースイメージに対してパッケージやアプリを追加する処理を設定する
イメージ作成前に実行される
不要なイメージのレイヤーが作成されるのを防ぐために&&
で一連の操作を一つにまとめる
docker build
で実行コマンドが出力されるようにset -x
をRUNの最初に実行する
※ 冗長化させたいプログラムの起動コマンドはRUNではなくCMDに書く
[EXPOSE]
作成されるコンテナの公開ポートを設定する
コンテナ外部からのアクセスが可能になるわけではないので以下の手順が必要です
- DockerfileのEXPOSEにポートを設定する
- コンテナ起動時、ホストOSのポートにバインドする
docker run -p <ホストOSポート番号>:<コンテナポート番号>
[CMD]
配列形式で実行コマンドを設定する
イメージ作成後に実行される
Dockerfileの最後に定義しているCMDのみ実行する(複数CMD不可)
複数のCMDを実行したい場合はshファイルに設定してDockerfileからshファイル実行する
DockerfileからDockerイメージ作成
DockerfileからDockerイメージを作成する場合はdocker build
コマンドを使用します。
# docker build -t Dockerイメージ名:タグ名 Dockerfileのあるディレクトリ $ docker build -t sample-image .
Dockerfileを更新して再度イメージとする場合は、以下2通りの方法があります。
- 同じbuildコマンドを実行してDockerイメージを上書きする
- タグ名を変更して前回のDockerイメージを残したままイメージを追加する
Containerデプロイの流れ
Dockerイメージを元にしてコンテナを作成する場合はdocker run
コマンドを使用します。
コンテナ作成後にコンテナの起動までdocker run
コマンドが実行してくれます。
docker runのオプションはこちら
# docker run --privileged --name コンテナ名 -d -p ホストPORT:コンテナPORT -it イメージ名 bin/bash $ docker run --privileged --name sample-container -d -p 80:80 -it sample-image /bin/bash # コンテナにShellでログイン # docker exec -it コンテナ名 /bin/bash $ docker exec -it sample-container /bin/bash
まとめ
なんとなくでやってたDockerですが、調べてみると奥が深い(難しい)
コンテナ職人になるべく、ベストプラクティスとかを読み漁っていきますかね。