我一直在读:https://docs.docker.com/engine/userguide/networking/#user-defined-networks
我已经创建了自己的网络(docker network create --driver bridge devils_network
):
441be50f3792 bridge bridge local
0d73f7c6fe00 devils_network bridge local
8e189dda9fef host host local
5ebca4a1e514 none null local
我这样运行容器:
docker run -it -d -v ~/dockervolume/deus:/srv/www --name deus --hostname deus --network=devils_network -p 80:8080 karl/node
并在dockerfile中公开端口8080:
EXPOSE 8080
我已将终端会话附加到容器并检查容器以确保 Web 服务器已启动并正在运行:
root 17 0.0 0.1 4508 660 ? S 22:46 0:00 sh -c NODE_PATH="$(pwd)" NODE_ENV=production node hello_world
root 19 0.0 4.3 882896 22004 ? Sl 22:46 0:00 node hello_world
Web 服务器正在使用 Docker 容器内的端口 8080。
我在 DigitalOcean droplet 上运行。如果我直接在主机上启动服务器而不是通过 docker 容器,它就可以正常工作。
答案1
- 您需要将映射 -p 80:8080 反转为 -p 8080:80 第一个端口在主机上,第二个端口在容器上。
- 在您的工作/家庭网络上,确保在您的路由器/fw 中将端口 8080 重定向到您的 docker 主机端口 8080。
这应该可以工作:这是我对 nginx 容器执行的相同步骤:
docker network create --driver bridge devils_network
4320854ef67c5489848c1e1f14ffaf4d65183c5e3fac5f655c038bb15aa50df7
docker run -it -v ~/dockervolume/deus:/usr/share/nginx/html --name deus --hostname deus --network=devils_network -p 8080:80 ajnouri/nginx
root@deus:/#
复制了索引.php文件到〜/ dockervolume / deus:
并从我的手机上浏览了我的公共IP:
答案2
哎呀。我之前在我的 Node.js 应用程序中使用过以下内容:
const hostname = '127.0.0.1';
const port = 8080;
我将其改为:
const hostname = '0.0.0.0';
const port = 8080;
现在它正常工作了。我之所以使用它,127.0.0.1
是因为我习惯使用反向代理 (HAProxy) 来处理这个问题。但是我希望 docker 容器直接连接到互联网,而不是通过反向代理。