以下代码创建一个http服务,主要功能是通过访问路径“/”来得到响应“Hello, Gin!”
package main
import (
"github.com/gin-gonic/gin"
)
func main() {
r := gin.Default()
r.GET("/", func(c *gin.Context) {
c.JSON(200, gin.H{
"message": "Hello, Gin!",
})
})
r.Run(":8080")
}
FROM golang:1.19.2 AS builder
MAINTAINER runningriven@gmail.com
EXPOSE 8080
WORKDIR /usr/src/docker-network
COPY . .
ENV GOPROXY=https://goproxy.cn,direct
RUN go mod tidy
RUN CGO_ENABLED=0 GOOS=linux go build -v -o server ./cmd \
&& cp server ./cmd/server
FROM ubuntu:22.04
WORKDIR /usr/local/bin/
COPY --from=builder /usr/src/docker-network/cmd/server ./server
CMD ["./server"]
version: '3'
services:
http-server:
image: server:simple
container_name: server
ports:
- "8080:8080"
version: '3'
services:
http-server:
image: server:simple
container_name: server
network_mode: "host"
浏览器访问“http://127.0.0.1:8080”。
bridge部署的容器:访问上述地址能正常输出“Hello, Gin!”
host模式部署的容器:访问上述地址显示 “127.0.0.1 拒绝了我们的连接请求。”
我想知道为什么会造成上面的结果,以及在host模式下我要怎样才能访问到我的容器应用
【以下回答由 GPT 生成】
问题原因:在使用host模式部署容器时,容器会直接使用宿主机的网络栈,与宿主机共享网络命名空间。因此,容器内的应用程序绑定在宿主机的IP地址上监听端口,无法通过容器的IP地址访问。
解决方案: 1. 首先,确认宿主机的防火墙设置是否允许访问容器应用的端口。可以使用以下命令检查防火墙规则: sudo iptables -L
如果有防火墙规则限制了对容器端口的访问,可以使用以下命令开放该端口: sudo iptables -A INPUT -p tcp --dport 8080 -j ACCEPT
确保容器应用程序监听的端口与Dockerfile中暴露的端口一致。在这个例子中,Dockerfile中定义了容器应用程序监听8080端口,并通过EXPOSE 8080
暴露了该端口,在代码中使用了相同的端口。
使用host模式部署容器时,容器应用程序绑定在宿主机的IP地址上,因此可以通过访问宿主机的IP地址和相应的端口来访问容器应用。在这个例子中,可以使用宿主机的IP地址和8080端口来访问容器应用,如http://<宿主机IP地址>:8080
。
可以使用以下命令获取宿主机的IP地址: ip addr show
找到宿主机网络接口的IP地址,一般以en
、eth
或wlan
开头的接口都是宿主机的网络接口。
思考:使用host模式部署容器可以提供更高的网络性能,但也会带来一些安全风险。在host模式下,容器所在的应用程序能够直接访问宿主机上的网络服务,因此需要确保宿主机上的安全措施完善,并认真考虑网络隔离等安全问题。