😎

docker-composeの基礎的なこと

2021/04/08に公開

docker-composeについて学習したのでアウトプットします。
(そういやインフラ系をまともに学習したのはこれが初めてかも…)

※ Dockerアウトプットの続きとなります

https://zenn.dev/eitches/articles/2021-0305-docker-container-network
https://zenn.dev/eitches/articles/2021-0320-docker-volumes

docker-compose

概要

1. コマンドラインツールと設定ファイルを組み合わせたもの  
2. あくまでローカル/テスト環境用のコマンドで、本番環境での使用は想定されていない  
3. バックグラウンドでDocker CLIのAPIを叩いているだけ

ex)  
RailsはRailsだけで動いているわけではなく、MySQLなどと連携して動いている  
-> これらをDockerで動かす場合、それぞれのコンテナを関連付けて動かす必要があるが、
   コンテナごとにdokcer container runなどのコマンドを実行していられない  
-> YAMLファイルにあらかじめ実行コマンドや設定を記述しておき、docker-composeコマンドで一発で実行できるようにする

Docker-Composeを構成するもの

1. YAMLファイル(設定ファイル)
     複数のコンテナ、ネットワーク、ボリュームなどの関係性や設定を記述できる
2. コマンドラインツール
     docker-composeコマンドを使用できる
     YAMLファイルの情報に基づいて実行される

1. YAMLファイルについて

概要

1. containers, networks, volumesそれぞれの設定ができ、関連をもたせることもできる  
2. 基本的にはdocker-compose.ymlというファイル名だが変えることもできる(推奨しない)  
3. servicesはcontainersのこと

drupalとpostgresqlを結びつけて起動させるYAMLファイル

カスタムしたdrupalイメージを使用する場合

# DrupalとPostgresの設定の例
version: '2'
services:
  drupal: # ここの名前は自由、コンテナを参照する際のDNS名となる
    # build: .でdocker-compose.ymlと同じフォルダにDockerfileがあることを示す
    build: . 
    # Dockerfileの名前がデフォルトと違う場合はdockerfile、
    # 保存場所がdocker-compose.ymlと違うディレクトリの場合はcontextに指定する
    # build:
    #   context: .
    #   dockerfile: drupal.Dockerfile
    image: custom-drupal # ローカルにイメージのキャッシュがない場合、ここから取得する
    ports:
      # コンテナ側のportはDokerfileやREADME, docker image inspectから調べる
      - "8080:80"
    volumes:
      # どのVolumeを使用するのかはそのイメージのREADMEを参照
      - drupal-modules:/var/www/html/modules
      - drupal-profiles:/var/www/html/profiles
      - drupal-sites:/var/www/html/sites
      - drupal-themes:/var/www/html/themes
   postgres:
     image: postgres
     environment:
       - POSTGRES_PASSWORD=test
     volumes:
       - drupal-data:/var/lib/postgresql/data

volumes: 
 # servicesでvolumesを設定した場合、個々にも書く
 # valueが空の場合、プラットフォームのデフォルトが使用される
 drupal-data:
 drupal-modules:
 drupal-profiles:
 drupal-sites:
 drupal-themes:

備考

1. bridgeはdocker-compose up時にランタイム上で自動生成されるので、設定しなくてよい
2. portsを指定するのは、あくまでlocalhostに読み取らせたいコンテナのみ  
   -> コンテナ同士はportsがなくてもDockerネットワーク(bridge)内部で通信できる
3. docker-compose downするとボリュームも消えるが、volumesを指定しておくとデータを永続化できる

2. コマンドについて

docker-compose up

ネットワークやボリュームを作成したり、コマンドを一括実行したりできる
このコマンド1つで複数のコマンドを実行したり、設定を反映させられる
=> サーバなどはimageからダウンロードするので、実行環境に依存しない
=> 環境構築が楽になる

docker container runで使用していた-dオプションなどを使用できる

docker-compose down

docker-compose upで立ち上げたコンテナ類をSTOPし、
ネットワークやボリュームもremoveする

docker-compose top

現在docker-composeによって立ち上がっているすべてのプロセスを確認できる

docker-compose build OR docker-compose up -b

1. イメージのダウンロードやビルドを行う(後者はビルドしてからコンテナを起動する)
2. キャッシュがある場合はキャッシュを使用するので、Dockerfileに更新がある場合は--no-cacheオプションを使用する

Discussion