Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Docker容器在连接到localhost db时运行得很快,但在外部db上运行得很慢_Docker - Fatal编程技术网

Docker容器在连接到localhost db时运行得很快,但在外部db上运行得很慢

Docker容器在连接到localhost db时运行得很快,但在外部db上运行得很慢,docker,Docker,我正在docker容器上运行一个php应用程序。当我连接到本地数据库时,响应非常快(35秒) 我曾尝试使用谷歌的DNS,如我发现的一些链接所述,但没有成功。我的DNS解析在docker容器中非常快,要连接到Google Cloud SQL DB,我直接使用IP地址 我已经检查了这个链接和这个。这似乎是相关的,但不确定 我认为这是一个Docker问题,或者与容器有关,因为相同的远程db(在google cloud和aws上)用于其他应用程序,并且速度非常快。在我看来,这与容器内的网络有关 总之,这

我正在docker容器上运行一个php应用程序。当我连接到本地数据库时,响应非常快(<1秒)。当我连接到外部数据库(在谷歌云或亚马逊aws上运行)时,性能非常慢(>35秒)

我曾尝试使用谷歌的DNS,如我发现的一些链接所述,但没有成功。我的DNS解析在docker容器中非常快,要连接到Google Cloud SQL DB,我直接使用IP地址

我已经检查了这个链接和这个。这似乎是相关的,但不确定

我认为这是一个Docker问题,或者与容器有关,因为相同的远程db(在google cloud和aws上)用于其他应用程序,并且速度非常快。在我看来,这与容器内的网络有关

总之,这里是我用于测试的场景(DB内容完全相同):

1) 在Mac上作为本地主机在Docker容器中运行我的应用程序:

  • 我的本地主机上的数据库(MAMP):非常快(<1秒)
  • 谷歌云SQL上的数据库:非常慢(>35秒)
  • 亚马逊RDS上的DB:非常慢(>35秒)
2) 在Docker容器中运行我的应用程序的Google计算引擎上:

  • 谷歌云SQL上的数据库:非常慢(>35秒)
  • 亚马逊RDS上的DB:非常慢(>35秒)
3) 在自定义Google app engine flex环境中,我的应用程序在Docker中运行:

  • 谷歌云SQL上的数据库:非常慢(>35秒)
  • 亚马逊RDS上的DB:非常慢(>35秒)
4) 在PHP Google app engine flex环境中:

  • 谷歌云SQL上的数据库:非常慢(>35秒)
  • 亚马逊RDS上的DB:非常慢(>35秒)
5) 当我的应用程序在Docker之外的Google计算引擎实例(PHP+apache)上运行时:

  • 谷歌云SQL上的数据库:非常快(<1秒)
  • 亚马逊RDS上的DB:非常快(<1秒)
6) 在本地主机(Mac)上Docker外部运行我的应用程序时:

  • 谷歌云SQL上的数据库:非常快(<1秒)
  • 亚马逊RDS上的DB:非常快(<1秒)
  • 我的本地主机上的数据库(MAMP):非常快(<1秒)
有人知道解决或发现问题的方法吗?我知道这是一个可能很难解决的问题。所以,我的问题更多的是关于我应该如何调试它来发现问题

我的Dockerfile:

