簡體   English   中英

通過 docker-compose 為 docker 容器分配傳出 IP

[英]Assign outgoing IP for docker container via docker-compose

我有一個有 2 個 IP 的服務器,我需要在其上運行 3 個 docker 容器。

一個容器是一個 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,由於路由不起作用,這也不起作用。

看起來這應該是可能的,我只是不確定我是在尋找錯誤的東西還是沒有正確理解文檔。

我設法讓它工作,但之后它需要一個 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是您的網絡的名稱。 這給出了容器的地址。 應該在以下 iptables 命令中使用:

    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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM