如何在docker镜像中创建一个非硬编码的URL路径来调用后端服务?

时间:2017-02-14 02:11:50

标签: url docker microservices docker-swarm docker-image

我是码头工人的新手。让我来描述一下我的情景: 我为Web应用程序制作了2个docker镜像。一个图像是用于演示的前端Web层,另一个是提供REST服务的后端层。

所以我需要为这2张图片运行2个容器。前端呼叫后端服务。现在我需要在前端代码中编写后端的URL并构建映像......我不认为这是微服务的正确方法......

因为如果我的笔记本电脑的IP发生变化或者其他人想要使用我的图像,他们就无法获得服务......那么如何制作URL变量并使我的前端图像可以用于其他人而无需重建?

THX!

2 个答案:

答案 0 :(得分:1)

从Docker 1.10开始,您可以使用networking。这样做是将docker容器的ip地址绑定到可以在容器中使用的主机名。

如果您使用docker-compose,则会自动创建一个网络,这两个服务可以相互通信。以下是一个例子:

version: "2"

services:
  frontend:
    image: nginx
    networks:
      - my-network
    environment:
      BACKEND_URL: "http://backend"
  backend:
    image: mariadb
    networks:
      - my-network
    environment:
      FRONTEND_URL: "http://frontend"

networks:
  my-network:
    driver: bridge

您可以在Getting started with multi-host networking可用here中详细了解相关信息,也可以按照Composing Multi-container Networks with Docker Compose这样的指南进行阅读

答案 1 :(得分:0)

您可以通过在运行时将环境变量传递给docker容器来完成此操作。

类似的东西:

docker run --name frontend -e MY_APP_BACKEND_IP="192.168.7.2" -e MY_APP_BACKEND_PORT="3000" ...

在后端,让我们说你正在使用NodeJS,你可以这样做:

var backend_ip   = process.env.MY_APP_BACKEND_IP;

注意:不是NodeJS专业人士,但有些谷歌搜索告诉我该怎么做