gitkadoの気まぐれ日記

島根在住エンジニアが何かに興味を持ったらブログを更新します

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]

作成されるコンテナの公開ポートを設定する
コンテナ外部からのアクセスが可能になるわけではないので以下の手順が必要です

  1. DockerfileのEXPOSEにポートを設定する
  2. コンテナ起動時、ホスト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ですが、調べてみると奥が深い(難しい)
コンテナ職人になるべく、ベストプラクティスとかを読み漁っていきますかね。

参考

Dockerfile作成の流れ
Dockerfile基本構文
Dockerfile作成時に注意すること