具有apache2/php5的docker无法连接到主机上的mysql

fiei3ece  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(373)

我正在尝试启动一个容器来运行一个需要 php5.3 . 我想让容器进入 mysql 主机上的服务器(即承载docker容器的计算机)。这个 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

我做错什么了?

2jcobegt

2jcobegt1#

是的,你理解正确,但在详细讨论之前,我将提到有关主机网络的重要声明。
主机网络驱动程序仅在linux主机上工作,在docker for mac、docker for windows或docker ee for 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

来自nodejs容器的helloworld响应。
对于mysql来说,它也能工作。。。

mysql -h localhost -u root -ptest

对于windows或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
6g8kf2rb

6g8kf2rb2#

localhost 是容器中的unix套接字,而不是到本地主机ip地址的tcp连接。要访问您需要的主机上的unix套接字 -v /var/run/mysqld:/var/run/mysqld 将主机上的套接字Map到容器中。你还需要 VOLUME /var/run/mysqldDockerfile .
或者,通过指定127.0.0.1作为应用程序的主机以及 --net="host"docker run 命令行。

相关问题