Docker с apache2 / php5 не может подключиться к mysql на хост-машине - PullRequest
0 голосов
/ 07 сентября 2018

Я пытаюсь раскрутить контейнер для запуска устаревшего веб-приложения, которому требуется php5.3. Я хочу, чтобы контейнер обращался к серверу mysql на хосте (то есть на компьютере, на котором размещен контейнер докеров). Сервер mysql подтвержден и работает, и я могу войти на него с хост-компьютера.

Мой Dockerfile выглядит так:

FROM ubuntu:12.04

VOLUME ["/var/www"]
VOLUME ["/etc/ssl"]

RUN apt-get update && \
    apt-get install -y \
      apache2 \
      php5 \
      php5-cli \
      libapache2-mod-php5 \
      php5-gd \
      php5-ldap \
      php5-mysql \
      php5-pgsql

COPY ./apache2.conf /etc/apache2/apache2.conf
COPY ./000-default.conf /etc/apache2/sites-available/000-default.conf
COPY ./site1 /etc/apache2/sites-available/site1
COPY ./site2 /etc/apache2/sites-available/site2
COPY ./apache2-foreground.sh /var/apache2-foreground.sh

RUN a2ensite site1
RUN a2ensite site2

RUN a2enmod rewrite
RUN a2enmod ssl

EXPOSE 80
EXPOSE 443

CMD ["bash", "/var/apache2-foreground.sh"]

Сценарий apache2-foreground.sh происходит от здесь .

Я развертываю контейнер с помощью этой команды:

docker run --detach \
       --name legacy-php5.3 \
       --net="host" \
       -p 80:80 \
       -p 443:443 \
       -v /etc/ssl:/etc/ssl \
       -v /var/www:/var/www \
       my/php5.3

Аргумент --net="host", если я правильно понимаю, должен сделать хост localhost доступным для контейнера. Однако контейнер не может соединиться с сервером MySQL на хосте. Команда php echo mysql_error() сообщает мне Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2).

Если я "ssh" в контейнере и запускаю $ mysql -h localhost -u <my_user> -p, то он говорит мне ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2).

На главном компьютере файл сокета находится там:

$ ls -l /var/run/mysqld/mysqld.*
-rw-r----- 1 mysql mysql 6 Sep  6 12:16 /var/run/mysqld/mysqld.pid
srwxrwxrwx 1 mysql mysql 0 Sep  6 12:16 /var/run/mysqld/mysqld.sock
-rw------- 1 mysql mysql 6 Sep  6 12:16 /var/run/mysqld/mysqld.sock.lock

Что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 09 сентября 2018

localhost - это сокет unix внутри контейнера, а не TCP-соединение с IP-адресом локального хоста. Чтобы получить доступ к сокету Unix на хосте, вам потребуется -v /var/run/mysqld:/var/run/mysqld, чтобы отобразить сокет на хосте в контейнер. Вам также понадобится VOLUME /var/run/mysqld в Dockerfile.

Альтернативно используйте TCP, указав 127.0.0.1 в качестве хоста для вашего приложения вместе с --net="host" в командной строке docker run.

0 голосов
/ 07 сентября 2018

Да, вы правильно понимаете, но прежде чем углубляться в детали, я упомяну важное утверждение о сети хоста.

Сетевой драйвер хоста работает только на хостах Linux и не поддерживается в Docker для Mac, Docker для Windows или Docker EE для Windows Server.

https://docs.docker.com/network/network-tutorial-host/

Теперь в Linux все работает так, как вы ожидаете.

Запустите nginx для тестирования

docker run --rm -it --network host --name my_nginx nginx:alpine

Перейти в свой контейнер ...

docker exec -it my_nginx ash

Если вы cat /etc/hosts

Все файлы хоста внутри контейнера будут такими же, как файл хоста хост-машины.

Теперь запустите другой тестовый образ, просто общедоступный образ из реестра Docker.

docker run --name="hello-world" -d -p 8080:8080 kornkitti/express-hello-world

Если вы делаете это внутри контейнера nginx

apk add curl
curl localhost:8080

Ответ Hello World из контейнера nodejs.

Для MySQL это тоже работает ...

mysql -h localhost -u root -ptest

В случае окна или Mac вы можете добавить следующее.

docker run --rm -it --add-host=db.local.com:(host__ip_address) --name my_nginx nginx:alpine

и подключиться к mysql из контейнеров, таких как

mysql -h db.local.com -u root -ptest
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...