【问题标题】:I cannot connect the mysql container from server container using the docker-compose我无法使用 docker-compose 从服务器容器连接 mysql 容器
【发布时间】:2021-05-17 01:05:59
【问题描述】:

我已经尝试将 golang 容器与 mysql 容器连接近 5 天,每次我遇到关于“连接被拒绝”问题的问题,所以我添加了 Wait 以便 golang 容器在 Mysql 时等待连接容器正在准备自己...但是在 docker 文件和 docker compose 文件中添加等待命令并不能解决任何问题。

这是我一直面临的错误

 docker-compose up
Creating network "bucket-api_fullstack" with driver "br
Creating bucket-database ... done
Creating bucket-api      ... done
Attaching to bucket-database, bucket-api
bucket-api      | -------------------------------------
bucket-api      |  docker-compose-wait 2.7.2
bucket-api      | ---------------------------
bucket-api      | Starting with configuration:
bucket-api      |  - Hosts to be waiting for: [bucket-m
bucket-api      |  - Timeout before failure: 300 second
bucket-api      |  - TCP connection timeout before retr
bucket-api      |  - Sleeping time before checking for 
bucket-api      |  - Sleeping time once all hosts are a
bucket-api      |  - Sleeping time between retries: 30 
bucket-api      | -------------------------------------
bucket-api      | Checking availability of bucket-mysql
bucket-api      | Host bucket-mysql:3305 not yet availa
bucket-database | 2021-02-13 06:01:44+00:00 [Note] [Ent MySQL Server 8.0.23-1debian10 started.
bucket-database | 2021-02-13 06:01:44+00:00 [Note] [Entd user 'mysql'
bucket-database | 2021-02-13 06:01:44+00:00 [Note] [Ent MySQL Server 8.0.23-1debian10 started.
bucket-database | 2021-02-13T06:01:45.306754Z 0 [Systemn/mysqld (mysqld 8.0.23) starting as process 1
bucket-database | 2021-02-13T06:01:45.415685Z 1 [Systemnitialization has started.
bucket-database | 2021-02-13T06:01:47.738724Z 1 [Systemnitialization has ended.
bucket-database | 2021-02-13T06:01:48.172811Z 0 [System ready for connections. Bind-address: '::' port: 33060,.sock
bucket-database | 2021-02-13T06:01:48.350857Z 0 [System XA crash recovery...
bucket-database | 2021-02-13T06:01:48.357430Z 0 [System recovery finished.
bucket-database | 2021-02-13T06:01:48.743684Z 0 [Warninificate ca.pem is self signed.
bucket-database | 2021-02-13T06:01:48.744238Z 0 [System
mysql_main configured to support TLS. Encrypted connect channel.
bucket-database | 2021-02-13T06:01:48.918000Z 0 [Warnine configuration for --pid-file: Location '/var/run/mysqo all OS users. Consider choosing a different directory
bucket-database | 2021-02-13T06:01:49.233036Z 0 [Systemn/mysqld: ready for connections. Version: '8.0.23'  socck'  port: 3306  MySQL Community Server - GPL.
bucket-api      | Host bucket-mysql:3305 not yet availa
bucket-api      | Host bucket-mysql:3305 not yet availa
bucket-api      | Host bucket-mysql:3305 not yet availa
bucket-api      | Host bucket-mysql:3305 not yet availa
bucket-api      | Host bucket-mysql:3305 not yet availa
bucket-api      | Host bucket-mysql:3305 not yet availa
bucket-api      | Host bucket-mysql:3305 not yet availa
bucket-api      | Host bucket-mysql:3305 not yet availa
bucket-api      | Host bucket-mysql:3305 not yet availa
bucket-api      | Host bucket-mysql:3305 not yet availa
bucket-api      | Timeout! After 300 seconds some hosts
bucket-api      | Host bucket-mysql:3305 not yet availa
bucket-api      | Host bucket-mysql:3305 not yet availa
bucket-api      | Host bucket-mysql:3305 not yet availa
bucket-api      | Host bucket-mysql:3305 not yet availa
bucket-api      | Host bucket-mysql:3305 not yet availa
bucket-api      | Host bucket-mysql:3305 not yet availa
bucket-api      | Host bucket-mysql:3305 not yet availa
bucket-api      | Host bucket-mysql:3305 not yet availa
bucket-api      | Host bucket-mysql:3305 not yet availa
bucket-api      | Host bucket-mysql:3305 not yet availa
bucket-api      | Timeout! After 300 seconds some hosts
bucket-api exited with code 1
bucket-api      | Host bucket-mysql:3305 not yet availa
bucket-api      | Host bucket-mysql:3305 not yet availa
bucket-api      | Host bucket-mysql:3305 not yet availa
bucket-api      | Host bucket-mysql:3305 not yet availa
bucket-api      | Host bucket-mysql:3305 not yet availa
bucket-api      | Host bucket-mysql:3305 not yet availa
bucket-api      | Host bucket-mysql:3305 not yet availa
bucket-api      | Host bucket-mysql:3305 not yet availa
bucket-api      | Host bucket-mysql:3305 not yet availa
bucket-api      | Host bucket-mysql:3305 not yet availa
bucket-api      | Timeout! After 300 seconds some hosts
bucket-api exited with code 1
bucket-api      | Host bucket-mysql:3305 not yet availa

这是我的 Dockerfile

  #Builder image build the go binary : Setting the alias as builder
FROM golang:1.15-alpine as builder
RUN mkdir /app

# add this file directory to the image
ADD . /app
# directory where the source file execution takes place
WORKDIR /app

# RUN some go commands
RUN go clean --modcache
RUN go mod download
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o main ./src/

# Our production image used to run our app
FROM alpine:latest
RUN apk --no-cache add ca-certificates
RUN apk add --no-cache git make musl-dev go
COPY --from=builder /app/main .

# Add docker-compose-wait tool -------------------
ENV WAIT_VERSION 2.7.2
ADD https://github.com/ufoscout/docker-compose-wait/releases/download/$WAIT_VERSION/wait /wait
RUN chmod +x /wait


# Configure GO
ENV GOROOT /usr/lib/go
ENV GOPATH /go
ENV PATH /go/bin:$PATH

RUN mkdir -p ${GOPATH}/src ${GOPATH}/bin
EXPOSE 8084
CMD ["./main"]

这是我的 docker-compose 文件

version: '3.8'

services: 
  # MYSQL DATABASE DOCKER
  bucket-mysql:
    image: mysql:latest
    container_name: bucket-database
    command: --default-authentication-plugin=mysql_native_password
    ports: 
      - "3305:3306"
    expose: 
      - "3305"
    environment: 
      MYSQL_ROOT_PASSWORD: "123"
      MYSQL_USER: "bu"
      MYSQL_PASSWORD: "root"
      MYSQL_DATABASE: "rb_db"
    networks: 
      - fullstack
    volumes: 
      - database_mysql:/var/lib/mysql
    restart: always
    cap_add: 
      - SYS_NICE
    healthcheck: 
      test: ["CMD-SHELL", "echo 'select 1' |mysql -u root -p'pagal!123' --silent"]
      interval: 30s
      timeout: 20s
      retries: 6
  
  #API DOCKER 
  bucket:
    image: bucketapi
    build: . 
    container_name: bucket-api
    command: sh -c "/wait"
    environment:
      WAIT_HOSTS: bucket-mysql:3305
      WAIT_HOSTS_TIMEOUT: 300
      WAIT_SLEEP_INTERVAL: 30
      WAIT_HOST_CONNECT_TIMEOUT: 30
      MYSQL_ROOT_PASSWORD: "pagal!123"
      MYSQL_USER: "bu"
      MYSQL_PASSWORD: "123"
      MYSQL_DATABASE: "rb_db"
      # MYSQL_HOST: "bucket-database"
      # MYSQL_PORT: "3305"
    ports: 
      - "8084:8084"
    restart: on-failure
    # volumes: 
    #   - ./src:/usr/src/app/
    depends_on: 
      - bucket-mysql
    networks: 
      - fullstack


volumes: 
    database_mysql:
  
networks: 
  fullstack:
    driver: bridge

这是我的 Go MySQL 连接代码

func init() {
    // loaDerr := godotenv.Load()
    // if loaDerr != nil {
    //  log.Fatal("Error loading .env file")
    // }

    username := os.Getenv("MYSQL_USER")
    password := os.Getenv("MYSQL_ROOT_PASSWORD")
    host := os.Getenv("WAIT_HOSTS")
    port := os.Getenv("MYSQL_PORT")
    schema := os.Getenv("MYSQL_DATABASE")

    fmt.Println(username, password, host, port, schema)

    dataSourceName := fmt.Sprintf(
        "%s:%s@tcp(%s)/%s?charset=utf8&parseTime=True&loc=Local",
        username,
        password,
        host,
       // port,
        schema,
    )

    var err error
    //connect to the database server
    client, err = sql.Open("mysql", dataSourceName)
    if err != nil {
        panic(err)
    }

    //checking the connection
    if connectionErr := client.Ping(); connectionErr != nil {
        panic(connectionErr.Error())
    }

    fmt.Println("Database connection is been established succesfully")
}

请帮助我,我已经尝试了所有组合,但它不起作用,如果我将 mysql 工作台与正在运行的 mysql 容器连接,它会正常连接并且不会给出任何错误,但与 docker 和 golang 连接它会给我一个错误谢谢你

【问题讨论】:

  • 您有几段全部大写。在国际上,这被认为是大喊大叫。
  • 现在,可以了吗??

标签: mysql docker go docker-compose dockerfile


【解决方案1】:

每当您在容器之间建立连接时,Docker 都会使用服务侦听的“正常”端口。如果您连接到 MySQL 或 MariaDB 容器,它总是使用端口 3306;在这种情况下,ports: 不是必需的,如果是,它们将被忽略。

services:
  bucket-mysql:
    image: mysql:latest
    # neither expose: nor ports: are required
  bucket:
    build: .
    environment:
      WAIT_HOSTS: bucket-mysql:3306 # ignores ports: remapping
      MYSQL_HOST: bucket-mysql
      # MYSQL_PORT: "3306"          # this is the default port

(expose: 在现代 Docker 中几乎什么都不做,删除它是安全的;如果你有它,端口号就是容器内的端口号,mysql 图像已经有 EXPOSE 3306它的 Dockerfile。您还可以安全地依赖 Compose 的 networks:container_name: 和构建的 image: 名称的默认值,此外,您通常不需要从 Dockerfile 为其指定的 @987654330 覆盖 command: @. 这可能有助于简化您的 docker-compose.yml 文件。)

【讨论】:

  • 我尝试将 HOST 设置为 bucket-mysql 并使用 PORT 3306 其工作但一段时间后 golang 容器以代码 0 退出,我该如何解决这个问题?谢谢您的帮助跨度>
  • 大卫,我正在使用端口 3305,因为我想将它连接到 mysql 工作台以检查数据库
  • "Exited with code 0" 通常意味着你的程序运行到最后,成功;这可能不是配置问题。您可以设置 ports: ['3305:3306'] 以使数据库可以从 Docker 外部通过 3305 端口访问,但即使您设置了此设置,您也需要使用标准端口 3306 连接 Docker 内的容器。
【解决方案2】:

在您的 DSN 中,您没有设置端口,该端口已从您的 docker-compose 中的默认 3306 -> 3305 更改

 fmt.Println(username, password, host, port, schema)

    dataSourceName := fmt.Sprintf(
        "%s:%s@tcp(%s)/%s?charset=utf8&parseTime=True&loc=Local",
        username,
        password,
        host,
        schema,
    )

将端口添加到 DSN

 fmt.Println(username, password, host, port, schema)

    dataSourceName := fmt.Sprintf(
        "%s:%s@tcp(%s:%s)/%s?charset=utf8&parseTime=True&loc=Local",
        username,
        password,
        host,
        port
        schema,
    )

【讨论】:

  • 好答案,我认为 OP 可能还缺少容器之间的链接/外部链接部分以便能够使用服务别名(除非在 compose 中进行了更改,并且如果两个容器放入相同的容器中,它们会自动创建网络。
  • 卢卡斯,我也添加了端口,但是那个东西也不起作用,我已经应用了所有的组合,比如暴露 3305 端口,或者更改环境值中的一些值,添加等待选项,以及尝试编写所有新的 docker 文件...我已经完成了所有这些,但这些对我没有帮助
  • 关于链接/外部链接参考这里:stackoverflow.com/questions/33021084/…
【解决方案3】:

看看你的设置:

WAIT_HOSTS:bucket-mysql:3305

您在 GO 应用中使用的是相同的,它应该是 3306!

3305 是它在您的主机上运行的端口

【讨论】:

    猜你喜欢
    • 2022-12-09
    • 1970-01-01
    • 2023-02-23
    • 2021-04-04
    • 1970-01-01
    • 2019-04-14
    • 2017-08-10
    • 2019-07-22
    • 1970-01-01
    相关资源
    最近更新 更多