如何在其他Dockerfile中动态添加容器ip(我正在运行两个容器a)Redis b)java应用程序。 我需要在运行时将redis url传递给我的java参数
当前,我正在手动检查redis ip并将其复制到Dockerfile中。然后使用redis ip for Java应用程序创建新映像。
docker run --name my-redis -d redis
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' my-redis
在Dockerfile中(Java应用程序)
CMD ["-Dspring.redis.host=172.17.0.2", "-jar", "/apps/some-0.0.1-SNAPSHOT.jar"]
我可以使用任何脚本来更新DockerFile还是可以使用任何环境变量。
答案 0 :(得分:0)
您可以在运行dokcer容器时为其分配一个静态IP地址,具体步骤如下:
1-创建自定义网络:
docker network create --subnet=172.17.0.0/16 redis-net
2-运行redis容器以使用指定的网络,并分配IP地址:
docker run --net redis-net --ip 172.17.0.2 --name my-redis -d redis
届时,您将拥有172.17.0.2
容器的静态IP地址my-redis
,则不再需要检查它。
3-现在可以运行Java应用容器,但必须使用相同的网络:
docker run --net redis-net my-java-app
当然,您可以使用env变量或任何您认为方便的设置来优化解决方案。
更多信息可以在官方文档中找到(搜索--ip
):
编辑(添加docker-compose):
我只是发现还可以使用docker-compose分配静态ip,this answer给出了一个示例。
这是一个类似的例子,以防万一:
version: '3'
services:
redis:
container_name: redis
image: redis:latest
restart: always
networks:
vpcbr:
ipv4_address: 172.17.0.2
java-app:
container_name: java-app
build: <path to Dockerfile>
networks:
vpcbr:
ipv4_address: 172.17.0.3
depends_on:
- redis
networks:
vpcbr:
driver: bridge
ipam:
config:
- subnet: 172.17.0.0/16
gateway: 172.17.0.1
官方文档:https://docs.docker.com/compose/networking/
希望这可以帮助您找到路。
答案 1 :(得分:0)
您应该将容器添加到同一网络中。然后,在运行时,您可以使用该名称来引用具有其名称的容器。容器的名称是网络中的主机名。因此,在运行时它将被解析为容器的IP地址。
请按照以下步骤操作:
首先,为容器创建一个网络:
docker network create my-network
开始重做:docker run -d --network=my-network --name=redis redis
编辑Java应用程序的Dockerfile,将-Dspring.redis.host=172.17.0.2"
替换为-Dspring.redis.host=redis"
,然后重新构建。
最后启动Java应用程序容器:docker run -it --network=my-network your_image
。 (可选)您可以为容器定义一个名称,但这不是必需的,因为您不会从redis容器访问Java应用程序的容器。
或者,您可以使用docker-compose
文件。默认情况下,docker-compose
创建用于运行服务的网络。我不知道您的完整设置,因此我将提供一个示例docker-compose.yml
来说明主要概念。
version: "3.7"
services:
redis:
image: redis
java_app_image:
image: your_image_name
通过两种方式,您都可以使用容器的主机名从Java应用程序动态访问redis容器,而无需提供静态ip。