在Docker中,我們可以通過(guò)選擇不同的網(wǎng)絡(luò)來(lái)為容器提供網(wǎng)絡(luò)連接。令人驚訝的是,即使我們從未明確設(shè)置過(guò)任何網(wǎng)絡(luò),Docker仍然會(huì)為容器分配默認(rèn)網(wǎng)絡(luò)。這個(gè)問(wèn)題困擾著許多開(kāi)發(fā)者,因?yàn)樗麄兛赡軙?huì)遇到一些與網(wǎng)絡(luò)配置相關(guān)的問(wèn)題。在本文中,我們將通過(guò)php小編柚子的幫助,詳細(xì)解釋為什么Docker容器會(huì)有默認(rèn)網(wǎng)絡(luò),以及如何在不同網(wǎng)絡(luò)之間進(jìn)行選擇。
問(wèn)題內(nèi)容
我在為 go 服務(wù)設(shè)置 docker 配置時(shí)遇到了麻煩。以下是我的設(shè)置概述
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", ], )
登錄后復(fù)制
我有一個(gè)在 http://localhost:8080
上運(yùn)行的 graphql playgroud (http),盡管端口據(jù)稱已公開(kāi),但我無(wú)法訪問(wèn) playground ui。
我想做的是:
-
能夠訪問(wèn) graphql playground 以及容器內(nèi)其他端口上運(yùn)行的任何其他 api
能夠從我的 dockerized go 應(yīng)用向單獨(dú)的 mysql 容器發(fā)出請(qǐng)求(我不知道如何將它們與
rules_docker
放在同一網(wǎng)絡(luò)上)。docker exec -it ... /bin/bash
到我的 docker 容器中(這不起作用,因?yàn)槲窗惭b bash,但我不知道如何通過(guò)此 container_image 命令安裝 bash)錯(cuò)誤如下:
oci runtime exec failed: exec failed: unable to start container process: exec: "bash": executable file not found in $path: unknown
登錄后復(fù)制
如果我獲取生成的 docker 鏡像 id 并運(yùn)行 docker run -p 8080:8080 image_id
,我可以訪問(wèn) graphql playground,但無(wú)法與 mysql 容器通信
如果我按如下方式更改網(wǎng)絡(luò): docker run --network=host -p 8080:8080 image_id
dockerized go 應(yīng)用程序可以成功與 mysql 容器通信,但隨后 graphql playground 變得無(wú)法訪問(wèn)。僅當(dāng)我維護(hù) --network=bridge
時(shí),graphql 游樂(lè)場(chǎng)才可訪問(wèn)。我不確定為什么 mysql 也不使用 bridge
,因?yàn)槲以趩?dòng)它時(shí)從未指定網(wǎng)絡(luò)。這就是我獲得 mysql 容器的方式
docker run -p 3306:3306 --name my-db -e MYSQL_ROOT_PASSWORD=testing -d mysql:8.0.31
登錄后復(fù)制
解決方法
答案在這里:
無(wú)法使用 go 和 docker 連接到 mysql 服務(wù)器 – 撥號(hào) tcp 127.0.0.1:3306: connect: 連接被拒絕
事實(shí)證明我需要使用以下地址實(shí)際訪問(wèn) mysql,因?yàn)?mac 上的 docker 使用 linux vm:
docker.for.mac.localhost:3306
登錄后復(fù)制