首页 > 解决方案 > 为什么我的 docker mysql 数据库容器拒绝来自我的应用程序(golang)容器的连接

问题描述

当我运行我的 docker 应用程序并键入以下 URL 时,我得到显示的响应......

http://localhost:8080/complex

Hello...dial tcp 172.21.0.2:3306: connect: connection refused

我本来希望连接被接受,然后能够查询数据库等。

如果我故意将 main.go 文件中的连接字符串更改为不存在的主机(添加了 x)。

"root:root@tcp(godockerxDB:3306)/task_man")

使用这个网址...

http://localhost:8080/complex

我得到这个回应...

Hello...dial tcp: lookup godockerxDB on 127.0.0.11:53: no such host

正如我所料,原来的主机似乎是正确的,但它只是拒绝连接。

我已经手动连接到 db 容器并确认数据库在那里并且正确设置了表和任务,并且我能够在那里查询数据库表单。

我的主...

    package main

import (
    "database/sql"
    "encoding/json"
    "fmt"
    _ "github.com/go-sql-driver/mysql"
    "github.com/gorilla/mux"
    "net/http"
)

func simple(w http.ResponseWriter, r *http.Request) {
    enableCors(&w)
    fmt.Fprintf(w, "Hi there, I love %s!", r.URL.Path[1:])
}

var db *sql.DB
var err error

func main() {
    fmt.Print("hello")
    router := mux.NewRouter()
    router.HandleFunc("/complex", complex).Methods("GET")
    router.HandleFunc("/text", simple).Methods("GET")
    err := http.ListenAndServe(":8080", router)
    fmt.Print(err)

}
func enableCors(w *http.ResponseWriter) {
    (*w).Header().Set("Access-Control-Allow-Origin", "*")
}
func complex(w http.ResponseWriter, r *http.Request) {
    enableCors(&w)
    fmt.Fprintf(w, "Hello...")
    db, err = sql.Open("mysql", "root:root@tcp(godockerDB:3306)/task_man")
    if err != nil {
        fmt.Fprintf(w, "Hello David")
        fmt.Fprintf(w, err.Error())
    }
    defer db.Close()
    err2 := db.Ping()


    fmt.Fprintf(w, err2.Error())
}

我的应用程序 Docker 文件...

> FROM golang:1.12-alpine
> 
> RUN apk add --no-cache git
> 
> # Set the Current Working Directory inside the container WORKDIR /app/godocker
> 
> 
> COPY go.mod . COPY go.sum .
> 
> RUN go mod download
> 
> COPY . .
> 
> # Build the Go app RUN go build -o ./out/godocker .
> 
> 
> # This container exposes port 8080  EXPOSE 8080
> 
> # Run the binary program produced by `go install` CMD ["./out/godocker"]

我的数据库 Dockerfile...

FROM mysql:5.7
ENV MYSQL_ROOT_PASSWORD=root
COPY setup.sql /docker-entrypoint-initdb.d/

我的 docker-compose.yml ...

# Use root/example as user/password credentials
version: '3.1'

services:
  app:
    build:
      context: ./
      dockerfile: Dockerfile
    container_name: godockerAPP
    ports:
      - "8080:8080"
    depends_on:
      - db      
    restart: always
  db:
    build:
      context: ./dockerfiles/db
      dockerfile: Dockerfile
    container_name: godockerDB
    command: --default-authentication-plugin=mysql_native_password
    ports:
      - "3306:3306"
    restart: always

我运行的命令来启动 docker compose ...

docker-compose down
docker-compose build
docker-compose up -d

构建数据库步骤 1/3:FROM mysql:5.7 ---> 718a6da099d8 步骤 2/3:ENV MYSQL_ROOT_PASSWORD=root ---> 使用缓存 ---> 9087b3db47ac 步骤 3/3:复制 setup.sql /docker-entrypoint- initdb.d/ ---> 使用缓存 ---> 195614e33d96 成功构建 195614e33d96 成功标记 godocker_db:latest Building app Step 1/11 : FROM golang:1.12 ---> ffcaee6f7d8b Step 2/11 : ENV GO111MODULE=on -- -> 使用缓存 ---> 25377bdeb7af 步骤 3/11:ENV CGO_ENABLED=0 ---> 使用缓存 ---> fd86c2a9948c 步骤 4/11:WORKDIR /app/server ---> 使用缓存 ---> 8d59571272b7步骤 5/11:复制 go.mod。---> 使用缓存 ---> d1c8a0f00d33 步骤 6/11:复制 go.sum。---> 使用缓存 ---> a1b4b294de83 步骤 7/11:运行 go mod 下载 ---> 使用缓存 ---> 803fd4244374 步骤 8/11:复制。. ---> 37887395cadd 步骤 9/11:运行 go build -o main。---> 在 efe19e8eedc8 中运行 删除中间容器 efe19e8eedc8 ---> a115e9f17fc3 步骤 10/11:EXPOSE 8080:8080 ---> 在 4155040d490c 中运行 删除中间容器 4155040d490c ---> 3e431bff9e84 步骤 11/11.: CMD /main"] ---> 在 f5f9bab56ab0 中运行 删除中间容器 f5f9bab56ab0 ---> a8867809f163 成功构建 a8867809f163 成功标记 godocker_app:latest

