MyDocs

# Dockerとdocker-composeのまとめ

Docker

Dockerfile を元にイメージを構築する。

build

Dockerfile が存在するディレクトリで実行する。

$ docker build .

-f オプションを使うことで Dockerfile のパスを指定できる。

$ docker build -f /path/to/Dockerfile .

FROM

ベースイメージを指定する。

FROM <image>[:<tag>][AS <name>]

AS <name> でステージに名前を付けて、以降の FROMCOPY --from=<name> 命令で構築イメージを参照できる。

RUN

シェルとして実行される。

RUN /bin/sh -c 'source $HOME/.bashrc;' \
echo $HOME

1 行で書く場合。

RUN /bin/sh -c 'source $HOME/.bashrc; echo $HOME'

bash/sh 以外のシェルを使う場合は exec 形式でシェルに引数を渡す。

RUN ["/bin/bash", "-c", "echo hello"]

exec 形式で書く場合は json 配列として扱わるため "" で囲む必要がある。

CMD

Dockerfile 内の CMD 命令は 1 つのみ。複数あっても最後の CMD 命令のみが実行される。 CMD の目的はコンテナの実行時のデフォルトの処理を指定する

FROM ubuntu
CMD ["/usr/bin/wc", "--help"]

ADD / COPY

<src> で指定したファイル、ディレクトリをコンテナ内の <dest> にコピーする。 ローカルのファイルをコンテナにコピーしたい場合は COPY を使う。 ADD はローカルでの圧縮ファイルの展開やリモートファイルの展開したい場面で使う。

ADD [--chown=<ユーザ>:<グループ>] <src> <dest>
COPY [--chown=<ユーザ>:<グループ>] <src> <dest>

EXPOSE

コンテナが接続するためのリッスンするポートを指定する。

EXPOSE 80

実際にはポートの公開は行われない。ドキュメント的な用途として使われる。 実際に公開して使うには、 docker run の際にフラグをつける。

$ docker run --rm -it -p 80:80 <image> bash

ENV

環境変数の設定をする。

ENV <key>=<value>

環境変数は、 Dockerfile 内の変数として使える。 使い方は、 $variable_name もしくは、 ${variable_name}

FROM <image>
ENV FOO=/bar
WORKDIR ${FOO} # WORKDIR /bar

ENTRYPOINT

最適な使い方はイメージに対してメインのコマンドを設定しておき、 CMD を使ってデフォルトフラグを指定する。

ENTRYPOINT ["go"]
CMD ["--help"]

パラメータを指定して起動することでコマンドの実行ができる。

$ docker run <image> run main.go

VOLUME

コンテナによって作成されるファイルやフォルダの公開に使う。イメージの可変的な部分、ユーザが設定可能な部分について使う。

USER

非 root ユーザで実行可能な場合は USER を使ってユーザの変更する。

USER <ユーザ>[:<グループ>]

WORKDIR

Dockerfile で続く RUNCMDENTRYPOINTCOPY / ADD の命令の処理時で使う作業ディレクトリを指定する。

ARG

build 時にユーザが渡せる変数を定義する。 構築時には docker build --build-arg <変数名>=<値> を指定する。

ARG <name>[=<デフォルト値>]

docker-compose

サービスを定義する。

build

ビルド時に適用される。

services:
  webapp:
    build: ./dir

context でパスを指定し, Dockerfileargs も指定できる。

services:
  webapp:
    build:
      context: ./dir
      dockerfile: Dockerfile-alternate
      args:
        buildno: 1

image 名と tag を指定できる。

build: ./dir
image: webapp:tag

context

Dockerfile を含むディレクトリへのパスか、 git リポジトリの URL を指定する。

build:
  context: ./dir

dockerfile

別の Dockerfile を指定する。この場合、ビルドパスを同時に指定する必要がある。

build:
  context: .
  dockerfile: Dockerfile-alternate

args

ビルド時にのみ有効な環境変数を設定する。 個々をマッピングするか、リストで書く.ブール値はクォートで囲む。

build:
  context: .
  args:
    buildno: 1
    gitcommithash: abc123
build:
  context: .
  args:
    - buildno=1
    - gitcommithash=abc123

command

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

command: bundle exec thin -p 3000

リスト形式も可能。

command: ["bundle", "exec", "thin", "-p", "3000"]

depends_on

サービス起動の依存関係を表す。 以下の場合、 db と redis の起動後に web が起動する。

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

entrypoint

デフォルトのエントリーポイントを上書きする。

entrypoint: /code/entrypoint.sh

リスト形式も可能。

entrypoint: ["php", "-d", "memry_limit=1", "vendor/bin/phpunit"]

environment

環境変数を追加する。 個々をマッピングするか,リストで書く.ブール値はクォートで囲む。

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

expose

ホストマシンにはポートを公開せずに,ポートを expose する. リンクされたサービスのみアクセス可能。

expose:
  - "3000"
  - "8000"

external_links

実行する docker-compose.yml 以外から起動されたコンテナをリンクする。 コンテナ名とエイリアス名 (CONTAINER:ALIAS) を指定する。

external_links:
  - redis_1
  - project_db_1:mysql

extra_hosts

ホスト名をマッピングに追加する。 /etc/hosts に追加される。

extra_hosts:
  - "somehost:162.242.195.82"

ports

公開用のポートを設定する。 ホスト側とコンテナ側のポートを指定する( HOST:CONTAINER )。 もしくは、コンテナ側のポートを指定する。

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"

volumes

複数のサービスにわたってボリュームを再利用したい場合、最上位の volumes キーで名前付きボリュームを定義する。 以下の場合、 db サービスのデータディレクトリは、 backup サービスのボリュームにも共有させている。

version: "3.9"
services:
  db:
    image: db
    volumes:
      - data-volume:/var/lib/db
  backup:
    image: backup-service
    volumes:
      - data-volume:/var/lib/backup/data
volumes:
  data-volume:

短い書き方では、 [SOURCE:]TARGET[:MODE] と書ける。 roreadonly

- ./cache:/tmp/cache:ro

変数の置換

シェル環境に POSTGRES_VERSION=9.3 が定義されていると、 postgres のバージョンは 9.3 になる。

db:
  image: "postgres:${POSTGRES_VERSION}"

環境変数が設定されていない場合は空文字になる。 環境変数のデフォルト値は .env ファイルに設定しておくことができる。