FROM php:7.0.17-apache RUN apt-get update RUN apt-get install -y apt-utils curl vim RUN docker-php-ext-install mysqli && docker-php-ext-enable mysqli RUN docker-php-ext-install pdo pdo_mysql && docker-php-ext-enable pdo_mysql RUN pecl install xdebug # The base image does not have php.ini. # Copy our own, with xdebug settings ADD ./php.ini /usr/local/etc/php/ # Configure apache RUN a2enmod rewrite RUN a2dissite 000-default.conf # Copy sites available ADD ./www.metalar.net.conf /etc/apache2/sites-available/ # Copy Ports file ADD ./ports.conf /etc/apache2/ # Copy Ports file ADD ./apache2.conf /etc/apache2/apache2.conf # Copy error log ADD ./error.log /var/log/apache2/error.log # Make directory to host project files RUN mkdir -p /srv/www/www.metalar.net # Copy App to proper destination ADD . /srv/www/www.metalar.net # Enable config RUN a2ensite www.metalar.net.conf EXPOSE 8080 来自php:7.0.17-apache 运行apt获取更新 运行apt get install-y apt utils curl vim 运行docker php ext安装mysqli&&docker php ext启用mysqli 运行docker php ext安装pdo pdo_mysql&&docker php ext启用pdo_mysql 运行pecl安装xdebug #基本映像没有php.ini。 #使用xdebug设置复制我们自己的 添加./php.ini/usr/local/etc/php/ #配置apache 运行a2enmod重写 运行advisite 000-default.conf #复制可用的站点 添加/www.metalar.net.conf/etc/apache2/sites available/ #复制端口文件 添加./ports.conf/etc/apache2/ #复制端口文件 添加./apache2.conf/etc/apache2/apache2.conf #复制错误日志 添加./error.log/var/log/apache2/error.log #使目录成为项目文件的宿主 运行mkdir-p/srv/www/www.metalar.net #将应用程序复制到正确的目的地 加上/srv/www/www.metalar.net #启用配置 运行a2ensite www.metalar.net.conf 曝光8080 netstat-s

Ip: 187 total packets received 0 forwarded 0 incoming packets discarded 187 incoming packets delivered 163 requests sent out Icmp: 0 ICMP messages received 0 input ICMP message failed. ICMP input histogram: 0 ICMP messages sent 0 ICMP messages failed ICMP output histogram: Tcp: 2 active connections openings 0 passive connection openings 0 failed connection attempts 0 connection resets received 0 connections established 181 segments received 157 segments send out 0 segments retransmited 0 bad segments received. 0 resets sent Udp: 6 packets received 0 packets to unknown port received. 0 packet receive errors 6 packets sent UdpLite: TcpExt: 2 TCP sockets finished time wait in fast timer 171 packet headers predicted 4 acknowledgments not containing data payload received TCPRcvCoalesce: 82 TCPOrigDataSent: 4 IpExt: InOctets: 234466 OutOctets: 7205 InNoECTPkts: 187 知识产权: 共收到187个数据包 0转发 丢弃0个传入数据包 187个传入数据包已发送 发出163项请求 Icmp: 收到0条ICMP消息 0输入ICMP消息失败。 ICMP输入直方图: 已发送0个ICMP消息 0 ICMP消息失败 ICMP输出直方图: Tcp: 2个主动连接开口 0个被动连接开口 0次连接尝试失败 接收到0个连接重置 已建立0个连接 收到181段 发送157段 0段重新传输 接收到0个坏段。 已发送0个重置 Udp: 收到6个数据包 接收到0个到未知端口的数据包。 0数据包接收错误 已发送6个数据包 UdpLite: TcpExt: 2个TCP套接字在快速计时器中完成等待时间 预测171个数据包头 4接收到不包含数据有效负载的确认 TCPRcvCoalesce:82 TCPOrigDataSent:4 IpExt: InOctets:234466 输出八位字节:7205 InnoctPKTS:187
首先,您使用的Docker版本是什么

因为不久前我在Mac上运行Docker时遇到了类似的问题,我发现Docker for Mac的一个已知问题也可能与您有关

  • "
此问题已映射到以下问题

他们提供了一个解决方案,但现在应该足以更新Docker以解决性能差的问题

然而,这些已知的问题并不能解释行为2和行为3,所以我想这是没有关系的,但值得我提及

调试 关键是,这不是服务器或应用程序的问题,因此我将重点调试Docker的网络部分,因为某些原因,该部分无法按预期工作

这些只是一般性的建议,但是你可以在Docker论坛上找到更多的信息

为了调试,我将打开两个终端,使用第一个终端,我将ssh连接到容器中,与本地机器并行运行所有命令,以便比较结果

  • 我会检查从容器下载文件的速度是否与谷歌云存储和任何随机网站的下载速度相似

  • Ping
    MySql实例并比较延迟

  • Traceroute
    指向MySql实例并检查pat