【问题标题】:Docker connect to localhostDocker 连接到本地主机
【发布时间】:2020-09-04 18:32:15
【问题描述】:

我有一些在 docker 容器上运行时不起作用的简单代码。

    $h = curl_init();
    $header = [
        'User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:33.0) Gecko/20100101 Firefox/33.0',
        'Referer: https://shoots.video',
    ];
    $url = str_replace("localhost:8080","localhost",$url);
    curl_setopt($h, CURLOPT_HTTPHEADER, $header);
    curl_setopt($h, CURLOPT_URL, $url);
    curl_setopt($h, CURLOPT_SSL_VERIFYHOST,false);     
    curl_setopt($h, CURLOPT_SSL_VERIFYPEER,false);
    curl_setopt($h, CURLOPT_RETURNTRANSFER,true);
    $content = curl_exec($h);
    if ( curl_errno($h) ) {
        echo "Curl Error: " . curl_error($h);
    }
    curl_close($h);
    echo $content;
    var_dump($content);
    echo file_get_contents($url);

上面我正在尝试 curl 和 file_get_contents。我只是想连接到 docker 容器上运行的 apache 实例来加载网页。

我得到的是:

string(0) ""

Warning: file_get_contents(http://localhost/flat-listings/?search_location=&search_radius=50&per_page=25&page=1&order=desc&orderby=rating-desc): failed to open stream: Cannot assign requested address

curl 请求的 var_dump 为空。

并且 file_get_contents 会引发警告。

我尝试了各种不同的 host.docker.internal、127.0.0.1、$_SERVER['SERVER_ADDR'] 失败。

容器是从 docker-compose 文件运行的,所以如果我可以在 docker-compose.yml 中添加一些东西来修复它,那就太好了。

请理解,我想要 100% 的本地主机行为。没有其他的。我想从容器内部连接到容器。我似乎无法弄清楚为什么这不起作用?我不想连接到 mysql 或其他东西。它只是一个 php 脚本,它连接回 HTTP 服务器并请求同一“网站”上的另一个页面。

我在 linux 上使用 Docker。

这是我的 docker-compose.yml

version: '3.3'
services:
  mysql: 
    image: mariadb
    container_name: shootsmysql
    volumes:
      - vshootsdb:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: xxxx
      MYSQL_DATABASE: wordpress1
      MYSQL_USER: wordy
      MYSQL_PASSWORD: xxxx
    restart: always
    ports:
      - '3306:3306'
    expose:
      - '3306'
  wordpress:
    image: andreccosta/wordpress-xdebug
    container_name: shootswordpress
    volumes:
      - vshootswp:/var/www/html/
    depends_on:
      - mysql
    environment:
      WORDPRESS_DB_HOST: mysql:3306
      WORDPRESS_DB_NAME: wordpress1
      WORDPRESS_DB_USER: wordy
      WORDPRESS_DB_PASSWORD: xxxx
      WORDPRESS_TABLE_PREFIX: wp1_
    links:
      - mysql
    restart: always
    ports:
      - "80:80"
    expose:
      - '80'
volumes:
  vshootsdb: 
  vshootswp: 
    driver: local
    driver_opts:
      o: bind
      type: none
      device: /var/www/shoots/wordpress/

我已经查看了几种可能的解决方案(包括来自 SO),要么 a) 我无法让它们工作,要么 b) 我对答案的理解不够好,无法实施。

所以我正在寻找更多信息,而不仅仅是:“像文档所说的那样传递 -network=host”。我尝试将 network_mode: "host" 添加到 wordpress 定义中,但并不高兴。

【问题讨论】:

  • 再次检查,您是从应用程序代码调用同一服务的 HTTP 接口吗? localhost 应该在那里工作。您的 URL 提到端口 8080,但您的 docker-compose.yml 有端口 80,这两个端口设置是否正确?
  • 代码去掉了8080,之所以有,是因为这是wordpress安装,所以url就是那个方法设置的。端口正在(成功)被转发,网站的所有其他部分都可以正常工作,而不是这个脚本。
  • 写docker ps,可以看到暴露的端口

标签: php docker docker-compose


【解决方案1】:

您可以使用 docker 网络模式主机:https://docs.docker.com/network/host/ 如果你在 Linux 中,但所有虚拟域都会改变

【讨论】:

  • 我已经特别尝试过,但没有任何乐趣。为了清楚起见,我在 docker-compose 中使用了 network_mode: "host"。所以这并不意味着我做对了......
猜你喜欢
  • 2022-11-30
  • 2015-11-28
  • 2020-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多