【问题标题】:Vagrant to Docker communication via Docker IP addressVagrant 通过 Docker IP 地址与 Docker 通信
【发布时间】:2017-08-07 22:39:08
【问题描述】:

这是我的情况。我们正在慢慢地将我们的虚拟机从 Vagrant 迁移到 Docker,但我们大多仍然是 Docker 新手。我们的一些较新系统的开发环境已经迁移到 Docker。我们有运行在较旧的 Vagrant VM 上的测试代码,用于与运行 Django Restful API 应用程序的 Vagrant 通信以运行集成测试。此 Django API 现在位于 Docker 容器中。所以现在我们需要在 vagrant 中运行的测试代码,以便能够向 docker 中运行的 API 发出请求。 docker 容器和 vagrant 在主机(MacOS)上并排运行。我们正在使用 Docker compose 来初始化 docker 容器,主要的 compose yaml 文件如下所示。

services:
  django-api:
    ports:
      - "8080:8080"
    build:
        context: ..
        dockerfile: docker/Dockerfile.bapi
    extends:
      file: docker-compose-base.yml
      service: django-api
    depends_on:
      - db
    volumes:
      - ../:/workspace
    command: ["tail", "-f", "/dev/null"]
    env_file:
      - ${HOME}/.pam_environment
    environment:
      - DATABASE_URL=postgres://postgres:password@db
      - PGHOST=db
      - PGPORT=5432
      - PGUSER=postgres
      - PGPASSWORD=password
      - CLOUDAMQP_URL=amqp://rabbitmq

  db:
    ports:
      - "5432"
    extends:
      file: docker-compose-base.yml
      service: db
    volumes:
      - ./docker-entrypoint-initdb.d/init-postgress-db.sh:/docker-entrypoint-initdb.d/init-postgress-db.sh
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: password
      POSTGRES_DB: django-api-dev

我希望在 vagrant 上运行的测试仍然能够与现在在 docker 上运行的 django 应用程序通信,类似于它在 vagrant 中运行时可以与 api 通信的方式。我在 docker compose 文件中尝试了几种不同类型的网络配置,但是网络不是我的强项,我真的只是在黑暗中拍摄。

有没有办法配置我的 docker 容器和/或我的 vagrant,以便他们可以互相交谈?我需要公开我的 docker 容器的 IP 地址,以便我的 vagrant 可以访问它。

我们将不胜感激任何帮助/提示/指导!

【问题讨论】:

    标签: django docker vagrant docker-compose


    【解决方案1】:

    在您的 Vagrantfile 中,确保您有一个仅私有主机的网络。我通常将它们与固定 IP 一起使用

    config.vm.network "private_network", ip: "192.168.33.100"
    

    现在两个虚拟机都将在仅主机网络中获得一个静态 IP。当您在 Django VM 中运行 docker-compose up -d 时。您的 VM 会将端口 8080 映射到容器 8080。因此,您可以在其他 VM 中使用 192.168.33.100:8080 来测试 API

    【讨论】:

    • 所以我的 vagrant 设置使用私有主机网络192.168.33.11。因为我使用的是 VirtualBox,所以我有一个额外的网络适配器 vboxnet1。该机器如何与在 docker 容器中运行的应用程序通信。那么下一步呢?更改我的 docker compose 文件并添加 networks 部分?然后创建网络,例如? docker network create --subnet=192.168.33.0/24 --gateway=192.168.33.1 -o parent=vboxnet1 vboxnetdocker 这不像写的那样工作,只是在 vagrant 设置好私有网络后在 docker 端寻找步骤。
    • 你可以使用192.168.33.11从机器ping虚拟机吗?如果是,那么您只需要在运行 docker 容器docker run -p 8080:8080 image 时映射端口。从你的机器 192.168.33.11:8080 可以访问
    • 是的,从正在运行的 docker 容器中我可以 ping vagrant 虚拟机,但我无法 ping docker 容器,因为它是通过在 docker 上运行 ifconfig 获得的 IP 地址。换句话说,我可以与外部网络通信,但外部无法与容器通信。既不是来自我的主机,也不是来自流浪者。也许我不清楚,docker 容器没有在 vagrant 上运行。他们并肩奔跑。这就是为什么我假设在 docker 端需要做一些额外的网络工作,以允许 vagrant 向 docker 发送请求。
    • 您使用的是哪个操作系统?
    • 主机是MacOS docker,vagrant都运行ubuntu 14.04。
    【解决方案2】:

    我希望在 vagrant 上运行的测试仍然是 能够与正在运行的 django 应用程序通信 docker,类似于它可以与 api 通信的方式 在流浪者中奔跑。

    正如您所说,您正在使用 docker-compose,因此公开端口可以达到您想要的目的。在定义 django 应用程序的 yml 文件中,创建一个端口映射,它将主机上的端口绑定到容器中的端口。您可以通过包含以下内容来做到这一点:

    ports:
      "<host_port_where_you_want_to_access>:<container_port_where_application_is_running>"
    

    有没有办法配置我的 docker 容器和/或我的 vagrant 所以 他们可以互相交谈吗?我需要公开我的码头工人 容器的 IP 地址,以便我的 vagrant 可以访问它。

    是的。如果两个容器在同一个网络中(当服务在同一个 compose 文件中声明时,所有服务默认都在同一个网络中),那么一个容器可以通过调用它们的服务名称来与另一个容器通信。

    示例:在指定的 yml 文件中,django-api 可以在 http://db:xxxx/ 访问 db,其中 xxxx 可以是容器内的任何端口。 xxxx 不需要映射到主机,也不需要暴露。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-30
      • 1970-01-01
      • 2022-05-08
      • 1970-01-01
      • 1970-01-01
      • 2015-12-19
      • 2017-04-09
      • 1970-01-01
      相关资源
      最近更新 更多