首页 > 解决方案 > 客户端容器在容器中测试服务

问题描述

我是 Docker 和 Kubernetes 的新手。我正在浏览一些文档并在本地运行设置。我对此有一些疑问。

我从打印“hello world”的go文件创建了一个图像。这是示例 go 文件

package main

import (
    "fmt"
    "net/http"
)

func helloHandler(w http.ResponseWriter, r *http.Request) {
    response := "Hello World!"
    fmt.Fprintln(w, response)
    fmt.Println("Processing hello request.")
}

func listenAndServe(port string) {
    fmt.Printf("Listening on port %s\n", port)
    err := http.ListenAndServe(":"+port, nil)
    if err != nil {
        panic("ListenAndServe: " + err.Error())
    }
}

func main() {
    http.HandleFunc("/", helloHandler)
    port := "8080"
    go listenAndServe(port)
    select {}
}

这是 Dockerfile

FROM golang:1.13
WORKDIR /go/src/hello
COPY ./hello.go /go/src/hello
CMD ["go","run","hello.go"]

此容器已启动并正在运行。容器的 IP 地址存储在 IP 变量中。

现在,在文档中它说我们需要一个客户端容器来测试这个服务。

docker container run --rm busybox wget -qO- $IP:8080 && echo

Status: Downloaded newer image for busybox:latest
Hello World!

我想知道为什么它需要这个客户端容器,当我直接从本地机器上 wget 时,这不起作用。

任何输入。在此先感谢您的帮助。

标签: docker

解决方案


默认情况下,容器部署在 docker-bridge 网络中。在您的主机和连接容器的VLAN之间没有隐式路由:这就是您阅读的文档建议运行客户端容器以检查 Web 应用程序是否确实在工作的原因 - 另一个容器可以到达 go 容器,因为它连接在同一个子网中。

但是,例如,如果您有一个正在侦听端口的容器,则8080可以在启动容器时使用该-p <src>:<dst>选项,以便在您的host-machine:<src>container:<dst>.

如果您使用此命令启动 go 容器,您将能够从您的主机访问该网站localhost:9999

docker run -d -p 9999:8080 my-go-image

推荐阅读