未来を変える日記

ETロボコンを目指して

Docker (4) Dockerfileで弄って使う

 今回は、Dockerfileでイメージを弄って使う方法です。

f:id:corgi-eric:20210130151943p:plain:w150

  1. ターミナルからコマンドで使う
  2. Dockerfileでイメージを弄って利用
  3. Docker-Compose.yml で複数イメージを束ねる

はじめに

Dockerのおさらい

 下の図は前の記事でも掲載してますが、Dockerは、Docker Hubのイメージ(最小構成)に必要な設定などを追加してコンテナ化。WindowsでもLinuxでもベース環境に寄らずに同じソフトを同じように使うことができます。

f:id:corgi-eric:20210129052018p:plain

イメージを弄るとは?

 イメージを弄るとは、上の図の必要な設定を書き加えることです。前記事ではデータベースのPostgreSQLを使い以下の例を紹介しています。

$ docker run --name some-postgres -e POSTGRES_PASSWORD=mysecretpassword -d postgres

 このようにコマンドだけでも、docker container runの(-e)オプションなど、ある程度の設定はできます。しかし、設定が複雑な場合は、毎回コマンドする手間を考えると、Dockerfileにまとめて記載した置いた方が楽です。

Dockerfileの利用例

 下はDockerの基本を学習した後に作成したVPSで動くWordpressコンテナセットで作成したNginx用のDockerfileです。


内容の説明

 前述のdockerfileで何をしているか?をざっと説明します。

  • イメージはNginx 1.18.0でApline Linux版を利用(From)
  • 設定ファイルやスクリプト(nginx.conf, etc)を書き込み(COPY)
  • コンテナ内の整備
    • 必要なコマンドの導入(RUN apk add)
    • ディレクトリを整備(RUN mkdir)
    • 必要なファイル準備(RUN touch)
    • ファイルの権限変更(RUN chmod)
  • コンテナ起動時に実行するコマンドを指定(CMD)

使ってみる

 dockerfileを指定してコンテナ化する場合、イメージにdockerfile指定の諸事項を書き込むためのビルドが必要です。

f:id:corgi-eric:20210130143600p:plain
dockerfileを利用したコンテナ作成
docker build

 先ず、dockerfileや使用される設定ファイルなどを同じディレクトリの下に集めます。

$ docker build -t nginx2 .

 オプション(-t)でイメージに名前を付けます。コマンドの最後は「.」(ドット)です。

 上の公式を読むと、PATH | URLを指定とあり、PATHやURL指定でも使えます。従って、「.」(ドット)なら、今いるPATHでビルドせよとなりますね。

 下がビルド実行時のターミナル。dockerfile内のコマンドに従って画面に色々流れてきます。

f:id:corgi-eric:20210130143030p:plain

イメージの確認

 Docker desktopでイメージを確認してみます。コマンド操作でもできますが、今回はDocker DesktopでGUI操作です。Nginx2を探して、Inspectする。

f:id:corgi-eric:20210130144524p:plain

 Inspectの画面です。左側のIMAGE HISOTRYと右側のCOMMANDで、Dockerfileで指定したコマンドがイメージに書き込まれていることが分かります。

f:id:corgi-eric:20210130144652p:plain

 ターミナルから見る場合はimage historyというコマンド。

docker container run

 起動は、前記事でも紹介した run コマンドです。例えば以下のようなもの。

$ docker container run -d --name websrv -p 80:80 nginx2

よく使う命令

 Dockerfileでよく使った命令をまとめます。

FROM

 ベースとするイメージを指定する。例えば・・・

FROM php:8.0.0-fpm-alpine

 PHPの8.0.0FPM版でAlpine Linuxベースのものを読み出します。どのバージョンを使えば良いのか?は下の公式サイトから探せます。

f:id:corgi-eric:20210130145817p:plain
https://hub.docker.com/_/php/

RUN

 指定したコマンドを実行します。これにより、コンテナ内に必要なソフトを導入したり、ディレクトリを整備したりできます。例えば・・・

RUN apk add --no-cache lego supervisor
RUN mkdir /lego

 1行目では、legoとsupervisorを追加。2行目で /lego を作成しています。

COPY

 ファイルをイメージ内にコピーします。設定ファイルの書き込みとかで使います。

COPY nginx.conf /etc/nginx/nginx.conf

 予め準備したnginx.confをコンテナ内の /etc/nginx/ にコピー。

WORKDIR

 作業ディレクトリを変更します。例えば・・・

WORKDIR /etc/nginx
COPY nginx.conf /nginx.conf

 とすれば、2行目以降の命令から /etc/ngnix を省けます。

EXPOSE

 コンテナ内のポートを開放します。以下のように使います。

EXPOSE 80
-p オプションとの違い

 コマンドの docker container run にも -p オプションがあり、こちらもポート開放となっています。ですが、EXPOSEとは少し意味が違います。

f:id:corgi-eric:20210131103553p:plain

 クライアントPC(Windows10)にDockerを立て、コンテナ1にEXPOSE設定した場合、Docker内の同一ネットワークにあるコンテナ2と通信できます。データベースのMySQLとかは、必要なのは例えばWordpressなどのミドルウェアからの内部アクセスのみで、外部に晒す必要はないので、これで十分なのです。

 一方で、NginxやApacheなど外部公開を前提とするWebサーバーは、Docker内外から見える必要があります。そこで、オプション(-p)を使います。

ENV

 イメージ内の環境変数を指定します。例えば以下のように記載しておけばタイムゾーンを日本に変更できます。

ENV TZ="Asia/Tokyo"

CMD

 コンテナ実行時のコマンドを指定します。今回の例は、Nginxのイメージですが・・・

CMD [ "/usr/bin/supervisord", "-c", "/etc/supervisord/conf.d/app.conf" ]

 コンテナ化後は、内部で定期実行用の Cron を同時起動するために、プロセス管理ツールの Supervisordを起動させ、Supervisordから NginxとCronを同時起動しています。

まとめ

 今回はDockerfileでイメージを弄って使う方法をまとめました。例えば、Dockerfileで環境構築してGitHubで共有すればチームでの開発に便利そうですね。
 次はDocker-compose.yml で複数のイメージをまとめる方法です。