Сервис Docker phpyMyAdmin не может подключиться к базе данных, используя сеть по умолчанию.

Вопрос или проблема

Сервис phpyMyAdmin не может подключиться к db (соединение отклонено). Но как только я добавляю те же сети (default и traefik) к сервису db, он начинает работать.

Почему? Насколько я понимаю, сейчас оба используют одну и ту же неявную сеть default. Действительно:

[
    {
        "Name": "wikiiosystemsit_default",
        "Id": "62eab0cee810c380c3b494f9a7fa4db9ed485ea002d70de4cb2fcfb7ea94f84c",
        "Created": "2024-12-12T23:49:31.56548723Z",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.19.0.0/16",
                    "Gateway": "172.19.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "4276e2b6bdc18f45d475ede7408feb79fe542205b23cc0ec36a61db88c3a2f90": {
                "Name": "wikiiosystemsit-phpmyadmin",
                "EndpointID": "9c73dbf36dfcd5492bd418b5288e00b6ad57b2a29ea6bf07fed1cc427e47ff89",
                "MacAddress": "02:42:ac:13:00:03",
                "IPv4Address": "172.19.0.3/16",
                "IPv6Address": ""
            },
            "d9a61504b1c97fd6fee155d61b1fa08cf0b62ba7261659a8d96f3f21ba015390": {
                "Name": "wikiiosystemsit-db",
                "EndpointID": "228d54ab65734bb3283ec6018e5c321846d59cf5c9bf9637e23dd3719d7749ee",
                "MacAddress": "02:42:ac:13:00:02",
                "IPv4Address": "172.19.0.2/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {
            "com.docker.compose.config-hash": "968eb6d395e1f23e415b8a7f99cc736629616b1cf3cc507ca678097b776fb609",
            "com.docker.compose.network": "default",
            "com.docker.compose.project": "wikiiosystemsit",
            "com.docker.compose.version": "2.31.0"
        }
    }
]

Мой файл Compose:

services:
    db:
        container_name: ${COMPOSE_PROJECT_NAME}-db
        image: mariadb:11
        volumes:
            - db-data:/var/lib/mysql
        environment:
            MARIADB_USER: ${DATABASE_USER:?}
            MARIADB_PASSWORD: ${DATABASE_PASSWORD:?}
            MARIADB_DATABASE: ${DATABASE_NAME:?}
            MARIADB_ROOT_PASSWORD: ${DATABASE_ROOT_PASSWORD:?}
            TZ: ${TZ:-Europe/Rome}
        # Раскомментируйте, и это будет работать
        #networks:
        #    - default
        #    - traefik
        restart: unless-stopped

    phpmyadmin:
        container_name: ${COMPOSE_PROJECT_NAME}-phpmyadmin
        image: phpmyadmin:latest
        environment:
            PMA_ARBITRARY: true
            PMA_HOST: db
            UPLOAD_LIMIT: 10M
            TZ: ${TZ:-Europe/Rome}
        networks:
            - default
            - traefik
        restart: unless-stopped

volumes:
    db-data:

networks:
    traefik:
        external: true

Ответ или решение

Почему сервис phpMyAdmin не может подключиться к базе данных в Docker

Согласно представленному описанию проблемы, вы столкнулись с ситуацией, когда сервис phpMyAdmin не может подключиться к базе данных (сервису db) из-за ошибки "Connection refused". Однако, после добавления одинаковых сетей default и traefik к сервису db, соединение восстанавливается. Давайте проанализируем, почему это происходит, и как правильно настроить вашу архитектуру Docker.

1. Понимание сетей Docker

Docker использует концепцию сетей для управления подключениями между контейнерами. Ваша конфигурация показывает, что оба контейнера, phpMyAdmin и db, могут находиться в одной и той же сети, но важно, чтобы они были правильно связаны через сетевые интерфейсы. Когда вы не указали, что db также находится в сети traefik, он имеет доступ только к сети default.

2. Соединение через сеть

При наличии отдельных сетей для сервисов, каждый контейнер может взаимодействовать только с теми контейнерами, которые находятся в той же сети. Ваша конфигурация описывает, что phpMyAdmin находится в сетях default и traefik, но db — только в сети default. Это может привести к тому, что phpMyAdmin не может установить соединение с db, когда обращается к хосту db, так как Docker предполагает, что db не доступен на других подключенных сетях.

3. Решение проблемы

Чтобы исправить возникшую проблему, вы должны убедиться, что оба контейнера находятся в одной сети, что и происходит, когда вы добавляете DB в сеть traefik:

    db:
        ...
        networks:
            - default
            - traefik

Это позволит контейнеру phpMyAdmin обращаться к db, используя его имя хоста через обе сети.

4. Причины возникновения ошибки "Connection refused"

Ошибка "Connection refused" обычно указывает на то, что указанный хост или порт не доступны для соединения. В данном случае, это может произойти из-за неправильной конфигурации сетей. Даже если оба контейнера находятся в одной сети, если вы что-то настроили неправильно, например, не указали правильные параметры подключения (имя пользователя, пароль, имя базы данных), это также может вызвать проблемы с подключением.

5. Рекомендации по оптимизации

  • Используйте единую сеть: Если ваши сервисы требуют взаимодействия, также можно рассмотреть возможность использования одной сети для их всех. Это упростит конфигурацию и устранит неопределенности в сетевых подключениях.

  • Проверьте параметры соединения: Убедитесь, что переменные окружения и параметры подключения для phpMyAdmin и db установлены правильно. Например, надо убедиться, что переменная PMA_HOST в phpMyAdmin указывает на имя хоста базы данных.

  • Логи и диагностика: Используйте команды Docker для проверки состояния контейнеров и их логов, чтобы определить, действительно ли контейнер db работает должным образом и принимает подключения.

Подводя итог, хотя оба контейнера и были в одной сети, их доступность друг для друга в случае использования нескольких сетей требует тщательного обращения с конфигурацией. Рекомендуется следить за совместимостью сетевых интерфейсов и правильно устанавливать параметры, чтобы избежать ошибок соединения.

Заключение

Обеспечение правильного соединения между контейнерами в Docker — важная задача, которая требует внимания к деталям настройки сетей. Правильная конфигурация сетей и параметров соединения поможет избежать ошибок и обеспечить бесперебойное функционирование сервисов, таких как phpMyAdmin и db.

Оцените материал
Добавить комментарий

Капча загружается...