Docker-容器IP地址映射

时间:2018-11-12 06:32:00

标签: docker mapping ip-address

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

enter image description here

但是,每次执行172.23.0.x时,服务的IP地址顺序和IP地址(在某些机器上为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"

2 个答案:

答案 0 :(得分:1)

您可以尝试通过定义具有桥接连接的网络(包括该定义的网络的子网网关)来尝试这种类型的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
    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

答案 1 :(得分:1)

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

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

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