在Dockerfile中动态添加Docker容器ip(redis)

时间:2019-06-25 07:48:22

标签: docker dockerfile

如何在其他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还是可以使用任何环境变量。

2 个答案:

答案 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地址。

请按照以下步骤操作:

  1. 首先,为容器创建一个网络: docker network create my-network

  2. 开始重做:docker run -d --network=my-network --name=redis redis

  3. 编辑Java应用程序的Dockerfile,将-Dspring.redis.host=172.17.0.2"替换为-Dspring.redis.host=redis",然后重新构建。

  4. 最后启动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。