mysql - 为什么我的 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 ...完成
解决方案
要连接,您必须使用 docker-compose.yml 中声明的服务名称而不是容器名称。
db:3306 // instead of godockerDB:3306
推荐阅读
- c++ - boost::lockfree::queue(在多线程程序中)是否可锁定?
- c - C 不兼容的指针类型消息似乎列出了预期和实际的相同指针类型
- highcharts - 如果值超出边界,则在边界上绘制散点图
- node.js - 在网络浏览器中保持双重登录策略?
- java - 调用子类方法?
- python - 当进程数和工人数增加时,Python 多处理池 API 无法有效工作
- ffmpeg - 如何使用 libsrt(安全可靠传输)协议配置 ffmpeg?
- java - 循环调度程序没有产生正确的结果
- node.js - create-react-app 中的问题:术语“create-react-app”未被识别为 cmdlet、函数、脚本文件或可运行程序的名称
- c++11 - 'shared_ptr 没有可行的转换
' 到 'shared_ptr '