【问题标题】:Provide static IP to docker containers via docker-compose通过 docker-compose 为 docker 容器提供静态 IP
【发布时间】:2017-01-22 10:33:27
【问题描述】:

我正在尝试为容器提供静态 IP 地址。我知道我必须创建一个自定义网络。我创建了它,并且桥接接口在主机(Ubuntu 16.x)上启动。容器从这个子网获取 IP,但不是我提供的静态 IP。

这是我的 docker-compose.yml:

version: '2'

services:
  mysql:
    container_name: mysql
    image: mysql:latest
    restart: always
    environment:
      - MYSQL_ROOT_PASSWORD=root
    ports:
     - "3306:3306"
    networks:
     - vpcbr

  apigw-tomcat:
    container_name: apigw-tomcat
    build: tomcat/.
    ports:
     - "8080:8080"
     - "8009:8009"
    networks:
     - vpcbr
    depends_on:
     - mysql

networks:
  vpcbr:
    driver: bridge
    ipam:
     config:
       - subnet: 10.5.0.0/16
         gateway: 10.5.0.1
         aux_addresses:
          mysql: 10.5.0.5
          apigw-tomcat: 10.5.0.6

容器得到 10.5.0.2 和 10.5.0.3,而不是 5 和 6。

【问题讨论】:

  • aux-address 用于手动通知 ipam-driver 网络中已使用的 IP 地址
  • 当我为服务分配静态 IP 后,如何使用 'docker compose up -d --scale container-name=3' 来扩展这些容器中的任何一个?

标签: docker docker-compose


【解决方案1】:

请注意,我不建议 Docker 中的容器使用固定 IP,除非您正在做一些允许从外部路由到容器网络内部的操作(例如 macvlan)。 DNS 已经用于容器网络内部的服务发现,并支持容器扩展。在容器网络之外,您应该使用主机上的暴露端口。有了该免责声明,这是您想要的撰写​​文件:

version: '2'

services:
  mysql:
    container_name: mysql
    image: mysql:latest
    restart: always
    environment:
      - MYSQL_ROOT_PASSWORD=root
    ports:
     - "3306:3306"
    networks:
      vpcbr:
        ipv4_address: 10.5.0.5

  apigw-tomcat:
    container_name: apigw-tomcat
    build: tomcat/.
    ports:
     - "8080:8080"
     - "8009:8009"
    networks:
      vpcbr:
        ipv4_address: 10.5.0.6
    depends_on:
     - mysql

networks:
  vpcbr:
    driver: bridge
    ipam:
     config:
       - subnet: 10.5.0.0/16
         gateway: 10.5.0.1

【讨论】:

  • 如何在版本 3 中做到这一点?
  • @Atr_Max 目前,您不能:“注意:其他 IPAM 配置,例如网关,目前仅适用于版本 2。” docs.docker.com/compose/compose-file/#ipam
  • @BMitch 为什么不推荐使用静态 IP?如此处所假设的,这对于 Redis 的安全性是一个好主意吗? github.com/laradock/laradock/issues/986#issuecomment-404596974 非常感谢。
  • @Ryan 静态 IP 不会提高安全性,您仍然需要打开相同的连接,并且您的容器仍将在命名空间网络内运行,您只公开您需要的内容。静态 IP 会降低灵活性,包括对应用程序进行滚动更新的能力,不能在 swarm 模式下工作,并使容器的配置更难在环境或类似容器之间复制。对于链接的问题,您只需要在容器内监听 0.0.0.0 即可。
  • @alvery 我有同样的问题,你需要使用 --force-recreate 选项,因为 docker-compose 不会在已经创建的网络上应用配置(可能是一个错误)
【解决方案2】:

我在使用自定义名称的环境变量时遇到了一些困难(不是容器名称/KAPACITOR_BASE_URL 和 KPACITOR_ALERTS_ENDPOINT 的端口约定)。如果我们在这种情况下提供服务名称,它不会将 ip 解析为

KAPACITOR_BASE_URL:  http://kapacitor:9092

上面的http://[**kapacitor**]:9092 不会解析为http://172.20.0.2:9092

我使用子网配置解决了静态 IP 问题。

version: "3.3"

networks:
  frontend:
    ipam:
      config:
        - subnet: 172.20.0.0/24
services:
    db:
        image: postgres:9.4.4
        networks:
            frontend:
                ipv4_address: 172.20.0.5
        ports:
            - "5432:5432"
        volumes:
            - postgres_data:/var/lib/postgresql/data

    redis:
        image: redis:latest
        networks:
            frontend:
                ipv4_address: 172.20.0.6
        ports:
            - "6379"

    influxdb:
        image: influxdb:latest
        ports:
            - "8086:8086"
            - "8083:8083"
        volumes:
            - ../influxdb/influxdb.conf:/etc/influxdb/influxdb.conf
            - ../influxdb/inxdb:/var/lib/influxdb
        networks:
            frontend:
                ipv4_address: 172.20.0.4
        environment:
          INFLUXDB_HTTP_AUTH_ENABLED: "false"
          INFLUXDB_ADMIN_ENABLED: "true"
          INFLUXDB_USERNAME: "db_username"
          INFLUXDB_PASSWORD: "12345678"
          INFLUXDB_DB: db_customers

    kapacitor:
        image: kapacitor:latest
        ports: 
            - "9092:9092"
        networks:
            frontend:
                ipv4_address: 172.20.0.2
        depends_on:
            - influxdb
        volumes:
            - ../kapacitor/kapacitor.conf:/etc/kapacitor/kapacitor.conf
            - ../kapacitor/kapdb:/var/lib/kapacitor
        environment:
          KAPACITOR_INFLUXDB_0_URLS_0: http://influxdb:8086

    web:
        build: .
        environment:
          RAILS_ENV: $RAILS_ENV
        command: bundle exec rails s -b 0.0.0.0
        ports:
            - "3000:3000"
        networks:
            frontend:
                ipv4_address: 172.20.0.3
        links:
            - db
            - kapacitor
        depends_on:
            - db
        volumes:
            - .:/var/app/current
        environment:
          DATABASE_URL: postgres://postgres@db
          DATABASE_USERNAME: postgres
          DATABASE_PASSWORD: postgres
          INFLUX_URL: http://influxdb:8086
          INFLUX_USER: db_username
          INFLUX_PWD: 12345678
          KAPACITOR_BASE_URL:  http://172.20.0.2:9092
          KAPACITOR_ALERTS_ENDPOINT: http://172.20.0.3:3000

volumes:
  postgres_data:

【讨论】:

    【解决方案3】:

    如果您从未看到静态 IP 地址集,可能是因为您使用的是“docker compose up”。尝试使用“docker-compose up”。

    当我使用“docker-compose up”(带有连字符)时,我现在可以看到分配的静态 IP。

    networks:
      mynet:
        driver: bridge
        ipam:
          driver: default
          config:
            - subnet: 192.168.55.0/24
              gateway: 192.168.55.1
    
    services:
      web:
        image: 'mycompany/webserver:latest'
        hostname: www
        domainname: mycompany.com
        stdin_open: true # docker run -i
        tty: true        # docker run -t
        networks:
          hfnet:
            ipv4_address: 192.168.55.10
        ports:
          - '80:80'
          - '443:443'
        volumes:
          - '../honeyfund:/var/www/html'
    
    

    我浪费了很多时间来解决这个问题。 :(

    【讨论】:

    • 这个答案刚刚解决了一个我处理了一个多星期的问题! ??
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-17
    • 2015-03-12
    • 1970-01-01
    • 1970-01-01
    • 2017-11-25
    • 2022-11-11
    相关资源
    最近更新 更多