0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Dockerでデータボリュームを再利用する方法

Last updated at Posted at 2024-06-18

はじめに

Docker ComposeでWordPressの環境を構築している際に、ディレクトリを移動するとデータボリュームの名前が変わってしまう問題に直面しました。以前のデータを再利用したいがために、この問題の解決方法について説明します。この記事はDocker初心者向けです。

目次

  1. 環境構築の概要と問題点
  2. データボリュームを再利用する手順
  3. 前のvolumeが使われなかった原因
  4. 改善案
  5. 参考文献

環境構築の概要と問題点

私たちが構築したWordPress環境のDocker Composeファイルは以下のような構成です。ディレクトリを移動すると、データボリュームの名前が変わってしまい、元のデータが参照できなくなる問題に直面しました。この問題を解決するために、既存のデータボリュームを新しいディレクトリで再利用する方法を紹介します。

services:
    db:
        platform: linux/x86_64
        image: mysql:5.7
        volumes:
            - "db_data:/var/lib/mysql"
        restart: always
        environment:
            MYSQL_ROOT_PASSWORD: somewordpress
            MYSQL_DATABASE: wordpress
            MYSQL_USER: wordpress
            MYSQL_PASSWORD: wordpress
    wordpress:
        depends_on:
            - "db"
        image: wordpress:latest
        ports:
            - "80:80"
        restart: always
        environment:
            WORDPRESS_DB_HOST: db:3306
            WORDPRESS_DB_USER: wordpress
            WORDPRESS_DB_PASSWORD: wordpress
            WORDPRESS_DEBUG: 1
        tty: true
        stdin_open: true
        volumes:
            - ./theme/:/var/www/html/wp-content/themes/something/
volumes:
    db_data:

データボリュームを再利用する手順

手順1: 元のディレクトリにあるボリュームデータを確認する

まず、現在のボリューム名を確認します。

docker volume ls

このコマンドは、システム上の全てのDockerボリュームをリストします。探しているボリュームはおそらくdirectory_name_db_dataのような名前になっています。

手順2: 元のボリュームデータをバックアップする

次に、元のボリュームデータをバックアップします。

docker run --rm -v directory_name_db_data:/volume -v $(pwd):/backup busybox tar cvf /backup/db_data_backup.tar /volume
  • docker run --rm: 一時的なコンテナを起動し、終了後に自動的に削除します。
  • -v directory_name_db_data:/volume: ボリュームdirectory_name_db_dataをコンテナの/volumeにマウントします。
  • -v $(pwd):/backup: 現在のディレクトリをコンテナの/backupにマウントします。
  • busybox: 軽量なLinuxベースのイメージを使用します。
  • tar cvf /backup/db_data_backup.tar /volume: /volumeの内容を/backup/db_data_backup.tarにバックアップします。

ここまで実行すると、ローカルのディレクトリdb_data_backup.tarというバックアップファイルができてることを確認してください。

手順3: 新しいディレクトリで同じボリューム名を指定する

新しいディレクトリのdocker-compose.ymlファイルで、元のボリューム名と同じ名前を指定します。

version: '3'
services:
  db:
    image: mysql:5.7
    volumes:
      - db_data:/var/lib/mysql
volumes:
  db_data:

手順4: 新しいディレクトリで同じボリューム名を作成する

新しいディレクトリでDockerボリュームを作成します。

docker volume create --name={新しいディレクトリ名}_db_data

手順5: バックアップデータを新しいボリュームに復元する

次に、バックアップデータを新しいボリュームに復元します。

docker run --rm -v {新しいディレクトリ名}_db_data:/volume -v $(pwd):/backup busybox tar xvf /backup/db_data_backup.tar -C /volume --strip 1
  • tar xvf /backup/db_data_backup.tar -C /volume --strip 1: /backup/db_data_backup.tar/volumeに復元します。--strip 1は、アーカイブ内の最上位ディレクトリを削除します。

手順6: 新しいディレクトリでコンテナを起動する

最後に、新しいディレクトリでdocker-compose upコマンドを実行して、コンテナを起動します。

docker-compose up

これにより、新しいディレクトリで定義されたDocker Compose設定に従ってコンテナが起動し、元のデータボリュームが使用されます。

前のvolumeが使われなかった原因

今回の問題は、プロジェクト名を変更することでボリューム名が変わってしまうことに起因していました。

ボリューム名が決まる順序

  1. name要素が指定されている場合、その名前が使用されます。
  2. name要素が指定されていない場合、{project_name}_{key_name}という形式でボリューム名が決定されます。

プロジェクト名が決まる順序

  1. コマンドラインの-p (--project-name)オプションで指定された値。
  2. COMPOSE_PROJECT_NAME環境変数の値。
  3. Composeファイル内のnameトップレベル要素の値。
  4. 複数のComposeファイルが指定された場合、最後のnameトップレベル要素の値。
  5. Composeファイルを含むディレクトリ名。
  6. 複数のComposeファイルが指定された場合、最初のComposeファイルがあるディレクトリ名。
  7. 現在のディレクトリ名。

今回は、name要素を指定していなかったため、{project_name}が使用されました。そして、{project_name}はComposeファイルのディレクトリ名から決定されたため、ディレクトリの移動によりプロジェクト名が変わり、ボリューム名も変わってしまったのです。

改善案

これから新たにプロジェクトを開始する場合は、ボリューム名を固定することをお勧めします。

以下のようにvolumesトップレベル要素でボリューム名を指定することで、ディレクトリを移動してもボリューム名が変わらず、データを再利用できます。

volumes:
  data:
    name: "my-app-data"

参考文献

0
1
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?