在Docker中,我有3个容器,分别是节点,mysql和redis。当我运行sudo iptables -t nat -L -n
时,我可以看到这些容器正在不同的IP地址上运行,如下所示
但是,每次执行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"
答案 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设置中,要在容器之间进行通信,可以将服务的名称(universe
,redis
,mysql
)用作普通主机名称,它们就会解析为容器的内部IP地址,无论它是什么。
请注意,如果您使用ports:
选项来重新映射已发布的端口,则仍然需要连接到内部端口(冒号右侧的端口) 。例如,即使您指定了其他外部端口映射或根本没有端口映射,您也将连接到mysql:3306
。
这在Docker空间之外不起作用;在这里,您可以使用发布的ports:
连接到主机的DNS名称或IP地址,而Docker的事实对您完全不可见。