gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 17:51:51 24 4
gpt4 key购买 nike

我有一个有 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

    关于docker - 通过 docker-compose 为 docker 容器分配传出 IP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46320559/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com