Home > Blockchain >  Local and docker development IP resolution for one container to reach another
Local and docker development IP resolution for one container to reach another

Time:12-27

Let's assume we have two backend apps, where backend_for_frontend needs to fetch some data from api.

If both apps are run in docker or api runs in docker and backend_for_frontend runs locally, backend_for_frontend can use http://host.docker.internal:3001/api address to connect to api.

If both apps are run locally(not in docker) then backend_for_frontend needs to use http://127.0.0.1:3001/api for api connection.

Issue is that when we switch running api between docker or locally, we need to use different ip for backend_for_frontend that needs to be manually changed because backend_for_frontend doesn't know how we run api.

Is there a way to resolve this ip somehow automatically or use ip as env variable that will work in any case? Basically I want to run backend_for_frontend and api in any combination, while connection url for backend_for_frontend still can be resolved not by hand.


docker.compose example:

services:
  api:
    ports:
      - 3001:3001

  backend_for_frontend:
    ports:
      - 3002:3002

CodePudding user response:

That's a very common configuration scenario and you'll usually solve it by setting an environment variable in backend_for_frontend to the URL of the API.

Let's call the environment variable API_URL. Then you can do

services:
  api:
    ports:
      - 3001:3001

  backend_for_frontend:
    ports:
      - 3002:3002
    environment:
      - API_URL=http://api:3001/

Then, when you run the API locally, you'd change it to http://host.docker.internal:3001/.

You'll need to change your backend_for_frontend code to fetch the URL from the environment variable. There's no universal way of doing it and it depends on what language your backend_for_frontend is coded in.

If you have an URL that you want to be the default, you can add an ENV statement to the backend_for_frontend Dockerfile to set it. Then you only need to specify it in your docker-compose file when you want to override it.

CodePudding user response:

It can be achieved via using hostname instead of using direct IP address to access the API.

this will give flexibility to use hostname regardless of API running locally or on Docker.

for example, it can be used http://api:3001/api as the base URL for the API in backend_for_frontend, and then set up Docker Compose file to define a hostname for the api service:

services:
  api:
    hostname: api
    ports:
      - 3001:3001

  backend_for_frontend:
    ports:
      - 3002:3002 

CodePudding user response:

Hello it's just the same as if you don't dockerize, call them by your port and socket

Your first api will call by : http://localhost:3001

And the seconds will be http://localhost:3002

P.s you can use a network so they are in an internal network

That's all

  • Related