Dockerfile & docker-compose.ymlの書き方

詳しく知りたい場合はDockerの公式ドキュメントを読もう.

Dockerfileの書き方

フォーマット

# comment
INSTRUCTION arguments

FROM

新しいビルドステージを初期化し, ベースイメージをセットする. 基本的にDockerfileの先頭に書く.

FROM イメージ名[:タグ名]

ARGはFROMの前に書ける.

ARG VERSION=latest
FROM busybox:$VERSION

RUN

コンテナ内でコマンドを実行し, イメージを更新する.

RUN コマンド

CMD

docker container runしたときに実行されるデフォルトコマンドを指定する.

CMD ["executable", "param1", "param2"]

のような形式で書くことが望ましい.

ENTRYPOINT

docker container runしたときに実行されるデフォルトコマンドを指定する. CMDの場合はdocker container run some-image A Bと書くと, コマンドが上書きされてA Bが実行されるのに対し, ENTRYPOINTは上書きされず, A Bは引数として渡される.

ENTRYPOINT ["executable", "param1", "param2"]

のような形式で書くことが望ましい.

COPY

ホスト側のファイル(ディレクトリ)をコンテナ内にコピーする.

COPY <src>... <dest>

ADD

基本的にはCOPYと同じ. srcにURLを指定出来たり, 圧縮されたファイルの場合は展開してコピーしてくれたりする.

ADD <src>... <dest>

EXPOSE

公開するポートを示す. ドキュメントの役割であり, EXPOSEを書くとポートが公開されるという訳ではない.

EXPOSE ポート番号 [ポート番号/プロトコル...]

ENV

ENV キー 値またはENV キー=値環境変数を設定する.

USER

このあとのコマンドを指定したユーザとして実行する.

USER ユーザ名[:グループ名]

WORKDIR

コンテナ内のワーキングディレクトリを指定する.

WORKDIR パス

docker-compose.ymlの書き方

あまりにも設定できる項目が多いので, 気になったものだけ書く.

build

build: Dockerfileが配置された場所のパスと書くと, そこにあるDockerfileを元にイメージをビルドする.

version: "3.8"
services:
  webapp:
    build: ./dir

image

image: イメージ名[:タグ名]と書くと, そのイメージを元にコンテナを作る.

command

デフォルトのコマンドを上書きする.

command: bundle exec thin -p 3000

depends_on

依存関係を示す. 例えば以下のように書くと, docker-compose upしたときdb redis -> webという順番で立ち上がり, docker-compose downしたときweb -> db redisという順番で終了する.

version: "3.8"
services:
  web:
    build: .
    depends_on:
      - db
      - redis
  redis:
    image: redis
  db:
    image: postgres

environment

環境変数を追加する. キーのみ書くと, docker-composeを実行している環境の変数の値が渡される.

environment:
  RACK_ENV: development
  SHOW: 'true'
  SESSION_SECRET:

または

environment:
  - RACK_ENV=development
  - SHOW=true
  - SESSION_SECRET

と書く.

networks

接続するネットワークを指定する.

services:
  some-service:
    networks:
     - some-network
     - other-network
networks:
  some-network:
  other-network:

ports

ポートをホスト側に公開する. フォーマットは[HOST:]CONTAINER(ホスト側を省略すると, ephemeral portから選ばれる).

ports:
  - "3000"
  - "3000-3005"
  - "8000:8000"
  - "9090-9091:8080-8081"
  - "49100:22"
  - "127.0.0.1:8001:8001"
  - "127.0.0.1:5000-5010:5000-5010"
  - "6060:6060/udp"
  - "12400-12500:1240"

expose

ポートをリンクされたコンテナに公開する(ホスト側には公開しない).

expose:
  - "3000"
  - "8000"

volumes

ホスト側のディレクトリまたは名前付きボリュームをコンテナにマウントする. フォーマットは[SOURCE:]TARGET[:MODE].

volumes:
  # Just specify a path and let the Engine create a volume
  - /var/lib/mysql

  # Specify an absolute path mapping
  - /opt/data:/var/lib/mysql

  # Path on the host, relative to the Compose file
  - ./cache:/tmp/cache

  # User-relative path
  - ~/configs:/etc/configs/:ro

  # Named volume
  - datavolume:/var/lib/mysql

restart

どういう場合に再起動するかを指定する. デフォルト値は"no"(常に再起動しない). "always"は常に再起動, "on-failure"はexit codeがエラーを表している場合のみ再起動, "unless-stopped"はコンテナが停止されない限り再起動することを意味する.

restart: "no"
restart: always
restart: on-failure
restart: unless-stopped