2017-08-07 110 views
0

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

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:[email protected] 
     - 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 

我想这是在漂浮的运行测试,仍然能够与现在的码头工人正在运行的Django应用程序,类似于当它在运行它可以与API沟通的方式进行沟通流浪汉。我已经在Docker撰写文件中尝试了几种不同类型的网络配置,但唉网络不是我的强项,我真的只是在黑暗中拍摄而已。

有没有办法配置我的码头集装箱和/或我的流浪者,以便他们可以相互交谈?我需要公开我的码头集装箱的IP地址,以便我的流浪者可以访问它。

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

回答

1

在您的Vagrant文​​件中,确保您拥有一个专用主​​机专用网络。我通常有一个固定的IP

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

使用它们现在无论是虚拟机将在主机唯一的网络获取静态IP。当您在Django VM中运行docker-compose up -d时。您的VM将映射端口8080到容器8080。所以,你可以在其他虚拟机使用192.168.33.100:8080用于测试的API

+0

所以我的流浪者设置使用私人主机网络'192.168.33.11'。由于我使用的是VirtualBox,因此我有一个额外的网络适配器'vboxnet1'。 该机器如何与在码头集装箱中运行的应用进行通信。接下来的步骤?更改我的码头撰写文件并添加一个“网络”部分? 然后创建网络,例如? '泊坞窗网创建 --subnet = 192.168.33.0/24 --gateway = 192.168.33.1 -o父= vboxnet1 vboxnetdocker' 书面但只是在寻找在泊坞窗结束步骤,此项不工作流浪者与私人网络建立后。 –

+0

您可以使用'192.168.33.11'从机器ping虚拟机?如果是,那么你只需要在运行码头容器'docker run -p 8080:8080 image'时映射端口。从你的机器192.168.33.11:8080将被访问 –

+0

是从运行的码头集装箱我可以ping流浪的VM,但是我不能ping通码头集装箱,因为它在码头上运行'ifconfig'获得IP地址。换句话说,我可以与外部网络进行通信,但外部不能与容器通信。无论是来自我的主机还是流浪汉。 也许我不清楚,码头集装箱没有运行在流浪汉身上。他们并肩奔跑。这就是为什么我认为在码头一侧需要做一些额外的网络工作才能让流浪者向泊坞员发送请求。 –

0

我想这是在漂浮的运行测试仍然是 能够与现在的 泊坞窗运行Django应用程序,类似于沟通它可以与api沟通的方式,当它在运行在流浪汉中。

正如您所说,您使用的是docker-compose,因此暴露端口会达到您要查找的目的。在定义了django应用程序的yml文件中,创建一个端口映射,将主机上的端口绑定到容器中的端口。您可以通过该这样做:

ports: 
    "<host_port_where_you_want_to_access>:<container_port_where_application_is_running>" 

是否有配置我的码头工人容器和/或无业游民我这样 他们可以互相交谈的方式?我需要暴露我的码头 容器的IP地址,以便我的流浪者可以访问它。

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

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