连接容器的 Docker 网络错误

标签 docker docker-compose

我在思考如何配置我认为是 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/

    相关文章:

    python - 在 Docker 中运行的 Aiohttp 和 NGINX

    python - 使用 python 代码创建 Docker 容器时出现问题

    windows - 如何使用 VS2017 和 Docker 集成为 Windows 构建 Docker 镜像?

    docker - 如何将 Chef 数据包 secret 传递给 docker 容器?

    java - 在使用 Docker Compose 的 Spring 应用程序中是否有任何端口映射特定功能?

    linux - 拉取与 CPU 架构无关的 Docker 镜像

    docker - 从什么时候将用户添加到 docker 组不足以执行 docker 客户端,我每次都需要 `newgrp docker`?

    docker - 如何部署其他Kafka Broker(Docker镜像)

    docker - 无法在 ElasticSearch 上加载和使用 synonym.txt 文件

    Docker compose 命令用户选择