Reputation: 991
I want to run Python HTTP server on docker container.
My DockerFile
looks like this:
FROM continuumio/anaconda3:latest
RUN apt-get -y update
RUN apt-get -y install linux-headers-amd64 build-essential libc-dev gcc
RUN conda install --yes gcc
RUN conda install --yes numpy
RUN conda install --yes scipy
RUN conda install --yes gensim
RUN pip install annoy
RUN conda config --add channels conda-forge
RUN conda install --yes spacy
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
ADD my-app.tar /usr/src/app
WORKDIR /usr/src/app/source
I build the image with:
docker build -t my-app-poc .
Start the container and enter command:
docker run -i -t -p 9998:9998
In the Docker image's bash I run the script:
python Service.py
Which starts correctly:
Wed Apr 5 13:09:51 2017 Server Starts - :9998
But when I enter the address on my host:
http://localhost:9998
Nothing happens. I've tried also put EXPOSE 9998
at the end of my DockerFile
but it wasn't help.
If I enter docker-machine
address on my host:
http://192.168.99.100:9989/
it works. But I want to run that image on regular server, not my local machine - so everything should be exposed to localhost.
I tried it on Windows 7.
Do you have any idea how to run this?
I will be very glad for your help!
Upvotes: 4
Views: 5902
Reputation: 9660
John Patterson's answer basically nailed it, let me add some more things that wouldn't fit in a comment.
If you want to see the logs of your HTTP server (and you should), then add the following to your Dockerfile:
ENV PYTHONUNBUFFERED=1
because by default everything printed to stdout
by Python will go into a buffer and you wouldn't see the server's output with docker logs
unless a considerable amount has already been written.
Also note that EXPOSE
in the Dockerfile brings precious little. According to the Docker documentation:
The EXPOSE instruction does not actually publish the port. It functions as a type of documentation between the person who builds the image and the person who runs the container
which is not much. However, the -P
flag of docker run
maps all EXPOSE
-d ports to some random high-order ports. The best way IMO to specify the port mappings using -p
(lowercase).
Upvotes: 0
Reputation: 31
This may or may not be related, but I cannot add a comment, so a standalone reply you get!
In the Docker container you may have to bind your application to the 0.0.0.0
host. See this link.
It seems to me (though I would have to know more about the app to be certain) that you are looking for a connection on the loop-back interface. This exposes the listener to the local machine only. By contrast, 0.0.0.0
serves to expose the listener to all network interfaces on the machine. Specifially in this case, the docker network adapter. For a more detailed explanation, see this post.
Upvotes: 3
Reputation: 256
From https://docs.docker.com/engine/reference/run/#expose-incoming-ports
The -p expose option can also take an ip address. If you want to also bind to 127.0.0.1 instead, it goes there.
try something like: -p 127.0.0.1:9998:9998
Upvotes: 0
Reputation: 517
What you described is a normal behavior. Docker images are running in a virtualized environment, therefore cannot share the loopback address. What you need to do is to redirect the traffic from your server to your docker image.
This documentation page should have all the answers you need.
Good Luck!
Upvotes: 0