通过docker-compose为Docker容器分配出站IP

我有一个服务器有2个IP,我需要运行3个docker集装箱。

一个容器是一个nginx反向代理,它接收第一个IP上的传入连接。

第二个容器使用相同的IP来连接外部,我有这部分工作。

我现在需要做的是build立一个networking让最后一个容器通过第二个IP访问外部服务,但是仍然允许nginx容器访问它的端口。

在docker-compose中有没有办法做到这一点? 如果我不需要的话,我宁愿不要去kubernetes / swarmpath。

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" 

我已经试图添加一个桥梁networking,但我无法得到它的工作,因为它似乎仍然使用我的主要IP。 然后我尝试在容器中静态分配IP,由于路由不起作用,因此无法工作。

这似乎应该是可能的,我只是不知道如果我正在寻找错误的东西或不正确地理解文档。

我设法得到这个工作,但是之后它需要一个iptables命令。 虽然只需提供外发的IP,它可以很容易地包装在一个脚本中,实现全自动化。

我添加了一个自定义networking,并将其分配给容器:

  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 

首先,您应该使用获取networking名称,您可以find:

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

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

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

其中iptest_secondaryIP是您的networking的名称。 这给出了容器的地址。 在下面的iptables命令中应该使用哪一个:

  sudo iptables -t nat -I POSTROUTING -s $IPADDR -j SNAT --to $SourceIP 
  • 注意:在这个例子中,你可以把IP地址replace成networking的掩码,在这个例子中,这意味着所有启动该networking的容器都将使用相同的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