Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 通过Docker IP地址与Docker通信_Django_Docker_Vagrant_Docker Compose - Fatal编程技术网

Django 通过Docker IP地址与Docker通信

Django 通过Docker IP地址与Docker通信,django,docker,vagrant,docker-compose,Django,Docker,Vagrant,Docker Compose,这是我的情况。我们正在慢慢地将我们的虚拟机从流浪者迁移到码头工人,但我们大多数还是码头工人。我们的一些较新系统的开发环境已经转移到Docker。我们有一个测试代码,它运行在一个旧的Vagrant VM上,用于与运行Django Restful API应用程序的Vagrant通信,以便运行集成测试。这个DjangoAPI现在位于Docker容器中。因此,现在我们需要在vagrant中运行的测试代码,以便能够向docker中运行的API发出请求。docker容器和vagrant都在主机(MacOS)

这是我的情况。我们正在慢慢地将我们的虚拟机从流浪者迁移到码头工人,但我们大多数还是码头工人。我们的一些较新系统的开发环境已经转移到Docker。我们有一个测试代码,它运行在一个旧的Vagrant VM上,用于与运行Django Restful API应用程序的Vagrant通信,以便运行集成测试。这个DjangoAPI现在位于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地址,以便我的流浪汉可以访问它


如有任何帮助/提示/指导,将不胜感激

在您的文件中,确保您有一个仅限专用主机的网络。我通常使用固定的IP地址

config.vm.network "private_network", ip: "192.168.33.100"
现在,两个虚拟机都将在纯主机网络中获得静态IP。当您在Django虚拟机中运行
docker compose up-d
时。您的虚拟机将把端口
8080
映射到容器
8080
。因此,您可以在另一个VM中使用
192.168.33.100:8080
来测试API

我希望在流浪汉身上运行的测试仍然有效 能够与当前运行的django应用程序通信 docker,类似于它在运行时与api通信的方式 在流浪汉中奔跑

正如您所说,您使用的是docker compose,因此公开端口可以满足您的需要。在定义django应用程序的yml文件中,创建一个端口映射,将主机上的端口绑定到容器中的端口。您可以通过包括以下内容来完成此操作:

ports:
  "<host_port_where_you_want_to_access>:<container_port_where_application_is_running>"
端口:
":"
有没有办法配置我的docker容器和/或我的vagrant 他们可以互相交谈?我需要揭露我的码头工人 容器的IP地址,以便我的流浪汉可以访问它

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


示例:在问题中指定的yml文件中,
django api
可以在
http://db:xxxx/
其中xxxx可以是集装箱内的任何端口
xxxx
无需映射到主机,也无需公开。

因此,我的vagrant设置使用专用主机网络
192.168.33.11
。因为我使用的是VirtualBox,所以我有一个额外的网络适配器
vboxnet1
。该机器如何与docker容器中运行的应用程序通信。那么接下来的步骤呢?更改我的docker compose文件并添加
网络
部分?然后创建网络,例如
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 VM,但我无法ping docker容器,因为它的IP地址是在docker上运行时通过运行
ifconfig
获得的。换句话说,我可以与外部网络通信,但外部无法与容器通信。既不是我的主机也不是流浪汉。也许我不清楚docker集装箱不是在流浪汉身上运行的。他们并排跑。这就是为什么我认为docker端需要做一些额外的网络工作,以允许流浪汉向docker发送请求。您使用的是哪种操作系统?主机是MacOS docker,流浪汉都运行ubuntu 14.04。