首頁  >  文章  >  後端開發  >  docker容器選擇不同的網絡,儘管從未設置過任何網絡

docker容器選擇不同的網絡,儘管從未設置過任何網絡

PHPz
PHPz轉載
2024-02-09 11:51:17537瀏覽

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刪除