我在docker compose文件中定义了一个静态IP,但我只能在0.0.0.0上访问它

问题描述 投票:0回答:1

我正在创建一个 docker-compose 文件,以便能够通过我的计算机上的 IP 访问不同的容器。我的 Docker 撰写文件如下:

version: '3.7'

services:
  apache-php8:
    build: ./apache-php8
    volumes:
     - ../webphp8:/var/www/html/web
    ports:
     - 80:80    
    networks:
      web_net:
        ipv4_address: 192.168.100.4

  mysql:
    image: mysql:5.7    
    restart: always
    volumes:
      - ../data:/var/lib/mysql
    ports:
     - 3306:3306
    environment:
      MYSQL_ROOT_PASSWORD: password
      MYSQL_DATABASE: test
      MYSQL_USER: test
      MYSQL_PASSWORD: test
    networks:
      web_net:
        ipv4_address: 192.168.100.3

networks:
  web_net:
    driver: bridge
    driver_opts:
      com.docker.network.enable_ipv6: "false"
    ipam:
      driver: default
      config:
      - subnet: 192.168.100.0/24
        gateway: 192.168.100.1

我希望能够访问 192.168.100.4 上机器上的代码,因为这是我为服务器定义的 IP,但是,我只能在 0.0.0.0 IP 中访问它。我在 Ubuntu 主机上,如果这很重要的话。

你知道这是为什么吗?我需要做什么才能访问 192.168.100.4 上的服务器?

docker docker-compose docker-networking docker-network
1个回答
0
投票

当您在 docker compose 文件中定义端口时,例如:

ports:
 - 80:80

它将容器的端口 80 绑定到所有可用接口上主机的端口 80,通常包括

127.0.0.1
(本地主机)和
0.0.0.0
(本地计算机上的所有 IP 地址)。

这就是为什么您可以通过

0.0.0.0
localhost
访问您的服务。

但是,docker 并不直接将容器 IP 绑定到主机系统。通过

ipv4_adresses
在 docker compose 文件中分配的 IP 地址是内部的。到 docker 桥接网络(在本例中为
web_net
),并且不直接暴露于主机网络接口。

如果您确实想在主机上使用

192.168.100.4
访问容器,您可以执行以下操作:

  1. 使用主机网络:这通常是一个坏主意,因为它绕过了托管的 docker 网络,但它允许您直接将服务绑定到主机的网络
  2. 自定义主机条目:您可以向主机的
    /etc/hosts
    文件添加一个条目,将
    192.168.100.4
    映射回
    localhost
© www.soinside.com 2019 - 2024. All rights reserved.