🐨

【Docker】compose.yamlの書き方

2023/11/01に公開

Docker Composeとは

一度に複数のコンテナを作成、実行できるソフトウェアです。

dockerとの違いは、コマンド入力のみで実行できるわけではなく、作成、実行するコンテナの詳細をyamlファイルに記述しておき、その上でdocker composeコマンドを使って実行したりできる点です。

compose.yamlファイルの記述方法

基本的にはdockerコマンドでそれぞれ立ち上げるために入力するdocker runコマンドのオプションなどをyamlファイルに記述します。

webサーバー

docker container run --name apache -p 8080:80 -d httpd

DBサーバー

docker container run --name mysql -dit -v mydb:/var/lib/mysql -e MYSQL_USER: user -e MYSQL_ROOT_PASSWORD: pass mysql:5.7

runコマンドを分解する

runコマンドをそれぞれ分解すると
webサーバーの場合だと
--name apache = 起動するコンテナをapacheという名前にする
-p 8080:80 = ホスト側の8080番とコンテナ側の80番ポートをつなげる
-d = バックグラウンドで実行
httpd = イメージ名
のような形になりますので、この情報をyamlファイルに記述していきます。

補足
  • -dに関しては記述するのではなく、docker compose up -dと実行時に入力します。
  • yamlファイルはkey: valueの形式で基本的に記述します。
  • valueの前に半角スペースを1つ入れる
version: '3'

services:
  web:
    image: httpd
    container_name: apache
    ports:
    - "8080:80"
    
  db:
    image: mysql:5.7
    container_name: mysql
    environment:
      MYSQL_USER: user
      MYSQL_ROOT_PASSWORD: pass
    volumes:
      - mydb:/var/lib/mysql
volumes:
  mydb:

yamlファイルに記述する項目は大きく分けると以下のようなものになります。
version: compose.yamlの書式のバージョンを記述します。
services: 中にそれぞれのコンテナに関する情報を記述します。
volumes: ホスト側のdockerに作成するボリュームについて記述します。
network: コンテナ間の接続を記述します。

services:の中は立ち上げるコンテナ毎にわけて記述しています。
今回の場合はapacheを方をweb,mysqlの方をdbと命名しました。
webの中はdocker runでapacheコンテナを立ち上げるときに記述した内容を記述していきます。
dbの方も同じです。
dbコンテナのように -e ~~~ -e ~~~のように同一の項目のオプションがある場合、yamlファイルでは

eivironment:
  ~
  ~

のように記述します。

dbの方はコンテナを閉じたときに中のデータが消えてしまわないようにホストのdockerにディレクトリの保存先を変更するような記述をvolumesの部分で行っています。

これで二つのコンテナ分の記述がyamlファイルの中にできたため
docker compose upを実行すると
webとdbのコンテナが両方起動されます。

ちなみにimageをpullするのではなく、用意したDockerfileからイメージを作成してコンテナを起動したい場合は
image: mysqlの部分をbuild: .のようにします。.はDockerfileのある場所を記述します。

【追記】
compose.yamlのversion:に関しては記載しても大丈夫ですが、特に記載しなくていいようです。(公式は非推奨)

Discussion