docker - 客户端容器在容器中测试服务
问题描述
我是 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-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
推荐阅读
- c++ - 错误:没有以 NULL 作为参数调用构造函数的匹配函数?
- c# - Unity FAILURE:构建失败并出现异常
- apache-flink - 后期数据丢失的 Flink 端输出
- ruby-on-rails - 是否可以在 RoR 项目的根级别为不同的应用程序保留不同的文件夹
- mysql - MySQL查询将分隔字符串值拆分为单独的列
- wordpress - 如何修复 babel-polyfill 和 WordPress 的错误?
- heroku - heroku h10 崩溃 - 数据库连接错误
- powershell - 如果语句在脚本之外有效,但在 Powershell 内部无效
- docker - 启动 docker 时显示崩溃报告
- java - 为什么在android中对视图应用矩阵变换时,不同设备上的矩阵变换不同?