在Docker中,我们可以通过选择不同的网络来为容器提供网络连接。令人惊讶的是,即使我们从未明确设置过任何网络,Docker仍然会为容器分配默认网络。这个问题困扰着许多开发者,因为他们可能会遇到一些与网络配置相关的问题。在本文中,我们将通过php小编柚子的帮助,详细解释为什么Docker容器会有默认网络,以及如何在不同网络之间进行选择。
问题内容
我在为 go 服务设置 docker 配置时遇到了麻烦。以下是我的设置概述
go_binary(
name = "main_arm64",
embed = [":server_lib"],
goarch = "arm64",
goos = "linux",
visibility = ["//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