通过Docker IP地址进行Docker通信

时间:2017-08-07 22:39:08

标签: django docker vagrant docker-compose

这是我的情况。我们正在慢慢地将我们的虚拟机从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应用程序进行通信,类似于它在api中运行时与api通信的方式。流浪汉。我在docker compose文件中尝试了几种不同类型的网络配置,但是网络不是我的强项,我真的只是在黑暗中拍摄。

有没有办法配置我的泊坞容器和/或我的流浪汉,以便他们可以互相交谈?我需要暴露我的docker容器的IP地址,以便我的流浪者可以访问它。

非常感谢任何帮助/提示/指导!

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

  

我希望在流浪者身上运行的测试仍然存在   能够与正在运行的django应用程序进行通信   docker,类似于它与api通信的方式   在一个流浪汉中奔跑。

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

ports:
  "<host_port_where_you_want_to_access>:<container_port_where_application_is_running>"
  

有没有办法配置我的泊坞容器和/或我的流浪者   他们可以互相交谈吗?我需要暴露我的码头工人   容器的IP地址,以便我的流浪者可以访问它。

是的。如果两个容器位于同一网络中(当服务在同一个组合文件中声明时,默认情况下所有服务都在同一网络中),则一个容器可以通过调用其服务名称与其他容器通信。

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

相关问题