2017-08-07 100 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不需要映射到主機或不需要暴露。