为什么我的docker mysql数据库容器拒绝来自我的app(golang)容器的连接

时间:2020-09-04 08:05:22

标签: mysql docker docker-compose

当我运行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容器,并确认数据库在那里,并使用表和任务正确设置了数据库,并且能够在其中查询数据库表单。

我的main.go ...

    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

Building db Step 1/3:from mysql:5.7 ---> 718a6da099d8 Step 2/3: ENV MYSQL_ROOT_PASSWORD = root --->使用缓存---> 9087b3db47ac步骤 3/3:COPY setup.sql /docker-entrypoint-initdb.d/-使用缓存 ---> 195614e33d96已成功构建195614e33d96已成功标记godocker_db:latest Building app步骤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:复制。 。 ---> 37887395cadd步骤9/11:运行 去build -o main。 --->在efe19e8eedc8中运行删除中间件 容器efe19e8eedc8 ---> a115e9f17fc3步骤10/11:曝光 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 ... 完成删除godockerDB ...完成删除网络godocker_default

C:\ DEV \ Go \ src \ godocker> docker-compose build Building db步骤1/3: 从mysql:5.7 ---> 718a6da099d8步骤2/3:ENV MYSQL_ROOT_PASSWORD = root --->使用缓存---> 9087b3db47ac步骤3/3 :COPY setup.sql /docker-entrypoint-initdb.d/ --->使用缓存---> 195614e33d96成功构建195614e33d96成功标记 godocker_db:最新的构建应用程序步骤1/11:来自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:运行 去build -o main。 --->在9d9cc6a3b214中运行删除中间体 容器9d9cc6a3b214 ---> ee950a1706f5步骤10/11:曝光 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 ... 完成删除godockerDB ...完成删除网络godocker_default

C:\ DEV \ Go \ src \ godocker> docker-compose build Building db步骤1/3: 从mysql:5.7 ---> 718a6da099d8步骤2/3:ENV MYSQL_ROOT_PASSWORD = root --->使用缓存---> 9087b3db47ac步骤3/3 :COPY setup.sql /docker-entrypoint-initdb.d/ --->使用缓存---> 195614e33d96成功构建195614e33d96成功标记 godocker_db:最新的构建应用程序步骤1/11:来自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:运行 去build -o main。 --->在84f20ebb4606中运行除去中间体 容器84f20ebb4606 ---> e0304d6454d4步骤10/11:曝光 8080:8080 --->在7a0b6392be6e中运行删除中间件 容器7a0b6392be6e ---> 3b18860bca2c步骤11/11:CMD [“ ./main”] --->在018d6769b721中运行卸下中间容器018d6769b721 ---> bbf448ab621c成功构建了bbf448ab621c 已成功标记godocker_app:latest

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

1 个答案:

答案 0 :(得分:1)

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

db:3306 // instead of godockerDB:3306