通过Docker IP地址阻止Docker通信

这是我的情况。 我们正在慢慢地将我们的虚拟机从Vagrant迁移到Docker,但是我们大多仍然是Docker的新手。 我们的一些新系统的开发环境已经被转移到了Docker上。 我们有一个testing代码,运行在一个老的Vagrant虚拟机上,用来与运行Django Restful API应用程序的Vagrant进行通信,以便运行集成testing。 这个Django API现在在一个Docker容器中。 所以现在我们需要在stream浪者中运行的testing代码能够向docker中运行的API发出请求。 docker集装箱和stream浪者在主机(MacOS)上并排运行。 我们使用Docker组合来初始化Docker容器,主要组成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 

我希望在stream浪者身上运行的testing仍然能够与docker上正在运行的django应用程序进行通信,类似于当它在stream浪者中运行时与api进行通信的方式。 我已经尝试了几种不同types的networkingconfiguration在docker作曲文件,但唉networking不是我强大的西装,我真的只是在黑暗中拍摄这里。

有没有办法configuration我的docker集装箱和/或我的stream浪者,以便他们可以相互交谈? 我需要暴露我的docker集装箱的IP地址,以便我的stream浪者可以访问它。

任何帮助/提示/指导在这里将不胜感激!

在你的Vagrant文​​件中,确保你有一个专用的主机专用networking。 我通常使用他们与固定的IP

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

现在这两台虚拟机都将在主机唯一的networking中获得一个静态IP。 在Django VM中运行docker-compose up -d时。 您的虚拟机将映射端口8080到容器8080 。 所以你可以在其他虚拟机上使用192.168.33.100:8080来testingAPI

我希望在stream浪者身上运行的testing仍然能够与docker上正在运行的django应用程序进行通信,类似于当它在stream浪者中运行时与api进行通信的方式。

正如你所说,你正在使用docker撰写,所以暴露端口将做你正在寻找的目的。 在定义了django应用程序的yml文件中,创build一个端口映射,将主机上的端口绑定到容器中的端口。 你可以通过包括这个来做到这一点:

 ports: "<host_port_where_you_want_to_access>:<container_port_where_application_is_running>" 

有没有办法configuration我的docker集装箱和/或我的stream浪者,以便他们可以相互交谈? 我需要暴露我的docker集装箱的IP地址,以便我的stream浪者可以访问它。

它是。 如果两个容器都在同一个networking中(当服务在同一个合成文件中声明时,所有的服务默认在同一个networking中),那么一个容器可以通过调用其服务名称与其他容器通信。

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