Docker - Why does this express.js container with an open / published port reject connections? (using boot2docker)

I have a hello world express.js application inside a docker container. It is configured to run on port 8080, and the docker file opens that port in the image. In addition, I publish the port when I launch the image. However, when I try to make a simple curl request, the connection is rejected. Here is how I set up this test:

My Dockerfile is pretty simple:

FROM node ADD ./src /src WORKDIR /src # install your application dependencies RUN npm install # replace this with your application default port EXPOSE 8080 # replace this with your main "server" script file CMD [ "node", "server.js" ] 

And inside my ./src directory, I have a server.js file that looks like this:

 var express = require('express'); var app = express(); app.get('/', function(req, res){ res.send('Hello World'); }); var server = app.listen(8080, function() { console.log('Listening on port %d', server.address().port); }); 

as well as the base package.json , which looks like this:

 { "name": "hello-world", "description": "hello world test app", "version": "0.0.1", "private": true, "dependencies": { "express": "4.7.2" } } 

The image is just fine:

 β†’ docker build -t jimjeffers/hello-world . Sending build context to Docker daemon 1.126 MB Sending build context to Docker daemon Step 0 : FROM node ---> 6a8a9894567d Step 1 : ADD ./src /src ---> 753466503fbf Removing intermediate container 135dab70dfff Step 2 : WORKDIR /src ---> Running in 12257ff3f990 ---> 010ce4140cdc Removing intermediate container 12257ff3f990 Step 3 : RUN npm install ---> Running in 1a9a0eb9d188 ---> 5dc97c79281e Removing intermediate container 1a9a0eb9d188 Step 4 : EXPOSE 8080 ---> Running in abbaadf8709d ---> 9ed540098ed2 Removing intermediate container abbaadf8709d Step 5 : CMD [ "node", "server.js" ] ---> Running in 63b14b5581cd ---> eababd51b50e Removing intermediate container 63b14b5581cd Successfully built eababd51b50e 

And it starts just fine:

 β†’ docker run -P -d jimjeffers/hello-world ee5024d16a679c10131d23c1c336c163e9a6f4c4ebed94ad4d2a5a66a64bde1d β†’ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ee5024d16a67 jimjeffers/hello-world:latest node server.js About an hour ago Up 11 seconds 0.0.0.0:49158->8080/tcp jovial_engelbart 5d43b2dee28d mongo:2.6 /usr/src/mongo/docke 5 hours ago Up 3 hours 27017/tcp some-mongo 

I can confirm that the server is running inside the container:

 β†’ docker logs ee5024d16a67 Listening on port 8080 

But if I try to fulfill the request, the connection will be rejected.

 β†’ curl -i 0.0.0.0:49158 curl: (7) Failed connect to 0.0.0.0:49158; Connection refused 

Is there something I am missing here? If I run the application without using docker, it works as expected:

 β†’ node src/server.js Listening on port 8080 β†’ curl -i 0.0.0.0:8080 HTTP/1.1 200 OK X-Powered-By: Express Content-Type: text/html; charset=utf-8 Content-Length: 11 ETag: W/"b-1243066710" Date: Mon, 04 Aug 2014 05:11:58 GMT Connection: keep-alive Hello World 
+6
source share
2 answers

I discovered a source of confusion. My machine runs on Mac OSX, and so I installed docker with boot2docker .

So, we repeat the process again:

 β†’ docker run -P -d jimjeffers/hello-world 28431b32b93dbecaa2a8a5b129cbd36eebe8a90f4c20ab10735455d82fa9de37 β†’ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 28431b32b93d jimjeffers/hello-world:latest node server.js 2 hours ago Up 9 minutes 0.0.0.0:49159->8080/tcp stoic_franklin 5d43b2dee28d mongo:2.6 /usr/src/mongo/docke 6 hours ago Up 4 hours 27017/tcp some-mongo 

Finally, the trick was not to connect to my own machine, but to hang from the VM's IP address:

 β†’ boot2docker ip The VM Host only interface IP address is: 192.168.59.103 

So, I finally succeeded when I minimized VM:

 β†’ curl -i 192.168.59.103:49159 HTTP/1.1 200 OK X-Powered-By: Express Content-Type: text/html; charset=utf-8 Content-Length: 11 ETag: W/"b-1243066710" Date: Mon, 04 Aug 2014 04:32:37 GMT Connection: keep-alive 

This is described in detail in the Docker installation guide, but I skipped it because it was closer to the end of the document.

+12
source

After you open the port in your docker file, you also need to tell Docker how to map it from your host system to your container.

Try changing the Docker launch command to something like this:

docker run -p 127.0.0.1:49158:8080 -d jimjeffers/hello-world

Then try: curl'ing:

curl -i 127.0.0.1:49158

0
source

Source: https://habr.com/ru/post/973301/


All Articles