こんにちは
今回は前回書いた記事を参考にして、別のVMへデータ移行をしてみたのでその手順を残しておきます
【Docker】docker-composeを利用してVM上に独自ドメインでWebサイトを公開する
■環境
プラットフォーム:Vagrant
OS:LamaLinux9
VM1:dockertest(192.168.33.95)
VM2:dockertest02(192.168.33.96)
Web構成:Nginx + PHP-FPM + MySQL
ドメイン:www.example.com
■ゴール
1. gitからDocker関連のファイルを含めたソースコードをVM2へ落としてくる
2. VM1上でMySQLのダンプを取得し、VM2上で取得したダンプをインポートする
3. 動作確認
■手順
1. 事前準備
・VM2上にgit, docker, docker-compose をインストールする
参考手順:【Docker】docker-composeを利用してVM上に独自ドメインでWebサイトを公開する
・コンテナの起動確認(VM1)
[root@dockertest nginx_php-fpm_mysql_docker]# docker container ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES e0a458df6eef nginx_php-fpm_mysql_docker-web01 "/docker-entrypoint.…" About an hour ago Up About an hour 0.0.0.0:80->80/tcp, [::]:80->80/tcp web01-container d243e8a48974 nginx_php-fpm_mysql_docker-app01 "docker-php-entrypoi…" About an hour ago Up About an hour 0.0.0.0:9000->9000/tcp, [::]:9000->9000/tcp app01-container b9e23f31c5bc nginx_php-fpm_mysql_docker-db01 "docker-entrypoint.s…" About an hour ago Up About an hour 33060/tcp, 0.0.0.0:3307->3306/tcp, [::]:3307->3306/tcp db01-container
→ 起動していることを確認する
・コンテナの起動確認(VM2)
[root@dockertest02 ~]# docker container ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
→ 何も起動していないことを確認する
2. gitからソースコード一式を落としてくる (VM2)
git clone [GitレポジトリURL]
3. sqlファイルの修正(VM2)
vi db/sql/init.sql
CREATE DATABASE test_db; CREATE TABLE test_db.users (id INT AUTO_INCREMENT NOT NULL PRIMARY KEY, name VARCHAR(50) NOT NULL);
→ 移行前がわかりやすいようにスキーマとテーブルの作成までにしています
4. docker-compose の起動(VM2)
・ Dockerファイルのビルド
docker-compose build --no-cache
・起動
docker-compose up -d
・起動確認
docker container ps -a
→ 下記のようにコンテナが起動していることを確認する
[root@dockertest02 nginx_php-fpm_mysql_docker]# docker container ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES dc5850f210b7 nginx_php-fpm_mysql_docker-web01 "/docker-entrypoint.…" 58 seconds ago Up 53 seconds 0.0.0.0:80->80/tcp, [::]:80->80/tcp web01-container 342b517697fc nginx_php-fpm_mysql_docker-app01 "docker-php-entrypoi…" 59 seconds ago Up 56 seconds 0.0.0.0:9000->9000/tcp, [::]:9000->9000/tcp app01-container ae203187532e nginx_php-fpm_mysql_docker-db01 "docker-entrypoint.s…" 59 seconds ago Up 56 seconds 33060/tcp, 0.0.0.0:3307->3306/tcp, [::]:3307->3306/tcp db01-container
5. VM2のコンテンツ確認
・ローカルのhostsファイルで名前解決
192.168.33.96 www.example.com
・ブラウザからアクセス
http://www.example.com/
→ユーザーが表示されていないことを確認する(※dockertest02がわかりやすいようにしています)
6. ダンプの取得(VM1)
・コンテナ名の確認
docker container ps -a
→ DBコンテナの名前かコンテナIDを控える
docker container exec b9e23f31c5bc mysqldump -u root -pTesttest991! --single-transaction --all-databases | gzip > dump.sql.gz
→ –single-transaction オプションを利用することでテーブルをロックせずにオンラインでダンプを取得し、パイプでgzipに渡すことで圧縮しています
7. ダンプファイルの転送(VM1, VM2)
scpなどを利用してVM1で取得したダンプファイルをVM2へ転送する
8. ダンプファイルのインポート(VM2)
zcat dump.sql.gz | docker exec -i ae203187532e mysql -u root -pTesttest991! test_db
→ -i のオプションは必須であり、それなしではパイプで標準入力からのデータを読み込めないので、入力が空として扱われます
9. コンテンツ確認(VM2)
→ VM2 のコンテンツでユーザーが移行されていることを確認する
■まとめ
いかがでしたでしょうか?
個人的にはVMのみを利用したデータ移行よりも簡単に感じました!
ただ、ダンプデータのインポートで -i のオプションが必須なことを知らず、そこははまったので覚えておこうと思います

