簡體   English   中英

帶有apache2 / php5的Docker無法連接到主機上的mysql

[英]Docker with apache2/php5 cannot connect to mysql on host machine

我試圖啟動一個容器來運行需要php5.3的舊版Webapp。 我希望容器訪問主機(即托管Docker容器的計算機)上的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

我究竟做錯了什么?

localhost是容器中的Unix套接字,不是到本地主機IP地址的tcp連接。 要訪問主機上的unix套接字,您需要-v /var/run/mysqld:/var/run/mysqld將主機上的套接字映射到容器中。 您還需要在Dockerfile VOLUME /var/run/mysqld

通過將127.0.0.1與--net="host" docker run命令行中的--net="host"一起指定為應用程序的主機來使用TCP。

是的,您正確理解了它,但是在詳細介紹之前,我將提到有關主機網絡的重要聲明。

主機網絡驅動程序僅在Linux主機上有效,而Mac的Docker,Windows的Docker或Windows Server的Docker EE不支持該主機網絡驅動程序。

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容器的hello world響應。

對於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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM