当前位置: 首页 > 知识库问答 >
问题:

通过docker-compose向docker容器提供静态IP

锺霍英
2023-03-14

我正在尝试向容器提供静态IP地址。我知道我必须创建一个自定义网络。我创建它并且桥接接口在主机(Ubuntu 16. x)上。容器从此子网获取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。

共有3个答案

巫化
2023-03-14

如果你从来没有看到静态IP地址集,也许这可能是因为你正在使用“docker组成了”。尝试使用“docker-compose up”。

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

networks:
  hfnet:
    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'

我浪费了很多时间才弄明白(

通迪
2023-03-14

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

KAPACITOR_BASE_URL:  http://kapacitor:9092

在上面的超文本传输协议://[**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:
孟高峰
2023-03-14

请注意,我不建议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
 类似资料:
  • 问题内容: 我正在尝试为容器提供静态IP地址。我了解我必须创建一个自定义网络。我创建了它,并且桥接接口在主机(Ubuntu 16.x)上已启动。容器从该子网获取IP,但不是我提供的静态IP。 这是我的docker-compose.yml: 容器得到10.5.0.2和10.5.0.3,而不是5和6。 问题答案: 请注意,除非您做的事情允许容器网络从外部路由到内部(例如,macvlan),否则我不建议

  • 我有两个容器 - 一个包含 react 应用程序,另一个包含烧瓶应用程序。 我可以使用下面的docker-compose文件和它们各自的Dockerfile构建两者,并且能够通过指定端口上的浏览器访问每个。但是,我的React应用程序对Flask的API调用没有被检索(它们在图片中没有Docker的情况下工作)。 任何建议都非常感谢! Docker-撰写 用于烧瓶应用程序的Dockerfile D

  • 问题内容: 我有一个在定义的多个Docker容器上运行的应用程序。我的用户一切正常,输出如下所示: 现在,我试图运行与(见相关部分以下),问题是,容器现在命名,并且,这是他们创造了从无到有,并在原容器的所有自定义都将丢失。 我尝试重命名容器,但是它给出一个错误消息,指出已经有一个使用该名称的容器。 问: 是否有某种方法可以强制重用现有容器,而不是根据各自的映像创建新容器? 主管 问题答案: 只要容

  • 我正在docker容器中设置一个应用程序。我希望这个应用程序能够与localstack堆栈容器localstack文档连接。当我运行时,容器会成功启动。我可以运行docker-compose文件中未包含的独立java应用程序,它将成功连接到localstack容器。但与localstack一起启动的应用程序无法连接。我看过docker文档和localstack文档,我想不出如何让这些东西彼此通信。

  • 问题内容: 我正在尝试部署使用docker-compose构建的应用程序,但是感觉好像我朝着完全错误的方向前进。 我的一切工作都在本地进行-通过适当的网络和主机启动我的应用程序。 我希望能够在生产机器上运行容器和网络的相同配置,而只是使用不同的文件。 我当前的工作流程如下所示: 在这一点上,我希望当它们到达那里时能够再次运行,但这试图根据文件重建容器。 我有一种明显的失落感。我是否应该通过完整的应

  • 我现在尝试在启动Docker容器时分配静态IP172.17.0.1。 我使用端口2122作为该容器的ssh端口,以便让该容器侦听端口2122。 这个命令将运行一个带有随机IP的Docker容器,如172.17.0.5,但我需要为容器分配一个特定的IP。 下面的shell脚本是我在高级网络设置中引用Docker文档的部分。 此shell脚本将分配一个静态IP 172.17.0.1并链接到world