在Docker中,我們可以通過選擇不同的網絡來為容器提供網絡連接。令人驚訝的是,即使我們從未明確設置過任何網絡,Docker仍然會為容器分配默認網絡。這個問題困擾著許多開發者,因為他們可能會遇到一些與網絡配置相關的問題。在本文中,我們將通過php小編柚子的幫助,詳細解釋為什么Docker容器會有默認網絡,以及如何在不同網絡之間進行選擇。
問題內容
我在為 go 服務設置 docker 配置時遇到了麻煩。以下是我的設置概述
go_binary(
name = "main_arm64",
embed = [":server_lib"],
goarch = "arm64",
goos = "linux",
visibility = ["http://visibility:public"],
)
container_image(
name = "ww_server_image",
base = "@go_image_static_arm64//image",
entrypoint = ["/main_arm64"],
files = [":main_arm64"],
ports = [
"8080",
"3306",
],
)
登錄后復制
我有一個在 http://localhost:8080 上運行的 graphql playgroud (http),盡管端口據稱已公開,但我無法訪問 playground ui。
我想做的是:
-
能夠訪問 graphql playground 以及容器內其他端口上運行的任何其他 api
能夠從我的 dockerized go 應用向單獨的 mysql 容器發出請求(我不知道如何將它們與
rules_docker 放在同一網絡上)。docker exec -it ... /bin/bash 到我的 docker 容器中(這不起作用,因為未安裝 bash,但我不知道如何通過此 container_image 命令安裝 bash)錯誤如下:
oci runtime exec failed: exec failed: unable to start container process: exec: "bash": executable file not found in $path: unknown
登錄后復制
如果我獲取生成的 docker 鏡像 id 并運行 docker run -p 8080:8080 image_id,我可以訪問 graphql playground,但無法與 mysql 容器通信
如果我按如下方式更改網絡: docker run --network=host -p 8080:8080 image_id dockerized go 應用程序可以成功與 mysql 容器通信,但隨后 graphql playground 變得無法訪問。僅當我維護 --network=bridge 時,graphql 游樂場才可訪問。我不確定為什么 mysql 也不使用 bridge ,因為我在啟動它時從未指定網絡。這就是我獲得 mysql 容器的方式
docker run -p 3306:3306 --name my-db -e MYSQL_ROOT_PASSWORD=testing -d mysql:8.0.31
登錄后復制
解決方法
答案在這里:
無法使用 go 和 docker 連接到 mysql 服務器 – 撥號 tcp 127.0.0.1:3306: connect: 連接被拒絕
事實證明我需要使用以下地址實際訪問 mysql,因為 mac 上的 docker 使用 linux vm:
docker.for.mac.localhost:3306
登錄后復制






