Docker - 容器 IP 地址映射
Docker - Container IP addresses mapping
在Docker中,我有3个容器,分别是node、mysql和redis。当我 运行 sudo iptables -t nat -L -n
时,我可以看到这些容器 运行ning 在不同的 IP 地址上,如下所示
但是,服务的 IP 地址顺序和 IP 地址(在某些机器上是 172.23.0.x
,在某些机器上是 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"
您可以尝试这种类型的 docker-compose.yml 配置,定义一个具有网桥连接的网络,包括 subnet 和 gateway 对于该定义的网络。
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
在您的 Docker Compose 设置中,如您所示,要在容器之间进行通信,您可以使用服务名称(universe
、redis
、mysql
) 作为普通主机名,它们将解析为容器的内部 IP 地址,无论它是什么。
请注意,如果您使用 ports:
选项重新映射已发布的端口,您仍然需要连接到 internal 端口(右边那个结肠的一侧)。例如,即使您指定了不同的外部端口映射或根本没有端口映射,您也会连接到 mysql:3306
。
这在 Docker space 之外不起作用;在那里,您使用已发布的 ports:
连接到主机的 DNS 名称或 IP 地址,而 Docker 的事实对您完全隐藏。
在Docker中,我有3个容器,分别是node、mysql和redis。当我 运行 sudo iptables -t nat -L -n
时,我可以看到这些容器 运行ning 在不同的 IP 地址上,如下所示
但是,服务的 IP 地址顺序和 IP 地址(在某些机器上是 172.23.0.x
,在某些机器上是 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"
您可以尝试这种类型的 docker-compose.yml 配置,定义一个具有网桥连接的网络,包括 subnet 和 gateway 对于该定义的网络。
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
在您的 Docker Compose 设置中,如您所示,要在容器之间进行通信,您可以使用服务名称(universe
、redis
、mysql
) 作为普通主机名,它们将解析为容器的内部 IP 地址,无论它是什么。
请注意,如果您使用 ports:
选项重新映射已发布的端口,您仍然需要连接到 internal 端口(右边那个结肠的一侧)。例如,即使您指定了不同的外部端口映射或根本没有端口映射,您也会连接到 mysql:3306
。
这在 Docker space 之外不起作用;在那里,您使用已发布的 ports:
连接到主机的 DNS 名称或 IP 地址,而 Docker 的事实对您完全隐藏。