【发布时间】: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