Docker Nginx:通过IP地址子网限制对容器的访问

ujv3wf0j  于 5个月前  发布在  Nginx
关注(0)|答案(1)|浏览(63)

我已经看到了Restrict access by IP in docker nginx containerRestricting access to a Docker container和类似的问题。

*场景如下:我的电脑和本地主机上有15个用Laravel编写的微服务 ,每个微服务都有自己的NginX容器。所以有15个Nginx。所有Nginx必须连接在一起,并且它们必须只接受来自另一个容器的请求。(不必提及其中一个微服务作为API网关,可以自由接受来自任何IP地址的请求)。为此,我创建了一个网络,如下所示

docker network create --subnet 120.120.130.0/26 common_network

字符串
对于docker-compose文件中的每个Nginx,我都有以下配置

foodlist_nginx:
build:
  context: ./dockerfiles
  dockerfile: nginx.Dockerfile
container_name: nginx
image: nginx
restart: unless-stopped
tty: true
ports:
  - "${MICROSERVICE_A_NGINX_PORT}:80"
networks:       
    common_network:
      ipv4_address: 120.120.130.x
volumes:
  - .:/var/www/html


其中ipv4_address: 120.120.130..x中的x是3到62之间的数字。default.conf的配置为

location / {
    try_files $uri $uri/ /index.php?$query_string;
    allow 120.120.130.0/26;
    deny all;
}


到目前为止,一切都很顺利,但有一个问题。
当我通过localhost:port从我的计算机向Nginx发送请求时,它接受了请求,我发现微服务的Nginx检测到我的计算机的IP地址为120.120.130.1,我不知道为什么。
我将不胜感激,如果你让我知道为什么我的计算机的IP地址是120.120.130.1

更新

这是docker-compose文件

version: '3'

networks:
  common_network:
    external: true
  foodlist_network:
    name: foodlist_network
    driver: bridge

services:
  foodlist_php:
    build:
      context: ./dockerfiles
      dockerfile: php8.1.Dockerfile
    container_name: "foodlist_php"
    image: foodlist_php
    restart: unless-stopped
    tty: true
    networks:
      - foodlist_network
    volumes:
      - .:/var/www/html
    ports:
      - "${FOOD_LIST_PHP_PORT}:9000"
  foodlist_redis:
    image: redis:latest
    container_name: "foodlist_redis"
    command: redis-server --appendonly yes
    restart: unless-stopped
    volumes:
      - redisdata:/dataF
    ports:
      - "${FOOD_LIST_REDIS_PORT}:6379"
    networks:
      - foodlist_network
  foodlist_nginx:
    build:
      context: ./dockerfiles
      dockerfile: nginx.Dockerfile
    container_name: foodlist_nginx
    image: foodlist_nginx
    restart: unless-stopped
    tty: true
    ports:
      - "${FOOD_LIST_NGINX_PORT}:80"
    networks:
        foodlist_network:
        common_network:
          ipv4_address: 120.120.130.6
    volumes:
      - .:/var/www/html
    depends_on:
      - foodlist_php
  foodlist_mysql:
    image: mysql:8.0.0
    container_name: foodlist_mysql
    restart: unless-stopped
    tty: true
    volumes:
      - mysqldata:/var/lib/mysql
    ports:
      - "${FOOD_LIST_MYSQL_PORT}:3306"
    environment:
      MYSQL_USER: ${DB_USERNAME}
      MYSQL_PASSWORD: ${DB_PASSWORD}
      MYSQL_DATABASE: ${DB_DATABASE}
      MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
      MYSQL_ROOT_HOST: '%'
      SERVICE_TAGS: "foodlist"
    command: ['mysqld', '--character-set-server=utf8mb4', '--collation-server=utf8mb4_unicode_ci']
    networks:
      - foodlist_network
volumes:
  mysqldata:
    driver: local
  redisdata:
    driver: local

zte4gxcn

zte4gxcn1#

删除ports:行中你不想被外部看到的内容。你还应该考虑删除手动IP地址分配,甚至可能删除所有的networks:块。
容器通常不能从Docker外部访问,除非您为其声明ports:(或等效的docker run -p)。由于这是您的基本要求,因此您可以在这里使用Docker的功能,而不是试图弄清楚手动IP地址分配和IP ACLing。
我可能会尝试将Compose文件的这一部分缩减为:

version: '3.8'
services:
  foodlist_nginx:
    build:
      context: .
      dockerfile: ./dockerfiles/nginx.Dockerfile
    restart: unless-stopped
networks:
  default:
    name: common_network
    external: true

字符串
特别是对于网络配置,我已经将default网络配置为使用docker network create网络,然后依赖于Compose将内容单独附加到default。我没有设置ports:,因此容器将无法从Docker外部访问。
作为一种变体,您还可以设置ports:,以便容器可以访问,但只能从当前主机访问,而不能在其他地方访问,方法是告诉Docker绑定到主机的127.0.0.1 localhost接口(注意,这与微服务容器的localhost或任何Nginx代理的localhost不同)。

ports:
  - '127.0.0.1:${MICROSERVICE_A_NGINX_PORT}:80'

相关问题