首页 > 解决方案 > 访问 Docker 容器的 localhost

问题描述

我在 mac 上运行 docker,并试图在 docker 容器中为 angular 项目设置开发环境。

我的 docker-compose 设置目前如下所示:

version: '3.7'
services:
  dev:
    build:
      context: .
      dockerfile: "${DOCKERFILE_DIR}"
    working_dir: "${CONTAINER_DIR}"
    ports:
      - "3000:4200"
      - "3001:8080"
    volumes:
      - "nfsmount:${CONTAINER_DIR}"
    tty: true

volumes:
  nfsmount:
    driver: local
    driver_opts:
      type: nfs
      o: addr=host.docker.internal,rw,nolock,hard,nointr,nfsvers=3
      device: ":/System/Volumes/Data/${SOURCE_DIR}"

问题是,当我ng serve在 docker 容器内运行时,它服务于localhost:4200docker 容器,而不是容器的暴露端口。这意味着端口映射"3000:4200"不足以让我localhost:3000从我的主机连接到localhost:4200我的 docker 容器。

当然,一个简单的解决方案就是0.0.0.0:4200通过使用来服务于我的 docker 容器ng serve --host 0.0.0.0。但是,我试图尽可能地模仿我的开发环境,所以我想知道是否有任何其他方式可以连接localhost:42000.0.0.0:4200我的 docker 容器内部(或者更好的是,将localhost:3000我的主机直接连接到localhost:4200我的 docker 容器)。

任何帮助是极大的赞赏!

标签: docker

解决方案


除非您在容器内使用主机网络,否则这是不可能的。当你创建一个容器时,容器会获得它自己的网络命名空间。环回接口只能被运行在同一网络命名空间中的处理访问,即,只能在容器内的进程访问,因此不能从主机访问。

network_mode: "host"您可以使用docker compose 中的参数在主机网络中运行它,而不是在单独的网络命名空间中运行容器。如果您坚持不绑定到容器内的 0.0.0.0,这应该适用于您的用例。- https://docs.docker.com/compose/compose-file/#network_mode


推荐阅读