Форум программистов, компьютерный форум, киберфорум
Наши страницы
Mysterious Light
Войти
Регистрация
Восстановить пароль
Оценить эту запись

Docker: доступ к MySql-контейнеру

Запись от Mysterious Light размещена 12.05.2019 в 20:34
Обновил(-а) Mysterious Light 12.05.2019 в 20:38
Метки docker, mysql

Вот начал изучать докер.
Для начала взял такую задачу: создать два контейнера с mysql и, например, php, и получить доступ через mysql из второго контейнера.
Посмотрим, какие могут возникнуть ошибки и как они могут быть устранены.

Предполагается, что пользователь MySql сервера root с паролем ps. Директория db в начальный момент пуста или не существует.

Структура директории, в которой производятся все манипуляции:
Bash
1
2
3
4
5
6
7
8
2c-copy
|-- docker-compose.yml
|-- db
|-- mysql
|   |-- dockerfile
|   |-- my.cnf
|-- php
    |-- dockerfile
Набросок docker-compose файла:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
version: "3.7"
services:
  mysql:
    build: ./mysql
    networks:
      inet: {}
    volumes:
      - ./db:/var/lib/mysql
    tmpfs:
      - /tmp
    environment:
      - MYSQL_ROOT_PASSWORD=ps
  php:
    build: ./php
    volumes:
      - /disk/JurInfoR/portal/portal/public_html:/var/www/html
    networks:
      inet: {}
    depends_on:
      - mysql
    environment:
      DB_HOST: mysql
      PMA_PORT: 3306
    links:
      - mysql
networks:
  inet: {}
Образы:
Bash
1
2
3
4
5
6
7
# mysql/dockerfile
FROM mysql/mysql-server:5.6
COPY ./my.cnf /etc/my.cnf
 
# php/dockerfile
FROM php:5.6-fpm
RUN apt-get update && apt-get install -y mysql-client && docker-php-ext-install mysql
Файл my.cnf
Bash
1
2
3
4
5
6
7
8
9
10
11
[mysqld]
skip-host-cache
skip-name-resolve
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
secure-file-priv=/var/lib/mysql-files
user=mysql
symbolic-links=0
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
bind-address = 0.0.0.0
Отмечу, что файл my.cnf стандартный для mysql, только в конец добавлена строка bind-address = 0.0.0.0

Проверяем:
Bash
1
2
3
4
5
$ docker-compose up --build --detach
[ ... ]
$ docker exec -it 2c-copy_php_1 mysql -uroot -p
Enter password: ps
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2 "No such file or directory")
Действительно, мы же не указали хост:
Bash
1
2
3
$ docker exec -it 2c-copy_php_1 mysql -hmysql -uroot -p
Enter password: ps
ERROR 1130 (HY000): Host '172.25.0.3' is not allowed to connect to this MySQL server
Теперь проблема в MySql: сервер не разрешает работу с контейнером 2c-copy_php_1.
Исправляем:
Bash
1
2
3
4
5
6
7
8
9
$ docker exec -it 2c-copy_mysql_1 mysql -uroot -p
Enter password: ps
[ ... ]
 
mysql> CREATE USER 'root'@'%' IDENTIFIED BY 'ps'; GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'; FLUSH PRIVILEGES;
[ ... ]
 
mysql> exit
Bye
Проверяем:
Bash
1
2
3
4
5
$ docker exec -it 2c-copy_php_1 mysql -hmysql -uroot -p
Enter password: ps
[ ... ]
 
MySQL [(none)]>
Как видим, подключение работает.

https://stackoverflow.com/questions/...s-mysql-server

Замечания:
1. В том же вопросе SO предлагается решить проблему доступа строкой bind-address = 0.0.0.0 в my.cnf. Как я показал, сама по себе эта строка в конфиге ни на что не влияет. Таким образом, конфигурационный файл можно было не менять в образе mysql.
2. При первом запуске и проведённых манипуляциях директория db создастся и заполнится файлами MySql. При повторном запуске настройки сохранятся:
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$ docker-compose down
Stopping 2c-copy_php_1   ... done
Stopping 2c-copy_mysql_1 ... done
Removing 2c-copy_php_1   ... done
Removing 2c-copy_mysql_1 ... done
Removing network 2c-copy_inet
 
$ docker-compose up --build --detach
[ ... ]
Creating 2c-copy_mysql_1 ... done
Creating 2c-copy_php_1   ... done
 
$ docker exec -it 2c-copy_php_1 mysql -hmysql -uroot -p
Enter password: ps
[ ... ]
 
MySQL [(none)]>
Размещено в Без категории
Просмотров 193 Комментарии 3
Всего комментариев 3
Комментарии
  1. Старый комментарий
    Аватар для Rius
    Цитата:
    Директория db в начальный момент пуста или не существует.
    Директорию db по хорошему надо размещать на отдельном volume, монтируемом к контейнеру. Потому что при хранении в файловой системе хоста права доступа будут не пойми какие.

    Не очевидная проблема, которую никто не упоминает в мануалах:
    Код:
    services:
      mysql:
        ...
      php:
        depends_on:
          - mysql
    mysql выступает записью в некоем dns, используемом в сети docker. При наличии несколько таких проектов с одноименными контейнерами ("mysql"), контейнер, обращающийся по этому имени, будет стучатся к первому попавшемуся с таким именем. Если эти одноимённые контейнеры относятся к разным проектам, будет фейл.
    Запись от Rius размещена 13.05.2019 в 06:12 Rius на форуме
    Обновил(-а) Rius 13.05.2019 в 06:20
  2. Старый комментарий
    Цитата:
    Сообщение от Rius
    Директорию db по хорошему надо размещать на отдельном volume, монтируемом к контейнеру. Потому что при хранении в файловой системе хоста права доступа будут не пойми какие.
    Спасибо!

    Цитата:
    Сообщение от Rius
    Не очевидная проблема, которую никто не упоминает в мануалах
    Я вставил depends_on, чтобы линеаризовать порядок загрузки контейнеров (и снизить энтропию причины ошибок).
    Честно скажу: я понятия не имею, что делает половина параметров, которые есть в docker-compose. Например, DB_HOST и PMA_PORT. Взял чужое решение, потратив два дня, довёл его рабочего состояния. К сожалению, очень мало инструкций по не-хеллоу-ворлдному использованию докера, в которых всё разжевывается подробно для идиотов как я.

    Цитата:
    Сообщение от Rius
    mysql выступает записью в некоем dns, используемом в сети docker. При наличии несколько таких проектов с одноименными контейнерами ("mysql"), контейнер, обращающийся по этому имени, будет стучатся к первому попавшемуся с таким именем. Если эти одноимённые контейнеры относятся к разным проектам, будет фейл.
    Я думал, что при запуске docker-compose он создаёт отдельную bridge-сеть для каждого проекта и контейнеры работают каждая в своей сети. Это не так?
    Запись от Mysterious Light размещена 13.05.2019 в 12:45 Mysterious Light вне форума
  3. Старый комментарий
    Аватар для Rius
    Цитата:
    Я думал, что при запуске docker-compose он создаёт отдельную bridge-сеть для каждого проекта и контейнеры работают каждая в своей сети. Это не так?
    Вроде бы, так было бы логично, но стоит проверить. Я объединял несколько проектов в соседних подсетях одного бриджа и долго докапывался до этой багофичи.

    Порядок загрузки там значения не имеет. По одинаковому имени возвращаются IP разных контейнеров, независимо от порядка их запуска.
    Запись от Rius размещена 13.05.2019 в 13:31 Rius на форуме
    Обновил(-а) Rius 14.05.2019 в 20:22
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru