Dockerで起動したMySQLのデータを永続化する
上の記事で作った環境で、MySQLのデータを永続化してみることにしました
ホストマシンのディレクトリをマウントするケースと、Volume用のコンテナを作るケースがあるようですが、今回はData Volumes Containerを作る形でやってみました
今どうなっているか
$ docker-compose run web rails c Loading development environment (Rails 5.0.0) irb(main):001:0> Article.all Article Load (0.6ms) SELECT `articles`.* FROM `articles` => #<ActiveRecord::Relation [#<Article id: 1, title: "タイトル", body: "記事書くよ!ほげほげっ", created_at: "2016-11-18 01:48:16", updated_at: "2016-11-18 01:48:16">]
前回の記事でデータを1件投入したので上記のような状態になってます
この状態だと、dbのコンテナを削除したときデータも一緒に消えてしまうのでデータを永続化するための作業を行いました
Data Volume Containerを使う
docker-compose.yml
version: '2' services: db_data: image: busybox volumes: - /var/lib/mysql db: image: mysql:5.7 volumes_from: - db_data environment: MYSQL_ROOT_PASSWORD: testpassword web: build: . command: bundle exec rails s -p 3000 -b '0.0.0.0' volumes: - .:/myapp ports: - "3000:3000" depends_on: - db
db_dataを新たに追加。imageは、ボリュームコンテナに使われることが多いらしいbusyboxという軽量コンテナにしました。
同時に、dbからvolumeを参照するような記載を追加。
とりあえず起動してみる
$ docker-compose up Pulling db_data (busybox:latest)... latest: Pulling from library/busybox 56bec22e3559: Pull complete Digest: sha256:29f5d56d12684887bdfa50dcd29fc31eea4aaf4ad3bec43daf19026a7ce69912 Status: Downloaded newer image for busybox:latest Creating dockertest_db_data_1 Recreating dockertest_db_1 Recreating dockertest_web_1 Attaching to dockertest_db_data_1, dockertest_db_1, dockertest_web_1
busyboxをpullしてきて作業が始まりました
起動後、ブラウザで確認するとNo Database Errorが発生するものの環境としては起動できている模様。
データが永続化されるかどうか確認
まずは、上記このエントリと同じ状態になるように作業します
DBのデータが全部消えているので、db:createとdb:migrateを実行して環境を起動します
$ docker-compose run web rake db:create Starting dockertest_db_data_1 Starting dockertest_db_1 Created database 'myapp_development' Created database 'myapp_test' $ docker-compose run web rails db:migrate Starting dockertest_db_data_1 Starting dockertest_db_1 == 20161118014602 CreateArticles: migrating =================================== -- create_table(:articles) -> 0.0924s == 20161118014602 CreateArticles: migrated (0.0926s) ========================== $ docker-compose up
データ投入前と同じ状態まで来ました(∩´∀`)∩ワーイ
データを入れてみる
ではこの状況でデータ投入してみます。
データが入りました。
コンテナを消して再度環境構築
busybox以外のコンテナを削除してみる
$ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 7957ee0b3d4f dockertest_web "bundle exec rails s " 8 minutes ago Exited (0) 3 minutes ago dockertest_web_1 1d930cff1d1c mysql:5.7 "docker-entrypoint.sh" 8 minutes ago Exited (0) 3 minutes ago dockertest_db_1 d809d6958d2c busybox "sh" 9 minutes ago Exited (0) 3 minutes ago dockertest_db_data_1 $ docker rm 7957ee0b3d4f 1d930cff1d1c $ docker-compose up
データ残ってました。
追記
なんかもうちょっとスマートな手順無いものかと思いつつ、とりあえず共有しておきますね