docker - 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
谁能帮我解决问题?
解决方案
network_mode: host
几乎从不需要。对于简单的服务器,例如您展示的 MySQL 服务器或看起来像普通 HTTP 应用程序的东西,使用普通(桥接)Docker 网络就足够了ports:
,就像您展示的那样。
如果您确实设置了主机网络,它会完全禁用 Docker 的网络堆栈。您不能使用主机名调用其他容器,也不能使用ports:
(或选择根本不发布)重新映射容器的端口。
您应该删除文件network_mode:
中显示的行docker-compose.yml
。container_name:
和hostname:
行也是不必要的,您也可以删除它们(具体例外:RabbitMQ 需要一个固定的)hostname:
。
我觉得我看到主机网络得到认可的两个地方要么是回调主机(请参阅从 Docker 容器内部,我如何连接到机器的本地主机?),或者因为应用程序代码很难-编码localhost
为数据库或其他组件的主机名(在这种情况下,Docker 和非 Docker 开发设置的行为根本不同,您应该使用环境变量或其他机制配置这些位置)。
推荐阅读
- serverless-framework - 使用 serverless-dotenv-plugin 更正 .env 文件
- linux - 如何删除 2017 年 1 月 1 日之前的所有文件
- jquery - 数组发布为空
- vba - 如何优化下面的VB代码?运行需要花费大量时间,并且 Excel 每次都挂起
- sql - 如何从oracle中的SELECT语句本身中选择自己的表名和列名?
- ios - 如何使用 IOS swift 在 Instagram 和 slack 上分享带有标题的图像?
- c# - 在 RedirectToAction 之后从过滤器中获取模型
- c# - 有没有办法仅在断言失败时评估断言的第二个参数?
- php - 在 laravel 中管理多个角色
- epplus - EPPlus:LoadFromCollection 出现“列超出范围”错误