Docker Compose 网络模式和端口绑定兼容性问题

问题描述 投票:0回答:7

我的 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

有人可以帮我解决吗?

docker docker-compose compatibility
7个回答
18
投票

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

如果您确实设置了主机网络,则会完全禁用 Docker 的网络堆栈。您无法使用主机名调用其他容器,也无法使用

ports:
重新映射容器的端口(或选择根本不发布)。

您应该删除

network_mode:
文件中显示的
docker-compose.yml
行。
container_name:
hostname:
行也是不必要的,您也可以删除它们(特定例外:RabbitMQ 需要固定的
hostname:
)。

我觉得我看到主机网络被认可的两个地方要么是回调到主机(参见从 Docker 容器内部,如何连接到机器的本地主机?),要么是因为应用程序代码将

localhost
硬编码为数据库或其他组件的主机名(在这种情况下,Docker 和非 Docker 开发设置的行为从根本上不同,您应该使用环境变量或其他机制配置这些位置)。


5
投票

快速解决方案:

降级 docker-compose 版本就可以了。问题在于最新的 docker-compose 版本和

network_mode: "host"
我在 v1.29.2 上遇到了同样的问题,而在 v1.27.4 上一切都很顺利。


1
投票

要在 docker 内访问主机的 http://localhost,您需要替换:

network_mode: host

与:

ports:
  - 80:80

您可以对任何其他端口执行相同的操作。


1
投票

我对 network_mode: 'host' 也有同样的问题。

将 docker-compose 从 1.29.2 降级到 1.25.4 时,效果很好。也许新版本中添加了一些错误?


1
投票

如果您想连接到本地数据库,那么在连接到该数据库时,请勿使用“localhost”或“127.0.0.1”。相反,使用“host.docker.internal”,这将允许容器与数据库之间的流量。


0
投票

在 Fedora 39 上。首先我安装了

sudo dnf install docker docker-compose
docker-compose -v
docker-compose version 1.29.2, build unknown
docker -v
Docker version 24.0.5, build %{shortcommit_cli}

docker 是

moby-engine
,而
docker-compose
是较旧的 v1 Python 版本(已弃用)。我也有同样的错误

... "host" network_mode is incompatible with port_bindings

我删除了那些

docker
docker-compose
并重新安装了docker社区版

sudo dnf remove docker-compose
sudo dnf remove docker
sudo dnf config-manager --add-repo https://download.docker.com/linux/fedora/docker-ce.repo
sudo dnf install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

docker version
Client: Docker Engine - Community
 Version:           26.1.1
...
docker compose version
Docker Compose version v2.27.0

这在 Go 中安装了较新的

docker-compose
v2,不再有错误。这在 Ubuntu 等上应该是可能的。


-1
投票

删除包含 network_mode 的服务中的参数端口,就像进行两次映射一样。

mysql: 图片:mysql:最新 容器名称:mysql 重新启动:始终 网络模式:“主机” 主机名:本地主机 环境: MYSQL_ROOT_PASSWORD:根 MYSQL_ALLOW_EMPTY_PASSWORD:“是” 卷: - $HOME/data/datasql:/var/lib/mysql .... ....

© www.soinside.com 2019 - 2024. All rights reserved.