我已经看到了Restrict access by IP in docker nginx container,Restricting 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
型
1条答案
按热度按时间zte4gxcn1#
删除
ports:
行中你不想被外部看到的内容。你还应该考虑删除手动IP地址分配,甚至可能删除所有的networks:
块。容器通常不能从Docker外部访问,除非您为其声明
ports:
(或等效的docker run -p
)。由于这是您的基本要求,因此您可以在这里使用Docker的功能,而不是试图弄清楚手动IP地址分配和IP ACLing。我可能会尝试将Compose文件的这一部分缩减为:
字符串
特别是对于网络配置,我已经将
default
网络配置为使用docker network create
网络,然后依赖于Compose将内容单独附加到default
。我没有设置ports:
,因此容器将无法从Docker外部访问。作为一种变体,您还可以设置
ports:
,以便容器可以访问,但只能从当前主机访问,而不能在其他地方访问,方法是告诉Docker绑定到主机的127.0.0.1 localhost接口(注意,这与微服务容器的localhost或任何Nginx代理的localhost不同)。型