当我运行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 ...完成
答案 0 :(得分:1)
要进行连接,您必须使用docker-compose.yml中声明的服务名称而不是容器名称。
db:3306 // instead of godockerDB:3306