Docker 撰写 network_mode 和 port_binding 兼容性问题
Docker Compose network_mode and port_binding compatibility issue
我的 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:
重新映射容器的端口(或选择根本不发布)。
您应该删除 docker-compose.yml
文件中显示的 network_mode:
行。 container_name:
和 hostname:
行也是不必要的,您也可以删除它们(特定例外:RabbitMQ 需要一个固定的 hostname:
)。
我觉得我看到主机网络的两个地方被认可要么是回调主机(参见From inside of a Docker container, how do I connect to the localhost of the machine?),要么是因为应用程序代码已硬编码localhost
数据库或其他组件的主机名(在这种情况下 Docker 和非 Docker 开发设置的行为根本不同,您应该使用环境变量或其他机制配置这些位置)。
快速解决方案:
降级 docker-compose 版本,你会没事的。问题出在最新的 docker-compose 版本和 network_mode: "host"
我在 v1.29.2 上遇到了同样的问题,而在 v1.27.4 上一切顺利。
摆脱包含network_mode的服务中的参数端口,就像做两次映射一样。
mysql:
图片:mysql:latest
container_name: mysql
重启:总是
network_mode: "主机"
主机名:本地主机
环境:
MYSQL_ROOT_PASSWORD:根
MYSQL_ALLOW_EMPTY_PASSWORD:“是”
卷:
- $HOME/data/datasql:/var/lib/mysql
....
....
要在您的 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”,这将允许您的容器与数据库之间的流量。
我的 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:
重新映射容器的端口(或选择根本不发布)。
您应该删除 docker-compose.yml
文件中显示的 network_mode:
行。 container_name:
和 hostname:
行也是不必要的,您也可以删除它们(特定例外:RabbitMQ 需要一个固定的 hostname:
)。
我觉得我看到主机网络的两个地方被认可要么是回调主机(参见From inside of a Docker container, how do I connect to the localhost of the machine?),要么是因为应用程序代码已硬编码localhost
数据库或其他组件的主机名(在这种情况下 Docker 和非 Docker 开发设置的行为根本不同,您应该使用环境变量或其他机制配置这些位置)。
快速解决方案:
降级 docker-compose 版本,你会没事的。问题出在最新的 docker-compose 版本和 network_mode: "host"
我在 v1.29.2 上遇到了同样的问题,而在 v1.27.4 上一切顺利。
摆脱包含network_mode的服务中的参数端口,就像做两次映射一样。
mysql: 图片:mysql:latest container_name: mysql 重启:总是 network_mode: "主机" 主机名:本地主机 环境: MYSQL_ROOT_PASSWORD:根 MYSQL_ALLOW_EMPTY_PASSWORD:“是” 卷: - $HOME/data/datasql:/var/lib/mysql .... ....
要在您的 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”,这将允许您的容器与数据库之间的流量。