Docker - 容器 IP 地址映射

Docker - Container IP addresses mapping

在Docker中,我有3个容器,分别是node、mysql和redis。当我 运行 sudo iptables -t nat -L -n 时,我可以看到这些容器 运行ning 在不同的 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-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

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

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

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