2017-09-20 89 views
2

我有一臺服務器有2個IP,我需要運行3個docker容器。通過docker-compose爲Docker容器分配出站IP

一個容器是一個nginx反向代理,它接收第一個IP上的傳入連接。

第二個容器使用相同的IP連接外部,我有這部分工作。

我現在需要做的是建立一個網絡,讓最後一個容器通過第二個IP訪問外部服務,但仍然允許nginx容器訪問它的端口。

有沒有辦法在docker-compose中做到這一點?如果我不必這樣做,我寧願不去kubernetes/swarm路徑。

version: '2' 
services: 
    nginx: 
    image: jwilder/nginx-proxy 
    environment: 
     - VIRTUAL_PORT=8000 
    volumes: 
     - /var/run/docker.sock:/tmp/docker.sock:ro 
    ports: 
     - "80:80" 


    python: 
    depends_on: 
     - nginx 
    image: python:2.7-slim 
    restart: always 
    working_dir: /usr/src/app/ 
     - VIRTUAL_HOST=python.mydomain.com 
    expose: 
    - "8000" 
    volumes: 
    - "./:/usr/src/app/" 
    command: bash -c "~/do_some_stuff.sh" 

我已經嘗試添加一個橋接網絡,但我無法得到它的工作,因爲它似乎仍然使用我的主要IP。然後我嘗試在容器中靜態分配IP,但由於路由不起作用,因此無法工作。

這似乎應該是可能的,我只是不知道我是否正在尋找錯誤的東西或不正確地理解文檔。

回答

1

我設法得到這個工作,但它需要一個iptables命令事後。雖然只需提供外發IP,它可以輕鬆包裝在腳本中以實現全自動化。

我添加了一個自定義的網絡,並分配了到容器:

version: '2' 
    services: 
     nginx: 
     image: fedora:latest 
     command: /bin/bash -c "curl -s ifconfig.co" # Check our external IP 
     networks: 
      - secondaryIP 


    networks: 
     secondaryIP: 
     driver: bridge 
     ipam: 
      config: 
      - subnet: 103.11.0.0/16 

首先,你應該用得到的網絡名稱,你可以找到出有:

docker inspect --format '{{ .HostConfig.NetworkMode }}' <ContainerID> 

一旦你有你可以得到容器的IP:

docker inspect --format '{{ .NetworkSettings.Networks.iptest_secondaryIP.IPAddress }}' <ContainerID> 

其中iptest_secondaryIP是n你的網絡。這給出了容器的地址。這應該在下面的防火牆一起使用的命令:

sudo iptables -t nat -I POSTROUTING -s $IPADDR -j SNAT --to $SourceIP 
  • 注意:您可以通過網絡掩碼此替換IP地址,在這個例子中103.11.0.0/16,這將意味着開始所有容器與該網絡將使用相同的IP

所以把它包起來都用光的腳本:

#!/bin/bash 
    SourceIP=103.11.1.2 # Outgoing IP to use 

    # Gets IP of last launched docker container 
    CID=$(docker ps -q | head -1) 
    # Gets custom network of docker container 
    NETMAP=$(docker inspect --format '{{ .HostConfig.NetworkMode }}' $CID) 
    # Gets ip address of container 
    IPADDR=$(docker inspect --format "{{ .NetworkSettings.Networks.$NETMAP.IPAddress }}" $CID) 
    # Sets up SNAT iptables rule for docker container to use SourceIP for outgoing traffic 
    sudo iptables -t nat -I POSTROUTING -s $IPADDR -j SNAT --to $SourceIP