Как настроить ограничение хоста mysql для работы с контейнером Docker - PullRequest
1 голос
/ 26 апреля 2019

Я устанавливаю контейнер mysql: 5 (изображение из концентратора докеров) в подсеть, совместно используемую с другим контейнером (веб-сервером).

Я бы хотелограничить моего пользователя mysql хостом, соответствующим контейнеру веб-сервера.

Если я ограничу его напрямую с помощью контейнера веб-сервера ip, то это работает, но этот ip не может измениться из-за среды докера, поэтому я хотел быесть что-то вроде:

GRANT ALL PRIVILEGES ON `db`.* TO 'user'@'container-name'

И когда я пытаюсь подключиться к серверу, отвечаю:

Доступ запрещен для пользователя'user'@'172.18.0.4'

Где 172.18.0.4 - правильный ip для контейнера веб-сервера.


Пример:

docker-compose.yaml

version: '2'
services:
  mysql1:
    image: mysql
    container_name: mysql1
    ports:
      - '3306:3306'
    environment:
      - MYSQL_ROOT_PASSWORD=rootpwd

  mysql2:
    image: mysql
    container_name: mysql2
    environment:
      - MYSQL_ROOT_PASSWORD=rootpwd

Up контейнеров

docker-compose up -d

Создать пользователя в mysql1

docker-compose exec mysql1 mysql -u root --password="rootpwd" -e "CREATE USER user@mysql2 IDENTIFIED BY 'pwd'; GRANT ALL PRIVILEGES ON * TO user@mysql2" sys

Попробуйте получить доступ к mysql1 из mysql2 пользователем

docker-compose exec mysql2 mysql -u user --password="pwd" -h mysql1 sys

ОШИБКА 1045 (28000): доступ запрещен для пользователя 'user'@'172.18.0.3' (с использованием пароля: ДА)

Информация о сети Docker

docker network inspect test-mysql-user-host_default    
{
    "Name": "test-mysql-user-host_default",
    "Id": "305f4da33e0b79d899ac289e6b3fc1ebf2733baf0bf3d60a53cc94cec44176d1",
    "Created": "2019-04-26T09:53:23.3237197Z",
    "Scope": "local",
    "Driver": "bridge",
    "EnableIPv6": false,
    "IPAM": {
        "Driver": "default",
        "Options": null,
        "Config": [
            {
                "Subnet": "172.18.0.0/16",
                "Gateway": "172.18.0.1"
            }
        ]
    },
    "Internal": false,
    "Attachable": false,
    "Ingress": false,
    "ConfigFrom": {
        "Network": ""
    },
    "ConfigOnly": false,
    "Containers": {
        "133ebd1e6ba485212e5448670c66c1718917650bc217264183c725fb1a928118": {
            "Name": "mysql1",
            "EndpointID": "ce89aa1674e9c46fad50b2f36aec8d1eecf2227f597a785be67785ade770fef7",
            "MacAddress": "02:42:ac:12:00:02",
            "IPv4Address": "172.18.0.2/16",
            "IPv6Address": ""
        },
        "d67072a5c486752b7018fa321e47ae09fb873199604c2b520f2305968d43b577": {
            "Name": "mysql2",
            "EndpointID": "e6b62c6ce9e266d38be383fa6029f378e1ca67a18420dd3f508a3089200c0d98",
            "MacAddress": "02:42:ac:12:00:03",
            "IPv4Address": "172.18.0.3/16",
            "IPv6Address": ""
        }
    },
    "Options": {},
    "Labels": {}
}

1 Ответ

0 голосов
/ 26 апреля 2019

Комментарий от bellackn

Кажется, это проблема опции Skip-resol-host MySQL, которая в настоящее время жестко запрограммирована в Dockerfile (см. Эту проблему GitHub). TLDR: Вы можете создать собственное изображение на основе mysql: 5 и отключить эту опцию, или использовать подстановочный знак% вместо mysql2.

Он прямо здесь официальный докер-файл для mysql: 5.7 , а в строке 70 мы можем найти:

#don't reverse lookup hostnames, they are usually another container
&& echo '[mysqld]\nskip-host-cache\nskip-name-resolve' > /etc/mysql/conf.d/docker.cnf

Я сделал новый Dockerfile, который удалил этот файл конфигурации.

FROM mysql:5.7

RUN rm /etc/mysql/conf.d/docker.cnf

EXPOSE 3306 33060
CMD ["mysqld"]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...