【问题标题】:Docker - Container IP addresses mappingDocker - 容器 IP 地址映射
【发布时间】:2019-04-14 20:47:33
【问题描述】:

在 Docker 中,我有 3 个容器,分别是 node、mysql 和 redis。当我运行 sudo iptables -t nat -L -n 时,我可以看到这些容器在不同的 IP 地址上运行,如下所示

但是,服务的 IP 地址顺序和 IP 地址(在某些机器上是 172.23.0.x,在某些机器上是 172.21.0.x)可能每次我执行 docker-compose up --build 时都不同,所以如果我希望应用程序正常工作,我必须手动为每个服务配置 IP 地址。有什么方法可以自动为docker-compose.yml 文件中的每个服务映射一个固定的IP 地址?谢谢。这是我的docker-compose.yml 文件:

version: "3"
services:
  universe:
    build: .
    working_dir: /usr/src
    volumes:
      - .:/usr/src
      - /usr/src/node_modules/
    ports:
      - "3000:3000"
      - "8000:8000"
    restart: always

  # Redis Alpine
  redis:
    image: redis:alpine
    ports:
    - "127.0.0.1:6379:6379"

  # MySQL 5.7
  mysql:
    build:
      context: ./docker/mysql
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: database_name
      MYSQL_USER: database_user
      MYSQL_PASSWORD: database_password
    volumes:
    - /config/scripts:/docker-entrypoint-initdb.d
    restart: always
    ports:
    - "127.0.0.1:3306:3306"

【问题讨论】:

  • 不要将信息发布为可以是文本的图像。

标签: docker mapping ip-address


【解决方案1】:

您可以尝试这种类型的 docker-compose.yml 配置,定义一个具有桥接连接的网络,包括该定义的网络的 subnetgateway

version: "3"
services:
  universe:
    build: .
    working_dir: /usr/src
    volumes:
      - .:/usr/src
      - /usr/src/node_modules/
    ports:
      - "3000:3000"
      - "8000:8000"
    restart: always
    networks:
      vpcbr:
        ipv4_address: 10.3.0.2

  # Redis Alpine
  redis:
    image: redis:alpine
    ports:
    - "6379:6379"
    networks:
      vpcbr:
        ipv4_address: 10.3.0.3

  # MySQL 5.7
  mysql:
    build:
      context: ./docker/mysql
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: database_name
      MYSQL_USER: database_user
      MYSQL_PASSWORD: database_password
    volumes:
    - /config/scripts:/docker-entrypoint-initdb.d
    restart: always
    ports:
    - "3306:3306"
    networks:
      vpcbr:
        ipv4_address: 10.3.0.4

networks:
  vpcbr:
    driver: bridge
    ipam:
     config:
       - subnet: 10.3.0.0/16
         gateway: 10.3.0.1

【讨论】:

  • 谢谢。它可以在没有最后一行的情况下工作 (gateway)。如果最后一行在那里,我得到networks.vpcbr.ipam.config value Additional properties are not allowed ('gateway' was unexpected)。使用10.3.0.x的目的是什么?我可以将其更改为 localhost (127.0.0.1)。
  • 好吧,将 docker-compose 更改为版本 2 将使 gateway 工作
  • @TriNguyen 在这种情况下你不能使用 localhost ip 地址。通常我们使用 172.0.0.0 私有范围 ip 地址以及 10.0.0.0 私有 ip 范围来处理 docker 环境中的私有网络。跨度>
  • 不需要任何配置。开箱即用的 Docker Compose 将为您创建一个 Docker 网络,您可以通过 DNS 名称在容器之间进行通信。您不能使用此配置使 localhost 或 127.0.0.1 具有不同的含义(它总是在 Docker 上下文中表示“此容器”)。
【解决方案2】:

在您展示的 Docker Compose 设置中,要在容器之间进行通信,您可以使用服务的名称(universeredismysql)作为普通主机名,它们会解析到容器的内部 IP 地址,不管它是什么。

请注意,如果您使用 ports: 选项重新映射已发布的端口,您仍然需要连接到 internal 端口(冒号右侧的端口)。例如,即使您指定了不同的外部端口映射或根本没有指定端口映射,您也会连接到 mysql:3306

这在 Docker 空间之外不起作用;在那里,您使用已发布的ports: 连接到主机的 DNS 名称或 IP 地址,而 Docker 的事实对您完全隐藏。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-20
    • 2013-09-15
    • 1970-01-01
    • 1970-01-01
    • 2022-08-15
    • 1970-01-01
    相关资源
    最近更新 更多