gpt4 book ai didi

连接容器的 Docker 网络错误

转载 作者:行者123 更新时间:2023-12-02 20:35:09 26 4
gpt4 key购买 nike

我在思考如何配置我认为是 Docker 中非常基本的网络设置时遇到了麻烦。
容器:

  • WordPress
  • MariaDB
  • Node.js

  • 我已经启动并运行了 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/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com