首页 > 解决方案 > Docker Compose network_mode 和 port_binding 兼容性问题

问题描述

我的 docker-compose.yml 包含以下内容:

version: '3.2'
services:
  mysql:
    image: mysql:latest
    container_name: mysql
    restart: always
    network_mode: "host"
    hostname: localhost
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_ALLOW_EMPTY_PASSWORD: "yes"
    volumes:
      - $HOME/data/datasql:/var/lib/mysql
    ports:
      - 3306:3306

  user-management-service:
    build: user-management-service/
    container_name: user-management-service
    restart: always
    depends_on:
      - mysql
      - rabbitmq
      - eureka
    network_mode: "host"
    hostname: localhost
    ports:
      - 8089:8089

当我尝试执行 docker-compose up 时,出现以下错误:

"host" network_mode is incompatible with port_bindings

谁能帮我解决问题?

标签: dockerdocker-composecompatibility

解决方案


network_mode: host几乎从不需要。对于简单的服务器,例如您展示的 MySQL 服务器或看起来像普通 HTTP 应用程序的东西,使用普通(桥接)Docker 网络就足够了ports:,就像您展示的那样。

如果您确实设置了主机网络,它会完全禁用 Docker 的网络堆栈。您不能使用主机名调用其他容器,也不能使用ports:(或选择根本不发布)重新映射容器的端口。

您应该删除文件network_mode:中显示的行docker-compose.ymlcontainer_name:hostname:行也是不必要的,您也可以删除它们(具体例外:RabbitMQ 需要一个固定的)hostname:

我觉得我看到主机网络得到认可的两个地方要么是回调主机(请参阅从 Docker 容器内部,我如何连接到机器的本地主机?),或者因为应用程序代码很难-编码localhost为数据库或其他组件的主机名(在这种情况下,Docker 和非 Docker 开发设置的行为根本不同,您应该使用环境变量或其他机制配置这些位置)。


推荐阅读