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