茶番①(まえがき)
の:わーデータ消えてるどうしよー(´;ω;`)
ど:どうしたんだいのび田くん
の:どらエモーン聞いてよ、昨日DockerでMySQLの環境構築してデータつっこんだんだけど、 コンテナをつくりかえたらデータが全部消えちゃってたんだー
ど:どうやって環境構築したんだい?
の:これを見ながらつくったんだ
ど:どれどれ(._.)・・・ あーこれだとそうなっちゃうよのび田くん
の:どうして消えちゃうのさー
ど:それはね・・・
ちょっと解説
まずこの前の記事で構築した環境は
雑な図ですがこんな感じなのでコンテナを作りかえると中にあるデータも一緒に消えてしまうみたいです・・・
じゃあどうすりゃいいのさ
データ部分を外に出してそれ用のコンテナを作成すればいいらしい
つまり・・・
雑な図ですがこんな感じの環境を構築できればOK
茶番②
ど:ってことなんだよ
の:なるほどー データを持ってるコンテナを別で作ってあげてそこを見るようにしたら、なんかしない限りずっとデータを持つことができるってことなのね
ど:そういうこと
の:じゃあどうすればそんな素敵な環境を実現できるのどらエモン?
ど:それはね・・・
ちょっと解説
※ここからはこの記事など参考にさせていただいたものを実際にやったことをダラダラ書いただけなのでなにも目新しいことはないです。
# nameで命名したものかCONTAINER IDからDataVolumeの場所を調べる
$ docker inspect 77319140c16d
"Mounts": [
{
"Type": "volume",
"Name": "d25c072ffc8b3df0ee69dca1e7c9474182bc6f81246e350532a466670b4f5c68",
"Source": "/var/lib/docker/volumes/d25c072ffc8b3df0ee69dca1e7c9474182bc6f81246e350532a466670b4f5c68/_data",
"Destination": "/var/lib/mysql",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
],
"Destination": "/var/lib/mysql",
とあるので↓の通りに実行
# データを格納専用のコンテナで -v でディレクトリ指定
# busyboxという軽量なコンテナを使用
$ docker run -d --name storage -v /var/lib/mysql busybox
# ↑で作成したコンテナを参照するように--volumes-from で指定する
$ docker run -d --volumes-from storage -e MYSQL_ROOT_PASSWORD=mysql --name mysql mysql:8.0
# MySQLを実行する
$ docker exec -it mysql bash
$ mysql -h 127.0.0.1 --port 3306 -u root -p mysql
# データを諸々INSERTしてから照会
mysql> select * from todo.tasks;
+----+------------+------------+---------------------+---------------------+
| id | title | body | created_at | updated_at |
+----+------------+------------+---------------------+---------------------+
| 1 | First task | test data1 | 2019-03-28 01:29:00 | 2019-03-28 01:29:00 |
+----+------------+------------+---------------------+---------------------+
1 row in set (0.00 sec)
# この状態でMySQLのコンテナを再作成してまた照会
$ docker stop mysql
mysql
$ docker rm mysql
mysql
$ docker run -d --volumes-from storage -e MYSQL_ROOT_PASSWORD=mysql --name mysql mysql:8.0
# MySQLを実行する
$ docker exec -it mysql bash
$ mysql -h 127.0.0.1 --port 3306 -u root -p mysql
mysql> select * from todo.tasks;
+----+------------+------------+---------------------+---------------------+
| id | title | body | created_at | updated_at |
+----+------------+------------+---------------------+---------------------+
| 1 | First task | test data1 | 2019-03-28 01:29:00 | 2019-03-28 01:29:00 |
+----+------------+------------+---------------------+---------------------+
1 row in set (0.00 sec)
コンテナを再作成してもデータが残ってます(*'▽')
茶番③
ど:ってやればOKだよ
の:ほんとだデータが消えてない!
ど:ただデータ用のコンテナが出来たからって、いろんな環境にデータを持っていけるってわけじゃないから注意しないといけないよ。
※ここに詳しいことが書いてあります(ありがてー)
の:じゃあこれでばっちりだね
ど:そうでもないかもよ・・・
の:え?
あとがき
昨日の記事公開後にアドバイスをもらったので記事を書いてみました。
ほとんどほかの方が書いてくださった素晴らしい記事のまんまですがどっか間違ってるところがあるかもです。
コメントとかで指摘いただけると幸いです。
※記事中のどらエモンとのび田くんはあのドラえもんとは無関係です。
次回予告
のび田 「docker-compose」を覚える
駆け出しエンジニアからエキスパートまで全ての方々のアウトプットを歓迎しております!
0件のコメント