はじめに
Dockerを根本的・体系的に理解するために、このシリーズを書き始めました。
Docker理解への道① ~Makefile / docker compose編~
Docker理解への道② 〜docker-compose.ymlの徹底的な理解〜
Docker理解への道③ 〜docker-compose.ymlのimageとbuildについて〜
いきなりDockerそのものを理解するのではなく、理解しやすいものから学習していくつもりです。
前回イメージとビルドについて学んだことで、複数のコンテナを管理するためのCLIツール、Docker Composeについての想像ができるようになってきました。
とはいえ、第2回でdocker-compose.ymlファイルの基本的な構造について触れましたが、ふわっとしたまま残っているのが2箇所あったので今日はそこについて明確化したいと思います。
それが、ボリュームとネットワークです。
第2回ではこのような書き方をしました。
networks:
myapp-network: # 任意のネットワーク名
driver: bridge # 同じPC内でコンテナ間をつなぐ(その他にもPC間を繋ぐoverlayなど)
# ボリューム:コンテナを消してもデータが残る保存場所
volumes:
mysql-data: # 任意のボリューム名(例:データベースのデータ用)
app-logs: # 任意のボリューム名(例:アプリのログファイル用)
mysql: # コンテナ名
— 省略 —
networks:
- myapp-network
volumes:
- mysql-data:/var/lib/mysql # MySQLのデータ本体
- ./init.sql:/docker-entrypoint-initdb.d/init.sql # 初回起動時に実行されるSQL
もう一読み直して改めて理解できている点、できていない点、整理してみました。
理解できた点:
-
ネットワークでは、その名の通りDocker内でコンテナ間を繋ぐネットワークの設定を定義できて、driverで種類が定義できる。
-
ボリュームでは、コンテナを消してもデータが残る場所の設定ができる。
理解できていない点:
-
ネットワークの生成元は?
-
ボリューム使用時、コンテナが消えた時、データ(ここでいうとmysql-data)はどこに残るの?
-
というかデータの保管場所がコンテナ内外の2箇所存在するってこと?
よくよく考えるとまだ疑問点は残っていたので、解消してみた。それぞれ調べた結果、こういうことだった。
-
Dockerデーモン(バックグラウンドで常に稼働し、特定のサービスや機能を提供するプログラム)が仮想ネットワークを生成している。
-
データ保管場所はホストPC上にある。
-
まず、ボリュームを使用しない場合は、Dockerイメージの上に書き込み可能なレイヤーが作られます。そしてデータはそこに保管されますが、コンテナ削除とともにデータも削除されます。
反対にボリュームを使用した場合は、コンテナが起動された際、コンテナ内のパス(上の例だと/var/lib/mysql)がホストOS上の物理的に存在するディレクトリに置き換えられます。そして、データの読み書きはそのホストOS上のディレクトリと直接行われます。
docker-compose.ymlのネットワークとボリュームについて理解したことで、ふわっと理解していた部分がなくなりました。