【Docker】docker-composeで公開しているサイトでデータ移行を試してみる

こんにちは

今回は前回書いた記事を参考にして、別の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 のオプションが必須なことを知らず、そこははまったので覚えておこうと思います

 

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA