我的 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
有人可以帮我解决吗?
network_mode: host
几乎没有必要。对于简单的服务器,例如您展示的 MySQL 服务器或看起来像普通 HTTP 应用程序的服务器,使用普通(桥接)Docker 网络和 ports:
就足够了,就像您展示的那样。
如果您确实设置了主机网络,则会完全禁用 Docker 的网络堆栈。您无法使用主机名调用其他容器,也无法使用
ports:
重新映射容器的端口(或选择根本不发布)。
您应该删除
network_mode:
文件中显示的 docker-compose.yml
行。 container_name:
和 hostname:
行也是不必要的,您也可以删除它们(特定例外:RabbitMQ 需要固定的 hostname:
)。
我觉得我看到主机网络被认可的两个地方要么是回调到主机(参见从 Docker 容器内部,如何连接到机器的本地主机?),要么是因为应用程序代码将
localhost
硬编码为数据库或其他组件的主机名(在这种情况下,Docker 和非 Docker 开发设置的行为从根本上不同,您应该使用环境变量或其他机制配置这些位置)。
快速解决方案:
降级 docker-compose 版本就可以了。问题在于最新的 docker-compose 版本和
network_mode: "host"
我在 v1.29.2 上遇到了同样的问题,而在 v1.27.4 上一切都很顺利。
要在 docker 内访问主机的 http://localhost,您需要替换:
network_mode: host
与:
ports:
- 80:80
您可以对任何其他端口执行相同的操作。
我对 network_mode: 'host' 也有同样的问题。
将 docker-compose 从 1.29.2 降级到 1.25.4 时,效果很好。也许新版本中添加了一些错误?
如果您想连接到本地数据库,那么在连接到该数据库时,请勿使用“localhost”或“127.0.0.1”。相反,使用“host.docker.internal”,这将允许容器与数据库之间的流量。
在 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 等上应该是可能的。
删除包含 network_mode 的服务中的参数端口,就像进行两次映射一样。
mysql: 图片:mysql:最新 容器名称:mysql 重新启动:始终 网络模式:“主机” 主机名:本地主机 环境: MYSQL_ROOT_PASSWORD:根 MYSQL_ALLOW_EMPTY_PASSWORD:“是” 卷: - $HOME/data/datasql:/var/lib/mysql .... ....