てんこ製作

Tenco Works

Docker Composeを使ってみる

仕事でDocker使いましょうって話になったのですが、てんこ実は今までDockerを使ったことがありませんでした。そこでDocker初級のてんこが勉強した結果をまとめてみるという記事を書いてます。

Dockerの概要、Dockerコマンドを使った実践に続いて、今回はDocker Composeについて学んだことをまとめてみます。

  • 第1回 Dockerの概要を勉強してみる
  • 第2回 Dockerコマンドを使ってみる
  • 第3回 Docker Composeコマンドを使ってみる ★本記事

前提

  • 自分でDockerイメージを作ろうという話は含みません。Docker Hubで公開されているDockerイメージを使う方法について書いてます。
  • Docker / Docker Composeはインストール済みの状態とします。
  • 記事はLinux(Ubuntu 20.04)にインストールしたDockerを使いながら確認しました。

キモはYAMLファイル

Docker Composeを使うときのDockerコンテナを起動する流れを書くと、とてもシンプルです。

  • docker-compose.ymlファイルを作成する
  • docker-compose upコマンドを実行する

これだけです。

ただdocker-comse.ymlには、コンテナを起動するために必要な情報をすべて記載することになります。なので、docker-compose.ymlの作成がキモになるのかなぁと思いました。

docker-compose.ymlの例

前回MariaDBをDockerで動かしたのと同じことを、docker-compose.ymlで書くと次のような感じになります。

version: '3.8'

services:

  db:
    image: mariadb
    container_name: docker-mariadb
    environment:
      MYSQL_ROOT_PASSWORD: password
    ports:
      - 3306:3306

中身を順を追って確認していきます。

version:は、Docker Composeのファイルフォーマットのバージョンを指定するものです。本家のマニュアルによると、Dockerエンジンのバージョンに依存する模様。version: '3.8'が現時点で最新バージョンのフォーマットのようです(2021/2/26現在)。

services:は、「ここから先はDockerで起動しようとしてるアプリについて書きますよ〜」というラベルです。他にもnetworks:とかvolumes:とかも書けるんですが、今回はservices:だけです。

次のdb:は、MariaDBのコンテナについての記述する部分に付けたラベルです。service:ラベル配下には複数のコンテナを記述することができて、それぞれを識別するために任意の名前を付ける部分になります。今回は一つしかコンテナを使ってないので識別の必要もないですが、文法上必要なようです。

image:はDockerイメージの名前です。Dockerコマンドでdocker pullしたりdocker runしたりするときに指定していたDockerイメージの名前はここで指定します。

container_name:はDockerコンテナの名前です。docker runコマンドで--nameオプションを使ってコンテナに名前を付けてましが、docker-compose.ymlではここで指定できます。ただ、この指定はしなくてもDocker Compose側でDockerイメージ名やサービス名のラベルからコンテナ名を自動生成してくれます。なので、無くても大丈夫です。

environment:は、Dockerコンテナに渡す環境変数です。docker runコマンドで-eオプションを使って指定していた部分がここになります。

ports:は、Dockerコンテナで公開するネットワークポートです。docker runコマンドで-pオプションを使って指定していた部分です。

こんな風にdocker-compose.ymlに記述する内容は、ほぼほぼDockerコマンドでオプションに指定するような情報を予め書いておくような感じになっていることがわかりました。

コンテナ起動

docker-compose.ymlファイルの準備ができたら、docker-compose upコマンドで起動します。

$ sudo docker-compose up -d
Creating network "mariadb_default" with the default driver
Pulling db (mariadb:)...
latest: Pulling from library/mariadb
83ee3a23efb7: Pull complete
db98fc6f11f0: Pull complete
f611acd52c6c: Pull complete
aa2333e25466: Pull complete
f53ac4b825fd: Pull complete
c20afcf9b055: Pull complete
54c5dc6dcf19: Pull complete
b1c71d744483: Pull complete
863a8cc01d1c: Pull complete
ea6c59f9e205: Pull complete
6aa441240c22: Pull complete
c1fee6e1dead: Pull complete
Digest: sha256:a13b01d9af44097efeca7a3808a524c8052870e59a1eeef074857ba01e70c1f2
Status: Downloaded newer image for mariadb:latest
Creating docker-mariadb ... done
$ sudo docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                    NAMES
82db904cb593   mariadb   "docker-entrypoint.s…"   16 seconds ago   Up 13 seconds   0.0.0.0:3306->3306/tcp   docker-mariadb
$ 

たくさんメッセージが出力されますが、Dockerイメージの取得からDockerコンテナの起動まで一気にできてしまいました!

-dオプションはdocker-composeコマンドをバックグラウンドで稼働させるオプションです。docker runコマンドで指定していた-dオプションと同じです。

あと、docker-composeコマンドの処理対象になるdocker-compose.ymlは指定してません。指定しない場合はカレントパスにあるdocker-compose.ymlになります。-fオプションで違うパスや違うファイル名を指定することも可能ですが、docker-compose.ymlファイルを配布されている他の方の情報を見ていても-fオプションを使う事例には出会いませんでした。そこは任意ってことですかね。

まとめ

Docker Composeを使えば、Dockerコマンドで行う作業をdocker-compose.ymlというファイルにまとめて共有することができるようになりました。

これが発展していくと、1回目の記事の例に上げたような複数のDockerコンテナの場合でも1個のdocker-compose.ymlで書けてしまったりします。

いろいろできるので説明しだすとキリが無さそうですが、まず他の人が書いたdocker-compose.ymlが読めるようになるだけでもだいぶ違うような気がしました。

以上。3回に渡ってDocker / Docker Composeについて勉強したことをまとめました。