我有一台带有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,这不起作用,因为路由不起作用。
看起来这应该是可能的,我只是不确定我是在寻找错误的东西还是不能正确理解文档。
答案 0 :(得分:2)
我设法让这个工作,但之后需要一个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
所以要把它全部包装在一个脚本中:
#!/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