MySQLデータを永続化するコンテナを作る

MySQLデータを永続化する時の問題点

  • 公式のMySQLイメージはMySQLデータをDockerのデータボリュームに保存する
  • したがって、コンテナをコミットしてもイメージにMySQLデータは含まれない
  • ここではデータボリュームを使わずに、イメージに保存できるようにする

1. 公式MySQLイメージのカスタマイズ

1.1 Dockerfileの作成

 FROM mysql:latest
 RUN cp -r /var/lib/mysql /var/lib/mysql-no-volume
 RUN sed -i -e "s|/var/lib/mysql|/var/lib/mysql-no-volume|" /etc/mysql/my.cnf
  • 適当なディレクトリで上の内容でDockerfileを作成する

1.2 Dockerfileのビルド

 $ docker build . -t my-mysql
  • Dockerfileからmy-mysqlイメージをビルドする

2. カスタマイズしたコンテナの起動とテストデータをDBに保存

2.1 コンテナの起動

 docker run --name test-mysql -e MYSQL_ROOT_PASSWORD=root -it my-mysql

2.2 MySQLにDB作成、テストデータを保存

 docker exec test-mysql mysql -u root --password=root mysql -e "create database test_db"
 docker exec test-mysql mysql -u root --password=root test_db -e "create table t1 (id int); insert into t1 values (100)"

2.3 コンテナを再起動し、コンテナ内に保存されたデータの確認

 docker stop test-mysql
 docker start test-mysql
 docker exec -it test-mysql mysql -u root --password=root test_db -e "select * from t1"

3. カスタマイズしてデータ保存したコンテナからイメージを作成

3.1 カスタマイズしてデータが保存されたコンテナからイメージを作成

 docker commit test-mysql my-mysql

3.2 作成したイメージをDockerHubにPUSH

 docker login
 docker tag my-mysql [DOCKERHUB_USERNAME]/my-mysql
 docker push [DOCKERHUB_USERNAME]/my-mysql

3.3 確認のため、ローカルのコンテナ、イメージを削除

 docker rm -f test-mysql
 docker rmi my-mysql

3.4 DockerHubにPUSHしたイメージをPULLしてコンテナ起動

 docker run --name test-mysql -it [DOCKERHUB_USERNAME]/my-mysql

3.5 DockerHubからPULLしたイメージに保存されたデータがあることを確認

 docker exec -it test-mysql mysql -u root --password=root test_db -e "select * from t1"

参考

https://stackoverflow.com/questions/30740828/commit-data-in-a-mysql-container


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS

Last-modified: 2021-06-06 (日) 08:19:10