仕事で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について勉強したことをまとめました。