C:\DEV\Go\src\godocker>docker-compose up -d 使用默认驱动程序创建网络“godocker_default” 创建 godockerDB ...完成 创建 godockerAPP ...完成

C:\DEV\Go\src\godocker>dow e03697533be6 239278c1f0ea

C:\DEV\Go\src\godocker>dup

C:\DEV\Go\src\godocker>docker-compose down 删除 godockerAPP ... done 删除 godockerDB ... done 删除网络 godocker_default

C:\DEV\Go\src\godocker>docker-compose build Building db Step 1/3 : FROM mysql:5.7 ---> 718a6da099d8 Step 2/3: ENV MYSQL_ROOT_PASSWORD=root ---> 使用缓存 ---> 9087b3db47ac 第 3/3 步:复制 setup.sql /docker-entrypoint-initdb.d/ ---> 使用缓存 ---> 195614e33d96 成功构建 195614e33d96 成功标记 godocker_db:latest 构建应用程序第 1/11 步:FROM golang:1.12 - --> ffcaee6f7d8b 步骤 2/11:ENV GO111MODULE=on ---> 使用缓存 ---> 25377bdeb7af 步骤 3/11:ENV CGO_ENABLED=0 ---> 使用缓存 ---> fd86c2a9948c 步骤 4/11:WORKDIR /app/server ---> 使用缓存 ---> 8d59571272b7 步骤 5/11:复制 go.mod 。---> 使用缓存 ---> d1c8a0f00d33 步骤 6/11:复制 go.sum。---> 使用缓存 ---> a1b4b294de83 步骤 7/11:运行 go mod 下载 ---> 使用缓存 ---> 803fd4244374 步骤 8/11:复制。. ---> 05a487690611 步骤 9/11:运行 go build -o main 。---> 在 9d9cc6a3b214 中运行,删除中间容器 9d9cc6a3b214 ---> ee950a1706f5 步骤 10/11:EXPOSE 8080:8080 ---> 在 faa43abcfe40 中运行,删除中间容器 faa43abcfe40 ---> 877be92dc560 步骤 11/11 :CMD [” /main"] ---> 在 dd2dcf9ce4be 中运行 删除中间容器 dd2dcf9ce4be ---> cf9bea6d2348 成功构建 cf9bea6d2348 成功标记 godocker_app:latest

C:\DEV\Go\src\godocker>docker-compose up -d 使用默认驱动程序创建网络“godocker_default” 创建 godockerDB ...完成 创建 godockerAPP ...完成

C:\DEV\Go\src\godocker>dow d56302aeb09b 0cef3117aac8

C:\DEV\Go\src\godocker>dup

C:\DEV\Go\src\godocker>docker-compose down 删除 godockerAPP ... done 删除 godockerDB ... done 删除网络 godocker_default

C:\DEV\Go\src\godocker>docker-compose build Building db Step 1/3 : FROM mysql:5.7 ---> 718a6da099d8 Step 2/3: ENV MYSQL_ROOT_PASSWORD=root ---> 使用缓存 ---> 9087b3db47ac 第 3/3 步:复制 setup.sql /docker-entrypoint-initdb.d/ ---> 使用缓存 ---> 195614e33d96 成功构建 195614e33d96 成功标记 godocker_db:latest 构建应用程序第 1/11 步:FROM golang:1.12 - --> ffcaee6f7d8b 步骤 2/11:ENV GO111MODULE=on ---> 使用缓存 ---> 25377bdeb7af 步骤 3/11:ENV CGO_ENABLED=0 ---> 使用缓存 ---> fd86c2a9948c 步骤 4/11:WORKDIR /app/server ---> 使用缓存 ---> 8d59571272b7 步骤 5/11:复制 go.mod 。---> 使用缓存 ---> d1c8a0f00d33 步骤 6/11:复制 go.sum。---> 使用缓存 ---> a1b4b294de83 步骤 7/11:运行 go mod 下载 ---> 使用缓存 ---> 803fd4244374 步骤 8/11:复制。. ---> 8a1880bb8b56 步骤 9/11:运行 go build -o main 。---> 在 84f20ebb4606 中运行,移除中间容器 84f20ebb4606 ---> e0304d6454d4 步骤 10/11:EXPOSE 8080:8080 ---> 在 7a0b6392be6e 中运行,移除中间容器 7a0b6392be6e ---> 3b18860bca2c 步骤 11/1 [--->。 /main"] ---> 运行在 018d6769b721 中删除中间容器 018d6769b721 ---> bbf448ab621c 成功构建 bbf448ab621c 成功标记 godocker_app:latest

C:\DEV\Go\src\godocker>docker-compose up -d 使用默认驱动程序创建网络“godocker_default” 创建 godockerDB ...完成 创建 godockerAPP ...完成

标签: mysqldockerdocker-compose

解决方案


要连接,您必须使用 docker-compose.yml 中声明的服务名称而不是容器名称。

db:3306 // instead of godockerDB:3306

推荐阅读