【问题标题】:How can I enforce all containers work together with domain localhost如何强制所有容器与域 localhost 一起工作
【发布时间】:2022-01-06 13:55:43
【问题描述】:

我有 8 个前端应用程序,12 个后端服务器。前端是 Vue.js 或 AngularJS,后端是 ASP.NET Core 3.1,以及 SQL server 和 Redis 等服务

所有服务都是 Docker 容器的类似配置,除了日志记录、端口等。他们都在同一个命名的网络中工作mynetwork

  abcservice:
    image: ${DOCKER_REGISTRY-}abcservice
    container_name: abcServer
    hostname: abcservice
    build:
      context: .
      dockerfile: abcService/Dockerfile
    networks:
        - mynetwork

但我必须使用http://host.docker.internal:{portnumer},所以所有容器都可以很好地协同工作。如何强制所有应用在 http://localhost:{portnumer} 上协同工作?

假设一个简单的 ASP.NET 核心应用程序,如果启动它没有docker,它可以访问SQL Server(run in docker)Redis(run in docker)http://localhost:port,但如果启动它一次docker,我必须通过域http://host.docker.internal:port访问应用程序,否则无法访问SQLRedis。因为在容器内部,localhost 表示容器本身,我需要一些配置来让容器通过 localhost 和指定端口到达其他容器。

欣赏。

【问题讨论】:

  • 你读过Networking in Compose这样的背景资料吗?在容器之间,您应该能够使用 Compose 服务名称,如 abcservice 作为主机名;您不需要container_name:hostname:networks: 设置。 (而且,是的,“在非 Docker 开发人员环境中”和“在 Compose 内部”是不同的环境,对于“Redis 在哪里”等问题需要不同的设置。)
  • @DavidMaze 是不是意味着有了 docker,就不能再使用localhost 来跨所有服务器了?
  • 即使没有 Docker,很多时候你的数据存储和依赖服务也不是localhost;例如,如果您的 Redis 实际上是 AWS Elasticache,则它不是 localhost。至少使用 Docker,您可以确定另一个容器 不是 localhost.

标签: docker docker-compose dockerfile localhost host-docker-internal


【解决方案1】:

选项 1:环境变量

您可以为所有服务使用端口,并使用.env 文件中的环境变量在主机名之间切换。 .env 文件可与 Docker Compose 一起使用,请参阅 docs

使用端口:

ports:
   - 6379:6379

示例.env 文件:

REDIS_HOST=redis
REDIS_PORT=6379

选项 2:使用 network_mode 主机

另一个选项是应用主机网络设置,而不是在每个服务上使用network_mode。这应该将主机网络设置应用于服务,而不是单独运行。

network_mode: host

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-20
    • 2017-08-27
    相关资源
    最近更新 更多