Контейнер MariaDB Docker, использующий объем данных - Ошибка 2002, не удается подключиться через сокет - PullRequest
0 голосов
/ 16 января 2019

Я установил MariaDB в контейнер Docker, и он работал просто отлично. Я хотел переместить каталог данных на внешний том, чтобы отделить базы данных от жизненного цикла контейнера. Я следовал инструкциям здесь , но когда я сейчас пытаюсь подключиться к двигателю, я получаю:

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/www/databases/mysqld/mysqld.sock' (2)

"/ var / www /" - это точка монтирования внешнего тома. Мне было интересно, было ли это разрешением, поэтому я установил для владельца папки базы данных в контейнере MariaDB «myqsl», имя учетной записи MySQL.

drwxr-xr-x 3 mysql mysql 4096 Jan 15 16:38 databases
drwxr-xr-x 3  1000  1000 4096 Jan 15 13:59 files
drwxr-xr-x 2  1000  1000 4096 Jan 15 15:20 html
drwxr-xr-x 3  1000  1000 4096 Jan 15 13:59 src

Примечание: в файловой системе хоста владелец указан как 999: docker. Имеет ли это значение ??

drwxr-xr-x 3       999 docker    4096 Jan 15 16:38 databases

Чего мне не хватает, чтобы позволить мне хранить свои базы данных в томе?

Вот частичный дамп моего файла /etc/MySQL/my.cnf (бит, который определяет различные папки):

[client]
port            = 3306
#socket         = /var/run/mysqld/mysqld.sock
socket          = /var/www/databases/mysqld/mysqld.sock

# Here is entries for some specific programs
# The following values assume you have at least 32M ram

# This was formally known as [safe_mysqld]. Both versions are currently parsed.
[mysqld_safe]
#socket         = /var/run/mysqld/mysqld.sock
socket          = /var/www/databases/mysqld/mysqld.sock
nice            = 0

[mysqld]
#
# * Basic Settings
#
#user           = mysql
pid-file        = /var/run/mysqld/mysqld.pid
#socket         = /var/run/mysqld/mysqld.sock
socket          = /var/www/databases/mysqld/mysqld.sock
port            = 3306
basedir         = /usr
#datadir                = /var/lib/mysql
datadir         = /var/www/databases
tmpdir          = /tmp
lc_messages_dir = /usr/share/mysql
lc_messages     = en_US
skip-external-locking

докер-compose.yml:

Вот содержимое моего файла yml. Я новичок в этом деле, так что, вероятно, он полон дыр. Пожалуйста, будь добр. :)

version: '3.2'
volumes:
  mwApache2Data:
    external: true
  webContent:
    external: true

networks:
  frontend:
  backend:

services:
  php:
    build: './php7.1/'
    image: php7.1.26-fpm:1.0
    restart: always
    container_name: php7.1.26-fpm
    networks:
      - backend
#    volumes:
#      - mwApache2Data:/app
  web:
    build: ./apache2/
    image: apache2:1.0
    restart: always
    container_name: AOW_apache2Server
    depends_on:
      - php
      - mariadb
    networks:
      - frontend
      - backend
    expose:
     - "80"
     - "81"
     - "443"
     - "8083"
    ports:
     - "80:80"
     - "81:81"
     - "443:443"
     - "8083:8083"
    volumes:
      - mwApache2Data:/app
      - webContent:/var/www
  mariadb:
    build: ./mariaDB/
    image: mariadb_10.4.0
    container_name: mariaDB_10.4.0
    restart: always
    networks:
      - backend
    environment:
      - MYSQL_DATABASE=lg_wiki_db
      - MYSQL_USER=wikiuser
      - MYSQL_PASSWORD=****
      - MYSQL_ROOT_PASSWORD=****
    volumes:
      - webContent:/var/www
  mediawiki:
    image: mediawiki:1.31.1
    container_name: mediawiki_1.31.1
    restart: always
    depends_on:
      - web
    networks:
      - backend
#    ports:
 #     - 8080:80
    links:
      - mariadb
    volumes:
      - webContent:/var/www/
      # After initial setup, download LocalSettings.php to the same directory as
      # this yaml and uncomment the following line and use compose to restart
      # the mediawiki service
      # - ./LocalSettings.php:/var/www/html/LocalSettings.php
  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    container_name: phpmyadmin
    restart: always
    depends_on:
      - web
    expose:
      - 80
    networks:
      - frontend
      - backend
    ports:
      - 8080:80
    links:
      - mariadb

Ответы [ 2 ]

0 голосов
/ 31 января 2019

Спасибо всем за ваш совет. В конце концов я нашел некоторую поддержку в этом вопросе.

Хитрость заключалась в том, чтобы подключить папку базы данных по умолчанию в качестве внешнего тома:

volumes:
  - databases:/var/lib/mysql

Это в основном сработало. Единственным предупреждением было то, что мой файл compose определил корневые учетные данные MySQL. Они были перезаписаны, когда монтировалось, поэтому мне пришлось вручную сбросить пароль root при первом запуске контейнера. На самом деле это должно быть исправлено, поскольку каталог данных теперь является внешним по отношению к тому, поэтому новый образ должен получить тот же пароль root. Должно быть в состоянии записать это изменение в установочные файлы.

0 голосов
/ 16 января 2019

Вы пробовали монтировать том / var / www / database в вашем docker-compose? Следуя приведенному вами примеру, я должен предложить:

  ...
  mysql:
    image: mysql:5.6.40
    networks:
      - backend
    environment:
      - MYSQL_ROOT_PASSWORD=rootpassword
    volumes:
      - ./your_persistent_db_data_dir:/var/www/databases

Еще одна вещь, которую следует учитывать, это проблема сети. В этом случае я должен попытаться разделить докерскую сеть между всеми ними, добавив network_mode: host к каждой отдельной услуге, с которой вы хотите общаться между ними. Здесь`

Наконец, еще одна вещь, которую я бы попробовал, если ничего из этого не поможет вам, - попытаться установить MariaDB на вашем хосте и смонтировать файл /var/www/databases/mysqld/mysqld.sock в качестве тома. Это не рекомендуется, не очень элегантно и, более того, цель состоит в том, чтобы БД находилась в докере с постоянными данными снаружи, я знаю.

...