【问题标题】:How to expose docker container over internet using windows如何使用 Windows 在 Internet 上公开 docker 容器
【发布时间】:2019-11-14 16:49:40
【问题描述】:

我已将路由器配置为在我的本地计算机 IP 地址上公开 http 80: 即“192.168.0.79”,并公开入站和出站 IP 地址,包括允许通过防火墙。为了这个例子的目的,让我们说它的“200.200.200.200”

我有一个节点服务器在同一个 IP 地址上本地运行,当我访问我暴露的 IP 地址时,我可以看到“hello world”,例如:在我的网络浏览器上的 200.200.200.200。这行得通。

import yargs from 'yargs';
import express from 'express';
const app = express();

const argv = yargs.argv;
const host = argv.host ;
const port = argv.port;

app.get('/', (req, res) => res.send('Hello World!'));

app.listen(port, host, function() {
  console.log('listening on ', host, ':', port);
});

当我停止节点服务器并在同一 IP 地址上运行 docker 容器时,如下所示:

docker run -p 192.168.0.79:80:8080 -p 50000:50000 --name myjenkins -v %cd%/jenkins:/var/jenkins_home jenkins/jenkins

我可以在我的机器上本地看到它,但是当尝试从外部网络浏览器访问它时,例如:“200.200.200.200”它只是返回 - HTTP ERROR 504

我还需要通过 docker 容器公开其他内容以使其在线可见吗?

我在使用 nginx 映像时遇到了同样的问题。所以我确信我的 docker 参数中缺少一些东西。

Dockerfile

FROM nginx:alpine

RUN rm /etc/nginx/conf.d/default.conf

COPY dist /usr/share/nginx/html/dist

COPY nginx/default.conf /etc/nginx/conf.d/
docker build -t nginx_image .
docker run -p 192.168.0.79:80:8080 nginx_image

【问题讨论】:

  • 在某些情况下,您的 ISP 可能会阻止外部访问端口 80
  • host的值是多少?
  • 主机是 192.168.0.79

标签: docker ip-address router


【解决方案1】:

听起来像是回程路线问题。登录到您的 docker 容器并查看是否可以 ping 8.8.8.8。还运行 netstat -r 并查看默认路由是什么。它应该是防火墙的内部 IP 地址。

【讨论】:

  • 谢谢。 docker exec -it myjenkins ping 8.8.8.8 永久返回 - 来自 8.8.8.8 的 64 个字节:icmp_seq=40 ttl=37 time=14.9 ms。 ```
  • netstat -r 返回了活动路由之一:192.168.0.79 255.255.255.255 On-link 192.168.0.79 281
  • 您可以登录防火墙并从那里成功 ping 192.168.0.79 吗?
  • 天空路由器。不知道该怎么做。
【解决方案2】:

好的,经过大量详尽的研究,似乎暴露这些容器的窗口可能存在问题。或者,将这个容器代理到外部可能更先进。

我的解决方案。在我的机器上创建一个代理到本地主机的节点服务器。

第 1 步 - 获取以太网上这台特定台式计算机的 IP 地址

开始> cmd

ipconfig 
Ethernet adapter Ethernet 4 (Yours will be different. Which ever is connected to the internet):
...
   IPv4 Address. . . . . . . . . . . : 192.168.0.79

第 2 步 - 配置路由器、sky 或其他,以将此 ip 暴露给互联网

  • 访问192.168.0.2
user: admin
pass: sky  
  • 高级 > LAN IP 设置 > LAN TCP/IP 设置

LAN TCP/IP Setuphelp

IP Address:
192. 168. 0. 1

IP Subnet Mask:
255. 255. 255. 0

TICK - Use Router as DHCP Serverhelp

Starting IP Address:
192. 168. 0. 2

Ending IP Address:
192. 168. 0. 254
  • 地址预订 > 添加 命令

ip address: 192.168.0.79
Mac adress: (This number will look something like 4c:a2:e0 etc.... - can by got by going to a website and typing whats my ip)
Device Name: (Right click my computer > properties) MYCOMPUTERNAME 
  • 安全 > 防火墙规则 > 出站服务 > 编辑

Service: http: tcp 80
action: allow always
access from: any
0 0 0 0
  • 安全 > 防火墙规则 > 入站服务 > 编辑

Service: http: tcp 80
action: allow always
Destination IPv4 LAN address: 192.168.0.79
access from: any

第 3 步 - 创建一个 docker 容器(即 jenkins),默认为 localhost,并将端口暴露在 80 以外的其他端口,即 81。(我们需要 80,通过我们的路由器暴露)

  • 在 localhost:81 上创建 docker 容器
docker run -p 81:8080 -p 50000:50000 --name myjenkins -v %cd%/jenkins:/var/jenkins_home jenkins/jenkins

第 4 步 - 创建一个节点服务器或等效的,将公开的 IP 地址代理到此本地主机

  • 创建一个将 192.168.0.79 重定向到 localhost:81 的代理服务器
import express from 'express';
import httpProxy from 'http-proxy';

const app = express();

const host = '192.168.0.79' ;
const port = '80';

const apiProxy = httpProxy.createProxyServer();

app.all('/*', (req, res) => {
  console.log('redirecting to docker container - http://localhost:81');
  apiProxy.web(req, res, {target: 'http://localhost:81'});
});


app.listen(port, host, function() {
  console.log('listening on ', host, ':', port);
});

第 5 步 - 在网络浏览器中输入 - 我的 ip 是什么

ipv4 将类似于 30.132.323.11 现在将其输入到网络浏览器中,您应该会看到您的 docker 容器通过节点服务器代理公开。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-13
    • 1970-01-01
    • 2021-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多