首页 >后端开发 >Golang >docker容器选择不同的网络,尽管从未设置过任何网络

docker容器选择不同的网络,尽管从未设置过任何网络

PHPz
PHPz转载
2024-02-09 11:51:17553浏览

docker容器选择不同的网络,尽管从未设置过任何网络

在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。

我想做的是:

  1. 能够访问 graphql playground 以及容器内其他端口上运行的任何其他 api
  2. 能够从我的 dockerized go 应用向单独的 mysql 容器发出请求(我不知道如何将它们与 rules_docker 放在同一网络上)。
  3. 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

以上是docker容器选择不同的网络,尽管从未设置过任何网络的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文转载于:stackoverflow.com。如有侵权,请联系admin@php.cn删除