我在思考如何配置我认为是 Docker 中非常基本的网络设置时遇到了麻烦。
容器:
我已经启动并运行了 Wordpress 和 MariaDB 容器并相互聊天,但由于某种原因,我的 Node.js 容器无法对 Wordpress 服务器执行基本的 HTTP 调用。我立即收到
Error: connect ECONNREFUSED 192.168.128.4:3000
我的节点脚本中的错误。我在 Mac OS v2.3.0.3 上运行 Docker Desktop Community。
我的
docker-compose.yml
文件如下所示:services:
db:
image: mariadb:10.5.4-focal
container_name: db
volumes:
- ./cms/conf/mysql/data:/var/lib/mysql
- ./cms/sql:/docker-entrypoint-initdb.d
environment:
- MYSQL_ROOT_PASSWORD=******
- MYSQL_USER=******
- MYSQL_PASSWORD=******
- MYSQL_DATABASE=wordpress
restart: always
cms.mysite.local:
container_name: cms.mysite.local
build:
context: ./cms
image: mysite/cms:5.4.2
ports:
- '3000:80'
volumes:
- ./cms/conf/php/uploads.ini:/usr/local/etc/php/conf.d/uploads.ini
- ./cms/conf/nginx:/etc/nginx/conf.d
- ./cms/logs/nginx:/var/log/nginx
- ./cms/app/public:/var/www/html
environment:
- WORDPRESS_DB_NAME=wordpress
- WORDPRESS_TABLE_PREFIX=wp_
- WORDPRESS_DB_HOST=db
- WORDPRESS_DB_USER=root
- WORDPRESS_DB_PASSWORD=password
depends_on:
- db
restart: always
node:
container_name: node
build:
context: ./www
image: mysite/gatsby:2.23.12
user: 'node'
working_dir: /home/node/www
volumes:
- ./www:/home/node/www
- /home/node/www/node_modules
ports:
- '8000:8000'
depends_on:
- cms.mysite.local
restart: "always"
cms.mysite.local
容器有一个在 3000
指定的开放端口.我修改了本地 Mac OS 机器的 /etc/hosts
文件添加 127.0.0.1 cms.mysite.local
条目,我可以在浏览器中访问 Wordpress 站点并获得有效响应。所以看起来一切都在那里工作。然后我在
node
中设置了以下脚本容器:const axios = require('axios')
const url = 'http://cms.mysite.local:80'
console.log('URL=' + url)
axios.get(url).then( (response) => {
console.log('response=' + JSON.stringify(response.data))
})
.catch(function (error) {
console.log('error=' + error)
})
我已将此脚本设置为在容器启动时执行。每次运行时,我都会收到错误:Error: connect ECONNREFUSED 192.168.128.4:3000
.果然,当我尝试访问192.168.128.4:3000
在我的 MacOS 浏览器中手动操作,我确实没有连接。为什么 Node.js 脚本试图访问
http://192.168.128.4:3000
而不是我写的http://cms.mysite.local:3000/
网址?如何强制它使用正确映射到 Wordpress docker 容器的 URL?或者如何设置我的 URL 以便我的
node
容器可以对我的 cms.mysite.local
进行 HTTP 调用容器?[编辑 #1] 我还尝试更新我的 Node.js 脚本以调用
http://cms.mysite.local:80/
.我添加了一些日志记录以使输出更加清晰。> node ./test.js
URL=http://cms.mysite.local:80
error=Error: connect ECONNREFUSED 192.168.128.4:80
[编辑 2:敦促。我没有适本地停止并重建我的 docker 图像以进行编辑。我确实看到重新启动后正在使用适当的端口。 #1][解决:感谢 Fernando 和 Shizzen83 的端口标注!]
这就是发生的事情。我将我的 Wordpress 站点配置为端口 3000,以便我可以通过浏览器在该端口上访问它。但是我有一个 nginx 配置在 Docker 内部的端口 80 上为该站点提供服务。所以 Wordpress 在端口 80 请求上发出 301 重定向到端口 3000,因为内部 Docker 端口与外部 Wordpress 端口不匹配。我关闭了 nginx 以直接监听 3000 端口,并将我的 docker-compose 文件更新为映射
3000:3000
而不是 3000:80
.现在一切都排好了。谢谢大家!
最佳答案
似乎是 cms.mysite.local
的端口你在暴露
ports:
- 3000:80
这意味着这个容器被映射到端口3000
到外部(您的主机)但在 docker 网络内部,容器仍然具有 80
用于传入连接。为您的
node
容器必须类似于axios.get('http://cms.mysite.local:80').then( (response) => {
console.log('response=' + response.data)
})
.catch(function (error) {
// handle error
console.log('error=' + error);
})
和node
向您显示 IP,因为他正在 docker 网络中解析您的 wordpress 容器的 DNS
关于连接容器的 Docker 网络错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63400784/