スポンサーリンク

DockerのMySQLのボリュームをホストOSでの共有ディレクトリ以下に配置したらコンテナを起動出来なかった

Web系

未だにWindowsにおけるローカルの開発用サーバーとしてXAMPPを使うことがあるのですが、そろそろDockerに移行したいという思いがありました。今回、実際に環境を構築した際に掲題の件でつまづきましので、ここに対処法について記載しておきます。

環境の構築

Windows 10にインストールしたVirtualBoxでUbuntu 18 LTSを起動し、UbuntuにDockerをインストールして起動しています。

ディレクトリ構造やDocker関連の各種設定ファイルは下記記事を参考にさせて頂きました。

xampp と同様のLAMP環境を Docker で構築する
GitHubにアップしてある Docker-LAMP をローカルにダウンロードして docker-compose コマンドを実行すると xampp 同様の環境を構築することができます。具体的にはweb

Vagrantfile

Vagrant.configure("2") do |config|
# The most common configuration options are documented and commented below.
# For a complete reference, please see the online documentation at
# https://docs.vagrantup.com.

config.vm.hostname = "docker-dev.test"
config.vm.box = "ubuntu/bionic64"
config.vm.network "private_network", ip: "192.168.33.99"
config.vm.synced_folder ".", "/home/vagrant/working"
config.vm.provision "docker"
config.vm.provision :docker_compose, run: "always"
config.vm.provider "virtualbox" do |vb|
# Display the VirtualBox GUI when booting the machine
vb.gui = false

# Customize the amount of memory on the VM:
vb.memory = "2048"
end
end

仮想OS(Ubuntu)ディレクトリ構造

/home/vagrant/working/hoge/ ※ホストOSとの共有ディレクトリに作成したhogeディレクトリ
– docker-compose.yml
– [_docker]
 - [db]
  - [my.cnf]
   - my.cnf
 - [nginx]
  - default.conf
 - [php]
  - Dockerfile
  - php.ini
 - [phpmyadmin]
  - [sessions]
 - [public]
  - index.html

docker-compose.yml

version: '3'

services:

  # PHP
  php:
    # image: php:7.4-fpm
    container_name: php
    build: ./_docker/php
    depends_on:
    - db
    volumes:
    - ./public:/var/www/html
    - ./_docker/php/php.ini:/usr/local/etc/php/php.ini

  # nginx
  nginx:
    image: nginx
    container_name: nginx
    depends_on:
    - php
    ports:
    - 8080:80
    volumes:
    - ./_docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
    - ./public:/var/www/html
    - ./public:/usr/share/nginx/html

  # mysql
  db:
    image: mysql
    # container_name: mysql
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: docker_db
      MYSQL_USER: docker_user
      MYSQL_PASSWORD: docker_pass
    ports:
    - 3306:3306
    volumes:
    - ./_docker/db/data:/var/lib/mysql
    - ./_docker/db/my.cnf:/etc/mysql/conf.d/my.cnf

  # phpmyadmin
  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    # container_name: phpmyadmin
    depends_on:
    - db
    environment:
    - PMA_ARBITRARY=1
    - PMA_HOSTS=db
    - PMA_USER=docker_user
    - PMA_PASSWORD=docker_pass
    ports:
    - 3000:80
    volumes:
    - ./_docker/phpmyadmin/sessions:/sessions

my.cnf

[mysqld]
default_authentication_plugin=mysql_native_password

default.conf

server {
  listen 80;
    root /var/www/html;
    index index.php index.html;

  location / {
    try_files $uri $uri/ /index.php$is_args$args;
  }

  location ~ \.php$ {
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass   php:9000;
    fastcgi_index  index.php;
    include        fastcgi_params;
    fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param  PATH_INFO $fastcgi_path_info;
  }
 }

Dockerfile

FROM php:7.4-fpm

RUN apt-get update \
    && docker-php-ext-install pdo_mysql

php.ini

[Date]
date.timezone = "Asia/Tokyo"
[mbstring]
mbstring.internal_encoding = "UTF-8"
mbstring.language = "Japanese"

起動

$ docker-compose up -d

問題の対処

前述の設定だとエラーで起動出来ませんでした。試行錯誤の結果、MySQLのDockerのボリューム保存場所を、ホストOSとの共有ディレクトリではない仮想OS内からのみ参照可能なディレクトリに指定することで、問題は解消されました。

docker-compose.yml

    # - ./_docker/db/data:/var/lib/mysql
    - ../../_docker_db_vol/db/data:/var/lib/mysql

※ディレクトリ”/home/vagrant/_docker_db_vol/db/ を作成しておきます