So the way you need to think about this is that Docker containers have their own network stack (unless you explicitly tell it to share the host's stack with --net=host
). This means ports need to be exposed both inside the docker container and also on the outside (documentation), when linked with host ports. The ports exposed on the container need to be bound to the host ports explicitly (with -p xxxx:yyyy
in your docker run
command) or implicitly (using EXPOSE
in your Dockerfile and using -P
on the command line), like it says here. If your Dockerfile does not contain EXPOSE 8008
, or you do not specify --expose 8008
in your docker run
command, your container can't talk to the outside world, even if you then use -p 8008:8008
in your docker run
command!
So to get tcp/8008 on the host linked with tcp/8008 on the container, you need EXPOSE 8008
inside your Dockerfile (and then docker build
your container) OR --expose 8008
in your docker run command
. In addition, you need to either use -P
to implicitly or -p 8008:8008
to explicitly link that exposed container port to the host port. An example docker run
command to do this might look like:
docker run -it --expose 8008 -p 8008:8008 myContainer
It's handy to remember that in the -p 8008:8008
command line option, the order for this operation is -p HOST_PORT:CONTAINER_PORT
. Also, don't forget that you won't be able to SSH into your container from another machine on the internet unless you also have this port unblocked in iptables on the host. I always end up forgetting about that and waste half an hour before I remember I forgot to iptables -A INPUT ...
for that specific tcp port on the host machine. But you should be able to SSH from your host into the container without the iptables rule, since it uses loopback for local connections. Good luck!
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…