おからの日記

最近,おからに改名しました

Dockerfileとdocekr-compose.ymlの書き方

Dockerfileとdocekr-compose.yml,どっちが先に読まれるのか,どっちもコマンドを使えるがどこまでをどっちのファイルに書くのか,調べてみても様々な書き方が出てきて迷いました...
正解かわかりませんが現時点での自分の理解を載せておきます.



Dockerfileには一つのコンテナを立ち上げるプロセスを書きます.
例としてpython3を使う場合の公式のコードをあげます.

Dockerfile

1   FROM python:3  
2
3   WORKDIR /usr/src/app
4
5   COPY requirements.txt  ./         
6
7   RUN pip install --no-cache-dir -r requirements.txt 
8
9
10  COPY . .                         
11
12  CMD [ "python", "./main.py" ]    

やってること
5行目  ./ 配下 にある requirements.txtをdockerコンテナの中にコピー
7行目  requirements.txtに書かれたライブラリをインストール.
10行目  ./ 配下 にあるディレクトリとファイル全てをdockerコンテナの中にコピー.
12行目 $ python main.pyを実行.このとき$ python3 main.pyとしなくていいのは,python3のイメージのみを使っているため.


docker-compose.ymlにはどのDockerfileを読んで使うかを書きます. このファイルでは複数のコンテナを同時に立てることができます. Dockerfileを選んでイメージを作る仕事だけをさせるのでここにはcommand:はあまり書かない,はずです...
command:を使う場合は,あとで説明する,Dockerfileを自分で書かない場合です. 上のDockerfileを使う場合,最低限のコードを書くとこうなりました.

docker-compose.yml

1  version: '3'   
2  services:  
3    webapp:     
4      build: . 

やってること
1行目  docker-composeのバージョンを指定.
2行目  コンテナの集まりの名前を定義.この名前はよく使われています.
3行目  一つのコンテナの名前を定義.
4行目  ./ にあるDockerfileを使う.という意味



二つのファイルを保存したら,

$ docker-compose build
$ docker-compose up

と叩くと,以下2つのコマンドを叩いたことと同じになります.

$ pip3 -install -no-cache-dir -r requirements.txt
$ python3 main.py

なんだこれだけかという感じですね.これだったらpip3 ooo くらいなら叩くけどなあと思ってしまいますが,コンテナをいくつも建てるとなるとありがたさがわかってきます.

複数のコンテナを建てる場合はこうなります.

1  version: '3'   
2  services:  
3    webapp:     
4      build: . 
5    server:
6      image: redis
7      command: redis-server
8    test:
9      image: minio/minio

webapp, server, test の3つのコンテナを建てました. image : redisでは,Docker Hub に上がっているDockerfileを読み込んで使えます.

https://hub.docker.com/r/minio/minio
https://hub.docker.com/_/redis

これが先ほど言った「自分で書かないDockerfile」です.この場合,打ちたいコマンドをDockerfile内で指定できないのでcommand:を使うことになります.
ここでは「イメージを決める」,「コマンドを叩く」の二種類しかやらせていませんが,ポートの指定や,データ,環境変数の指定もできます.

参考
* Dockerfile Docker Hub
* docekr-compose.yml Compose file version 3 reference | Docker Documentation