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

how to make a non-hardcoded URL path in docker image to call backend service?

我是 docker 的新人。让我描述一下我的场景: 我为 Web 应用程序制作了 2 docker 个图像。一张图片是用于展示的前端 web 层,另一张是提供 REST 服务的后端层。

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

因为如果我的笔记本电脑的IP改变了或者其他人想使用我的图像,他们就无法获得服务...所以我如何才能使URL变量使我的前端图像可以用于其他没有重建?

谢谢!

您可以通过在 运行 容器时将环境变量传递给 docker 容器来做到这一点。

像这样:

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

而在 back-end 上,假设您使用的是 NodeJS,您可以:

var backend_ip   = process.env.MY_APP_BACKEND_IP;

注意:不是 NodeJS 专业人士,但一些谷歌搜索告诉我如何去做

从 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 or you can follow a guide like this Composing Multi-container Networks with Docker Compose

中阅读更多相关信息