1

I am a docker newbie and this is a newbie question :) I am running Docker Engine from Ubuntu 18.04 in WLS2. When I run my container, I cannot connect to it from a WSL2 bash.

Here is my Dockerfile

FROM node:18.4-alpine3.15

WORKDIR /usr/src/app

# see https://nodejs.org/en/docs/guides/nodejs-docker-webapp/#creating-a-dockerfile
COPY package*.json ./
RUN npm ci

COPY . .

EXPOSE 3000

CMD [ "node", "./src/main.js" ]

This is how I (successfully) build my image out of it

 docker build . -t gb/test

This is how I run my container

docker run --rm -p 3000:3000 --name gbtest gb/test

# tried also this one with no luck
#docker run --rm -P --name gbtest gb/test

My server starts successfully, but I cannot understand how to reach it via curl. I tried all of the following with no success

curl http://localhost:3000
curl http://127.0.01:3000
curl http://127.17.01:3000 <- gather with ifconfig

I tried also what suggested by > this < answer, but it didn't work.

# start container with --add-host
docker run --rm -p 3000:3000 --add-host host.docker.internal:host-gateway --name gbtest gb/test

# try to connect with that host
curl http://host.docker.internal:3000

Note that the NodeJS server I am developing is connecting to the right port as:

  • it states in its output that it connects to http://127.0.0.1:3000
  • when I run it directly, so without docker, I can connect with just curl http://localhost:3000

Should you need any further info, just let me know.

EDIT 1

Here is my main.js file, basically the base example from Fastify.

import Fastify from "fastify";

// Require the framework and instantiate it
const fastify = Fastify({ logger: true });

// Declare a route
fastify.get("/", async (request, reply) => {
  return { hello: "world" };
});

// Run the server!
const start = async () => {
  try {
    await fastify.listen({ port: 3000 });
  } catch (err) {
    fastify.log.error(err);
    process.exit(1);
  }
};

start();

Here are my container logs

$ docker logs gbtest
{"level":30,"time":1655812753498,"pid":1,"hostname":"8429b2ed314d","msg":"Server listening at http://127.0.0.1:3000"}

I also tried to use host network like below. It works, but I am not sure it is the way to go. How am I supposed to expose a container to the internet? Is it OK to share the whole host network? Does it come with any security concerns?

docker run --rm --network host --name gbtest gb/test

1 Answers1

0

Changing await fastify.listen({ port: 3000 }); to await fastify.listen({ host: "0.0.0.0", port: 3000 }); did the trick.

As you guys pointed out, I was binding to container-private localhost by default, while I want my container to respond to outer connections.

New output of docker logs gbtest is

{"level":30,"time":1655813850993,"pid":1,"hostname":"8e2460ac00c5","msg":"Server listening at http://0.0.0.0:3000"}