Reputation: 804
When I run my docker app and type the following URLs I get the responses shown...
http://localhost:8080/complex
Hello...dial tcp 172.21.0.2:3306: connect: connection refused
I would have expected the connection to be accepted and then be able toe query the database etc.
If I deliberately change the connection string in my main.go file to a non existent host (added an x).
"root:root@tcp(godockerxDB:3306)/task_man")
Use this url...
http://localhost:8080/complex
I get this response...
Hello...dial tcp: lookup godockerxDB on 127.0.0.11:53: no such host
As I would expect, so the original host seems right but it is just refusing the connection.
I have connected to the db container manually and confirmed the database is there and setup correctly with the table and tasks and I am able to query the database form in there.
My 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())
}
My App Docker File...
> 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"]
My db Dockerfile...
FROM mysql:5.7
ENV MYSQL_ROOT_PASSWORD=root
COPY setup.sql /docker-entrypoint-initdb.d/
My 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
The command I run to spin up the 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 ---> Using cache ---> 9087b3db47ac Step 3/3 : COPY setup.sql /docker-entrypoint-initdb.d/ ---> Using cache ---> 195614e33d96 Successfully built 195614e33d96 Successfully tagged godocker_db:latest Building app Step 1/11 : FROM golang:1.12 ---> ffcaee6f7d8b Step 2/11 : ENV GO111MODULE=on ---> Using cache ---> 25377bdeb7af Step 3/11 : ENV CGO_ENABLED=0 ---> Using cache ---> fd86c2a9948c Step 4/11 : WORKDIR /app/server ---> Using cache ---> 8d59571272b7 Step 5/11 : COPY go.mod . ---> Using cache ---> d1c8a0f00d33 Step 6/11 : COPY go.sum . ---> Using cache ---> a1b4b294de83 Step 7/11 : RUN go mod download ---> Using cache ---> 803fd4244374 Step 8/11 : COPY . . ---> 37887395cadd Step 9/11 : RUN go build -o main . ---> Running in efe19e8eedc8 Removing intermediate container efe19e8eedc8 ---> a115e9f17fc3 Step 10/11 : EXPOSE 8080:8080 ---> Running in 4155040d490c Removing intermediate container 4155040d490c ---> 3e431bff9e84 Step 11/11 : CMD ["./main"] ---> Running in f5f9bab56ab0 Removing intermediate container f5f9bab56ab0 ---> a8867809f163 Successfully built a8867809f163 Successfully tagged godocker_app:latest
C:\DEV\Go\src\godocker>docker-compose up -d Creating network "godocker_default" with the default driver Creating godockerDB ... done Creating godockerAPP ... done
C:\DEV\Go\src\godocker>dow e03697533be6 239278c1f0ea
C:\DEV\Go\src\godocker>dup
C:\DEV\Go\src\godocker>docker-compose down Removing godockerAPP ... done Removing godockerDB ... done Removing network 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 ---> Using cache ---> 9087b3db47ac Step 3/3 : COPY setup.sql /docker-entrypoint-initdb.d/ ---> Using cache ---> 195614e33d96 Successfully built 195614e33d96 Successfully tagged godocker_db:latest Building app Step 1/11 : FROM golang:1.12 ---> ffcaee6f7d8b Step 2/11 : ENV GO111MODULE=on ---> Using cache ---> 25377bdeb7af Step 3/11 : ENV CGO_ENABLED=0 ---> Using cache ---> fd86c2a9948c Step 4/11 : WORKDIR /app/server ---> Using cache ---> 8d59571272b7 Step 5/11 : COPY go.mod . ---> Using cache ---> d1c8a0f00d33 Step 6/11 : COPY go.sum . ---> Using cache ---> a1b4b294de83 Step 7/11 : RUN go mod download ---> Using cache ---> 803fd4244374 Step 8/11 : COPY . . ---> 05a487690611 Step 9/11 : RUN go build -o main . ---> Running in 9d9cc6a3b214 Removing intermediate container 9d9cc6a3b214 ---> ee950a1706f5 Step 10/11 : EXPOSE 8080:8080 ---> Running in faa43abcfe40 Removing intermediate container faa43abcfe40 ---> 877be92dc560 Step 11/11 : CMD ["./main"] ---> Running in dd2dcf9ce4be Removing intermediate container dd2dcf9ce4be ---> cf9bea6d2348 Successfully built cf9bea6d2348 Successfully tagged godocker_app:latest
C:\DEV\Go\src\godocker>docker-compose up -d Creating network "godocker_default" with the default driver Creating godockerDB ... done Creating godockerAPP ... done
C:\DEV\Go\src\godocker>dow d56302aeb09b 0cef3117aac8
C:\DEV\Go\src\godocker>dup
C:\DEV\Go\src\godocker>docker-compose down Removing godockerAPP ... done Removing godockerDB ... done Removing network 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 ---> Using cache ---> 9087b3db47ac Step 3/3 : COPY setup.sql /docker-entrypoint-initdb.d/ ---> Using cache ---> 195614e33d96 Successfully built 195614e33d96 Successfully tagged godocker_db:latest Building app Step 1/11 : FROM golang:1.12 ---> ffcaee6f7d8b Step 2/11 : ENV GO111MODULE=on ---> Using cache ---> 25377bdeb7af Step 3/11 : ENV CGO_ENABLED=0 ---> Using cache ---> fd86c2a9948c Step 4/11 : WORKDIR /app/server ---> Using cache ---> 8d59571272b7 Step 5/11 : COPY go.mod . ---> Using cache ---> d1c8a0f00d33 Step 6/11 : COPY go.sum . ---> Using cache ---> a1b4b294de83 Step 7/11 : RUN go mod download ---> Using cache ---> 803fd4244374 Step 8/11 : COPY . . ---> 8a1880bb8b56 Step 9/11 : RUN go build -o main . ---> Running in 84f20ebb4606 Removing intermediate container 84f20ebb4606 ---> e0304d6454d4 Step 10/11 : EXPOSE 8080:8080 ---> Running in 7a0b6392be6e Removing intermediate container 7a0b6392be6e ---> 3b18860bca2c Step 11/11 : CMD ["./main"] ---> Running in 018d6769b721 Removing intermediate container 018d6769b721 ---> bbf448ab621c Successfully built bbf448ab621c Successfully tagged godocker_app:latest
C:\DEV\Go\src\godocker>docker-compose up -d Creating network "godocker_default" with the default driver Creating godockerDB ... done Creating godockerAPP ... done
Upvotes: 0
Views: 958
Reputation: 2017
To connect, you have to use the service name declared in your docker-compose.yml instead of container name.
db:3306 // instead of godockerDB:3306
Upvotes: 1