【11】【Docker】バインドアウトとボリュームアウト
バインドアウトとボリュームアウトとはどのような意味でしょうか?
バインドアウト
バインドアウトディレクトリをマウントする方法をバインドアウトといいます。
ディレクトリのマウントの仕方はこの記事を参考にして下さい。
ボリュームアウト
ホスト上ではなく、DockerEngine上で確保した領域をマウントする方法をボリュームアウトといいます。
ボリュームアウトは、事前に作ったボリュームをマウントします。
(注意!dockerはボリュームアウトの際、指定したボリュームがなければ自動的にボリュームが作成されます)
ボリュームの主なコマンド
ボリュームの作成
docker volume create
ボリュームの一覧
docker volume ls
ボリュームの詳細表示
docker volume inspect
ボリュームの削除
docker volume rm
マウントされていないボリュームを全て削除
docker volume prune
AWSのS3ストレージをボリュームとして利用することも可能
ボリュームはデフォルトではDockerホスト上のストレージだが、AWSのS3ストレージを用いることも可能
ボリュームマウントの利点
ボリュームを使う利点はデータの保存先がDockerEngine上になるため、物理的な場所を確保する必要がない。
マウントする場所がどのホストでも同じなので、汎用的である。
バインドマウントとボリュームマウントの使い分け
汎用性はボリュームマウントだが、バインドマウントも利点がある。
バインドマントの方が良い場合
設定ファイルの受け渡し。
作業ディレクトリの変更を即座にDockerコンテナから参照したいとき。
ボリュームマウントが良い場合
データベースなどデータをブラックボックスとして扱う場合。
ブラックボックスとして扱うとは、ホスト上から安易に閲覧したり、書き換えたりできないデータを扱うことです。
実例:ボリュームマウントを使ってMySQLコンテナを作る。
MySQL8.0以降と、前のバージョンの違い
MySQL8.0以降から認証方法が変わった。この記事ではバージョン5.7でやる。
Dockerイメージを使う前のポイント
どのような使い方を想定しているか、ドキュメントから汲み取る。
各種設定はどのようにして行えばいいのか、ドキュメントから汲み取る。
MySQLの環境設定
MYSQL_ROOT_PASSWORD
MYSQL_DATABASE
MYSQL_USER
MYSQL_PASSWORD
MYSQL_ALLOW_EMPTY_PASSWORD
yesに設定すると、ルートパスワードが空欄にできる。
MYSQL_RANDOM_ROOT_PASSWORD
MYSQL_ONETIME_PASSWORD
yesにすると初回ログインした時に、パスワードの変更を要求される。
ボリュームの作成
docker volume create --name mysqlvolume
手順
コンテナ名をdb01にする
マウントの種類をvolume
マウント元をmysqlvolume
マウント先を/var/lib/mysql
rootユーザーのパスワードをmypasswordにする。
ルートユーザーのパスワードをMYSQL_ROOT_PASSWORDとして設定する
上記の手順のコマンド
docker run --name db01 -dit --mount type=volume,src=mysqlvolume,dst=/var/lib/mysql -e MYSQL_ROOT_PASSWORD=mypassword mysql:5.7
--mountオプション
現在、-vオプションよりも推奨されているオプション
src=mysqlvolumeを、
dst=/var/lib/mysqlにマウントする。
-e
-eオプションは環境変数の設定です。
ちなみに-vオプションを用いると以下のコマンドになります。
docker run --name db01 -dit -v mysqlvolume:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=mypassword mysql:5.7
-vオプションの注意点
-v mysqlvolume:/var/lib/mysqlと分かりにくい。
また、タイポなどしてボリューム名を間違えるとボリュームが新規作成される点があります。
よって、--mountオプションが推奨されています。
では、データベースに書き込んだ内容が破棄されてないことを確認してみましょう。
コンテナに入る
docker exec -it db01 /bin/bash
mysqlに接続する。
mysql -p
#データーベースの作成
CREATE DATABASE exampledb
#テーブルの作成
#exampledbデータベースに移動
use exampledb;
#テーブルの名前exampletable
CREATE TABLE exampletable (id INT NOT NULL AUTO_INCREMENT ,name VARCHAR(50),PRIMARY KEY(id));
#データの挿入
INSERT INTO exampletable (name) VALUES ('user01');
INSERT INTO exampletable (name) VALUES ('user02');
#データの確認
SELECT * FROM exampletable;
コンテナの破棄
docker stop db01
docker rm db01
マウントせずに新しいコンテナを作って確認
docker run --name db01 -dit -e MYSQL_ROOT_PASSWORD=mypassword mysql:5.7
上記のコマンドを使ってMySQLに接続すると、マウントしてないのであたり前ですが事前に作ったデータはありません。
マウントして再度コンテナを作り直してみましょう。
データが破棄されず残っています。
参考文献
さわって学ぶクラウドインフラ docker基礎からのコンテナ構築
最後に
私がブログを書く目的は、素晴らしい本や、素晴らしい方々の技術記事を知って頂きたいからです。ぜひ、上記の参考文献を見て下さい。(noteなので広告とかは一切ありません。)
現在、株式会社grabssに行くために最後の悪あがきをしています!!
現在の進行状況
この記事は11件目の投稿。目標まで後39件。
よろしければ、スキボタン及びサポートお願いします。勉強の励みになります。