ログってなんぼ

エンジニアのメモです

Dockerで起動したMySQLのデータを永続化する

okisanjp.hatenablog.jp

上の記事で作った環境で、MySQLのデータを永続化してみることにしました

docs.docker.com

ホストマシンのディレクトリをマウントするケースと、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が発生するものの環境としては起動できている模様。

データが永続化されるかどうか確認

okisanjp.hatenablog.jp

まずは、上記このエントリと同じ状態になるように作業します

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

f:id:Okisanjp:20161118112211p:plain

データ投入前と同じ状態まで来ました(∩´∀`)∩ワーイ

データを入れてみる

ではこの状況でデータ投入してみます。

f:id:Okisanjp:20161118113210p:plain

データが入りました。

コンテナを消して再度環境構築

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

f:id:Okisanjp:20161118113301p:plain

データ残ってました。

追記

なんかもうちょっとスマートな手順無いものかと思いつつ、とりあえず共有しておきますね

github.com