[英]Undefined mysql functions using mySql5 + php5 + apache2 installed by macports under mac os x
[英]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.