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

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

Запись от Mysterious Light размещена 12.05.2019 в 20:34
Показов 7640 Комментарии 3
Метки 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/ques... sql-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)]>
Метки docker, mysql
Размещено в Без категории
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 3
Комментарии
  1. Старый комментарий
    Аватар для Rius
    Директория db в начальный момент пуста или не существует.
    Директорию db по хорошему надо размещать на отдельном volume, монтируемом к контейнеру. Потому что при хранении в файловой системе хоста права доступа будут не пойми какие.

    Не очевидная проблема, которую никто не упоминает в мануалах:
    Code
    1
    2
    3
    4
    5
    6
    
    services:
      mysql:
        ...
      php:
        depends_on:
          - mysql
    mysql выступает записью в некоем dns, используемом в сети docker. При наличии несколько таких проектов с одноименными контейнерами ("mysql"), контейнер, обращающийся по этому имени, будет стучатся к первому попавшемуся с таким именем. Если эти одноимённые контейнеры относятся к разным проектам, будет фейл.
    Запись от Rius размещена 13.05.2019 в 06:12 Rius вне форума
  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 вне форума
 
Новые блоги и статьи
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru