当前位置: 首页 > 知识库问答 >
问题:

从一个容器访问另一个容器中的MySQL

松增
2023-03-14

我正在尝试以下操作:

  • 在一个带有暴露端口的容器中旋转MySQL 5.5,例如4200。
  • 在一个带有暴露端口的容器中旋转MySQL 5.7,例如4300。
  • 旋转golang容器以运行我的应用程序。

我的想法是我需要我的测试在不同的数据库版本上运行。

为此,我需要能够与golang容器中的每个sql容器进行对话。

我试过的:

方法1-使用--link:

docker run --name mysql55c -p 127.0.0.1:4200:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql:5.5

GO LANG应用程序容器

docker run -w /go/src/app -it --link mysql55c -d --name golangapp -v $(pwd):/go/src/app golang bash -c "go get github.com/go-sql-driver/mysql;go build main.go; go test -v
--config ./config.ini"

方法2-使用--net(网桥和主机):创建网桥nw

docker网络mynw

docker run --name mysql55c --net mynw -p 127.0.0.1:4200:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql:5.5

GO LANG应用程序容器

docker run -w /go/src/app -it --net mynw -d --name golangapp -v $(pwd):/go/src/app golang bash -c "go get github.com/go-sql-driver/mysql;go build main.go; go test -v
--config ./config.ini"

而不是创造一个自己的桥梁网络,我也累了

--NET主机

  • 尝试使用docker cli命令完成上述操作,以便使用官方docker映像轻松实现jenkins集成。

使用配置url连接到数据库的Go代码

func dbconn() (*sql.DB, error) {
    opendb, err := sql.Open("mysql", *dsn + *dbname) //coming from flag
    if err != nil {
        return nil, err
    }
    return opendb, nil
}

我在配置中尝试过的dsn url组合:

>

  • DSN=“root:root@tcp(localhost:4200)/”
  • DSN=“root:root@TCP(172.17.0.0.x:4200)/”(docker0 ip)

    DBNAME=“SOMENAME”

  • 共有1个答案

    冷翼
    2023-03-14

    这应该起作用,请遵循以下步骤:

    • 运行mysql容器Docker运行--name mysql55c-p 4200:3306-e mysql_root_password=root-d mysql:5.5
    • 使用以下内容为golang创建DockerFile:
    FROM golang:latest
    
    COPY . /
    RUN go get "github.com/go-sql-driver/mysql"
    CMD go run /main.go
    
    • 使用以下内容创建main.go:
    package main
    
    import(
            _ "github.com/go-sql-driver/mysql"
            "database/sql"
            "log"
    )
    
    func main() {
        // Open up our database connection.
        db, err := sql.Open("mysql", "root:root@tcp(192.168.0.33:4200)/mysql")
    
        // if there is an error opening the connection, handle it
        if err != nil {
            log.Print(err.Error())
        } else {
            log.Print("DB connected successfully")
        }
    
        defer db.Close()
    
    }
    
      null
    $ docker logs dbd5294abd61
    2019/06/19 13:24:17 DB connected successfully
    

    注意:我运行的是mysql容器,它暴露在主机的4200端口上。在golang代码中,我的连接字符串是root:root@tcp(192.168.0.33:4200)/mysql,其中192.168.0.33是我计算机的私有ip。

    对于您来说,最重要的是您的db连接字符串应该指向您主机的私有/公共ip。如果您在没有容器链接的情况下运行golang。

    如果在运行golang时使用容器链接,假设Docker run-itd--link mysql55c:mydb goapp,则您的golang代码中的mysql连接字符串应为root:root@tcp(mydb:4200)/mysql

    试试这个告诉我。

     类似资料:
    • 问题内容: 我基于两个不同的图像创建了两个docker容器。一个数据库,另一个用于网络服务器。这两个容器都在我的Mac OS X上运行。 我可以从主机访问数据库容器,也可以从主机访问Web服务器。 但是,如何从Web服务器访问数据库连接? 我启动数据库容器的方式是 我开始了wls容器作为 我可以通过连接到主机上的数据库 我可以以以下方式访问主机上的wls: 问题答案: 最简单的方法是使用–link

    • 我基于两个不同的映像创建了两个docker容器。一个是db,另一个是WebServer。这两个容器都在我的mac OSX上运行。 我可以从主机访问db容器,也可以从主机访问webserver。 我可以访问主机上的wls作为

    • 问题内容: 我正在尝试为将我的应用程序容器连接到postgres容器提供一个便携式解决方案。“便携式”是指我可以给用户两个命令,每个容器一个,它们将始终协同工作。 我的本地PC上运行着一个postgres docker容器,我这样运行它, 我可以使用address从python flask应用程序访问它。 我也将python应用程序也放置在docker容器中,但无法连接到postgres容器。 地

    • 我有两个Docker容器在同一个网络中运行,我希望其中一个通过spring Webclient调用另一个。我确信他们都在同一个网络中- “finishConnect(…)失败:连接被拒绝:附件加载程序秒/172.21.0.5:80;嵌套异常为io。内蒂。频道AbstractChannel$AnnotatedConnect异常:finishConnect(…)失败:连接被拒绝:附件加载程序秒/172

    • 我们有一个公开REST API的现有java应用程序。当它收到超文本传输协议请求时,它使用Runtime.getRuntime(). exe启动另一个java进程。 我们正在将此应用程序迁移到docker,我们希望将这些服务、一个容器中的REST应用程序和另一个容器中的其他组件分开。 有没有办法,REST应用程序可以在另一个docker容器中启动另一个应用程序?

    • 问题内容: 目前,我在需要连接到camunda的docker容器内运行一个node.js应用程序,该容器在另一个容器中运行。 我使用以下命令启动容器 这两个应用程序现在都在运行,我可以通过在端口8000上导航到主机的IP来访问camunda,运行wget 还会返回camunda页面。使用和键入我的应用程序容器时,我无法访问camunda。相反,我得到以下错误: 当我使用将我的应用程序容器链接到ca