from 30

30歳からwebエンジニアになったけど、思ったよりも苦しいので、その苦闘の記録をば

今更ながらDockerについて整理してみる[docker-compose / ネットワーク]

概要

前回・前々回でmac上での操作、Dockerfileの作り方についてまとめた。

Dockerfileもとにdocker buildでコンテナイメージを作成して、docker runコマンドでコンテナを立ち上げているが、docker runコマンドでは、ボリュームやポート番号やユーザーなどなど色々とオプションで渡す必要がある。

逐一書いていては面倒だし、同一ホストで複数コンテナを立ち上げる場合などはとても面倒である。

ということで、そう言う時に使用するのが、docker-composeコマンドである。

なお、実環境においては、docker-composeは単一ホストでしか機能しないため、 冗長性やスケーリングの面で不十分である。 (その辺はゆくゆくECSやEKSのまとめでも書いてみよう...)

あくまで手元のオペレーションを効率化するというような視点で捉えるべきである。

1. 基本例

$  docker run --name docker_nginx --env env_key=env_value -p 9090:80 -v ${pwd}:/usr/share/nginx/html nginx

上のdocker runコマンドをdocker-composeで書くと以下。

  • version
  • services ... ここの下にコンテナの種類ごとに書いていく
  • nginxの箇所 ... サービス名を宣言
  • image ... コンテナイメージを指定。docker runコマンドの引数
  • container_name ... --nameオプションに対応
  • environment ... --envオプションに対応
  • ports ... -pオプションに対応
  • volumes ... -vオプションに対応
  • command ... docker runコマンドの第二引数に相当
version: "3.8"
services:
  nginx:
    image: nginx:latest
    container_name: docker_compose_nginx
    environment:
      - env_key=env_value
    ports:
      - "80:80"
    volumes:
      - ${PWD}:/usr/share/nginx/html:ro

docker-composeファイルを元にコンテナ起動するコマンドは以下

  • -f ... docker-compose.ymkのパスを指定
  • up ... 起動
  • down ... 停止
  • logs ... ログを表示
    • --follow ... tailできる
$ docker-compose -f docker-compose.yaml up
$ docker-compose -f docker-compose.yaml down
$ docker-compose -f docker-compose.yaml logs --follow # --followがあるとtailできる

2. 複数コンテナを書く

docker-composeではservices以下に複数のコンテナを記載することも可能である。

version: "3.7"
services:
  nginx:
    image: nginx:latest
    container_name: docker_compose_nginx
    environment:
      - env_key=env_value
    ports:
      - "80:80"
    volumes:
      - ${PWD}:/usr/share/nginx/html:ro
  ubuntu:
    image: ubuntu
    container_name: docker_compose_ubuntu
    ports:
      - "8080:8080"

3. コンテナをレプリケーションする

docker-compose upする際に--scaleオプションでコンテナのレプリケーションが可能である。

$ docker-compose -f docker-compose.yaml up --scale nginx=3

以下の点に注意

  • port番号を範囲にする
  • container_nameをつけることはできない
version: "3.7"
services:
  nginx:
    image: nginx:latest
    environment:
      - env_key=env_value
    ports:
      - "80-85:80"
    volumes:
      - ${PWD}:/usr/share/nginx/html:ro