今天在使用 docker 部署一个 go 语言的服务,发现怎么都调试不通。期初一直以为是自己的部署问题,后来发现了问题所在是绑定地址的问题。
这里强调一下,我部署的服务是 override 服务,感兴趣的去github搜索一下,很牛的。我是一个 linux do 狂热追随者。
go 语言服务
在 Go 服务中,绑定 127.0.0.1
和绑定 0.0.0.0
之间有以下区别:
-
127.0.0.1
(localhost,回环地址):- 服务只会在本机(即服务所在的机器)上可以访问,不能被外部网络或其他设备访问。
- 这是一个回环地址,通常用于开发和测试环境。
- 典型用例:本地开发时使用,确保服务只在本机上运行,外部无法连接。
-
0.0.0.0
(通配符地址):- 绑定到
0.0.0.0
意味着服务会监听所有网络接口,包括本地网络接口和外部接口。 - 这使得服务可以从任何 IP 地址访问,适用于需要对外公开的服务。
- 典型用例:在生产环境中,当你希望外部用户能够访问这个服务时使用。
- 绑定到
总结:
127.0.0.1
:仅限本机访问,适合本地开发。0.0.0.0
:允许外部访问,适合生产环境或需要与其他机器通信的场景。
nodejs Vue
其实别的服务也是相同的原理,像 nodejs 也是的,只不过nodejs默认绑定的是 0.0.0.0
,所以我们可能没有遇到过这个问题。如果你不设置这个通配符地址,就算是在同一个局域网,别人也是无法访问你的服务的。
前端开发可以联想到,vue 开启局域网服务是要配置以下代码的,否则就算是在同一个局域网,别人也是无法访问你的服务的。
devServer: {
host: '0.0.0.0'
}
扩展
回环地址和通配符地址是网络编程中常见的概念,它们用于定义服务器在网络中如何接受连接。
1. 回环地址(Loopback Address)
-
定义:回环地址是指一个网络接口地址,用于在本机内部进行通信。它的典型地址是
127.0.0.1
,有时也称为localhost
。 -
用途:
- 回环地址只允许来自本地计算机的连接,即服务器与客户端必须在同一台机器上。
- 不会通过任何实际的网络接口,因此不会产生网络流量。
-
适用场景:
- 本地开发和调试。
- 用于测试网络应用,确保程序正常运行而不需要外部网络连接。
-
示例:
在 Go 语言中,绑定
127.0.0.1
:
http.ListenAndServe("127.0.0.1:8080", nil)
这个服务器只能从本地访问,其他机器无法连接。
2. 通配符地址(Wildcard Address)
-
定义:通配符地址表示服务器监听所有可用的网络接口,常见的通配符地址是
0.0.0.0
,它代表服务器将接受来自任何 IP 地址的连接。 -
用途:
- 通配符地址让服务器可以接受来自局域网、广域网,甚至互联网的连接。
- 适合需要对外提供服务的情况,如生产环境中的 Web 服务器。
-
适用场景:
- 部署在云端或网络中,允许客户端通过远程访问服务器。
-
示例:
在 Go 语言中,绑定
0.0.0.0
:
http.ListenAndServe("0.0.0.0:8080", nil)
服务器将监听所有接口,允许外部设备连接。
总结:
- 回环地址 (
127.0.0.1
):仅限本机访问,适用于本地开发和测试。 - 通配符地址 (
0.0.0.0
):允许从任何 IP 地址访问,适用于需要对外公开的服务。
0.0.0.0 到底是什么
严格来说, 0.0.0.0
不是一个常规的 IP 地址,而是一种特殊用途的地址,用于在网络编程中表示“所有可用的网络接口”。它的本质并不是用于标识某一台具体的设备,而是表示服务器可以监听来自所有网络接口的连接。
0.0.0.0
的本质:
-
通配符地址:
0.0.0.0
是一个通配符地址,意味着服务器将监听所有网络接口(不论是本地接口还是外部接口)。这与特定的 IP 地址不同,因为它并不指向某一个特定的网络设备或主机。 -
绑定所有接口:当程序在
0.0.0.0
上监听时,它实际上会监听这台设备上的所有 IP 地址(包括局域网和外网接口),因此允许来自任意网络的连接。- 例如,如果服务器有多个网络接口(一个连接局域网,一个连接外网),绑定
0.0.0.0
将使得服务器能够通过这些接口接收来自不同网络的请求。
- 例如,如果服务器有多个网络接口(一个连接局域网,一个连接外网),绑定
-
在不同上下文中的解释:
- 服务器端:在服务器端,绑定
0.0.0.0
意味着监听所有网络接口,通常用于服务器软件,使其可以接受来自任何网络的连接。 - 路由器和路由表:在路由表中,
0.0.0.0
代表默认路由,用于指示当无法找到具体匹配的路由时,应该将流量发送到某一默认网关。
- 服务器端:在服务器端,绑定
0.0.0.0
与 IP 地址的区别:
- 普通 IP 地址:像
192.168.1.1
或127.0.0.1
这样的地址用来标识特定的网络接口或主机,是某一设备的具体 IP 地址。 0.0.0.0
:表示“所有网络接口”或“默认”,而不是某一个具体的设备或网络接口。
使用场景:
- 在编写服务器程序时,使用
0.0.0.0
让服务器监听所有网络接口,使其对外部开放连接。 - 在路由器中,
0.0.0.0
通常作为默认路由,指示当没有特定路由匹配时应该将数据包发往默认网关。
总结:
0.0.0.0
是一个通配符地址,表示监听所有网络接口,而不是一个传统意义上的 IP 地址。它主要用于网络编程中,来让服务器监听来自任意网络的连接。