一般視聴者はdocker-compose upを完全に理解したい！！

この記事は[SFC-RG Advent Calendar 2019][0]の12日目です。

## 対象読者

「docker-compose upってなんだよ？トレンドに取り残されたくねええ！！」という人々

~~トレンド入りしたっけ？~~

## 時代はdocker-compose up

昨日、あるツイートが投稿されました。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">新人Vtuberの希来里パイです<br>自己紹介動画を作りました<br>この度ｘｘｘｘｘｘを始めさせていただきます<br>至らない点もあるかと思いますがどうぞお楽しみくださいませ<br><br>⬇︎⬇︎⬇︎<a href="https://t.co/05rcTye2CV">https://t.co/05rcTye2CV</a><a href="https://twitter.com/hashtag/%E8%87%AA%E5%B7%B1%E7%B4%B9%E4%BB%8B?src=hash&amp;ref_src=twsrc%5Etfw">#自己紹介</a> <a href="https://twitter.com/hashtag/%CF%80%CF%80%E6%9D%A5%E6%9D%A5?src=hash&amp;ref_src=twsrc%5Etfw">#ππ来来</a> <a href="https://twitter.com/hashtag/%E3%81%AF%E3%81%98%E3%82%81%E3%81%BE%E3%81%97%E3%81%A6?src=hash&amp;ref_src=twsrc%5Etfw">#はじめまして</a> <a href="https://twitter.com/hashtag/%E6%96%B0%E4%BA%BAVtuber?src=hash&amp;ref_src=twsrc%5Etfw">#新人Vtuber</a> <a href="https://twitter.com/hashtag/Vtuber?src=hash&amp;ref_src=twsrc%5Etfw">#Vtuber</a> <a href="https://twitter.com/hashtag/Vtuber%E3%81%AF%E3%81%98%E3%82%81%E3%81%BE%E3%81%97%E3%81%9F?src=hash&amp;ref_src=twsrc%5Etfw">#Vtuberはじめました</a> <a href="https://twitter.com/hashtag/Awaken?src=hash&amp;ref_src=twsrc%5Etfw">#Awaken</a> <a href="https://twitter.com/hashtag/%E6%8B%A1%E6%95%A3%E5%B8%8C%E6%9C%9B?src=hash&amp;ref_src=twsrc%5Etfw">#拡散希望</a> <a href="https://t.co/5beqhH3HUk">pic.twitter.com/5beqhH3HUk</a></p>&mdash; 希来里パイ / 自己紹介動画あげました @新人Vtuber (@piepielielie) <a href="https://twitter.com/piepielielie/status/1204747955963494402?ref_src=twsrc%5Etfw">December 11, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

とりあえず見ればわかります。VTuberがDockerで動く時代が来たようです。

## 了解！docker-compose up！

で、そもそも```docker-copose up```って何をするものなのよっていう疑問。お答えしましょう。

### docker-composeとは

Dockerという、様々なソフトウェアを動作環境ごとパッケージングして、どんなパソコンでも手軽に動かせるようにした仕組みがあります。

docker-composeはそのDockerのパッケージを複数組み合わせて動かす時に使うものです。

ちなみにDockerのパッケージの事をイメージと呼びます。

### docker-compose upが何してるのさ

```docker-compose up```はdocker-composeを使ってイメージを元にソフトウェアを動かす際に用いるコマンドです。雑に言えば起動コマンドです。

イメージを元に起動した物をコンテナと呼びます。イメージとコンテナの関係は金型と生成物の関係に似ていますね。

*少しCUIに触れたことのある人「いや待てよ？```docker-compose up```以外に何か引数がないと、どんなイメージを元にコンテナを作ればいいのかわからないじゃないか！」*

いい質問ですねぇ。実際、docker-composeを使う時は特に引数は指定しません。
なのに```docker-compose up```だけで目的のコンテナ達が期待通りに動きます。

### 地獄からの使者、docker-compose.yml

docker-composeがどうやって起動するイメージを把握するのか。答えはdocker-composeを使うディレクトリにあります。

```docker-compose up```を使うと、使ったディレクトリにあるdocker-compose.ymlというファイルと、docker-compose.override.ymlという二つのファイルを(存在していれば)自動で読み取ります。

これらのファイルにどんなコンテナを動かせばいいのかが書いてあるという訳です。

優秀な点として、docker-compose.yml達にイメージの名前を書いておけば、例えイメージが手元になくても、イメージが必要になった段階で自動でダウンロートして来てくれます。

~~つまりdocker-compose.ymlさえ手に入れられれば、お手元のパソコンで希来里パイが動かせる。~~

### あなたはn人目の希来里パイです

ここまで読んできた読者、鋭い人なら気づくかもしれません。

*？？？「コンテナはイメージを元に起動するもの。つまり```docker-compose up```をする度にそれまでの記憶を失って希来里パイが発生する？なにそれエモい。」*

実際コンテナはデータの保存はしてくれません。イメージという金型を元に生み出される存在なので、```docker-compose down```という、作ったコンテナを削除するコマンドを実行すれば、彼女は電子の海に消えてしまいます……

**そうは問屋がおろしません！！**

Dockerはそういった点もきちんと考慮しています。コンテナはボリュームと言う、データを保管する為の場所を持てるようになっているのです。

このボリュームはどんなコンテナでも接続できるようになっているので、例え```docker-compose down```によりコンテナが消えたとしても、新しく生まれたコンテナがボリュームに再び接続することで、保管した大切な記憶が無事、次の希来里パイに引き継がれるという訳です。~~*「逆にエモいな？」*~~

## 強引にまとめ

これで今日から君も「docker-compose up完全に理解した[^1]」視聴者だ！！！

*筆者「```docker-compose up```について触れて欲しい機能、項目があればコメントいただければどんどん追記します。」*

[^1]: "完全に理解した"とはチュートリアルを流し読みしたレベルなので多分名乗っていいはず。

[0]:https://qiita.com/advent-calendar/2019/sfc-rg