I do not understand why I can not connect to mysql using docker compose golang mariadb/mysql multi container app

huangapple go评论112阅读模式
英文:

I do not understand why I can not connect to mysql using docker compose golang mariadb/mysql multi container app

问题

尝试创建一个使用Golang和MySQL的多容器应用程序,类似于Docker示例https://docs.docker.com/get-started/07_multi_container/。

我不明白为什么连接被拒绝。

dial tcp 127.0.0.1:3306: connect: connection refused

这是我的docker-compose.yaml文件:

  1. version: '3.7'
  2. services:
  3. api:
  4. # api服务正常启动,但在连接数据库时出现致命错误
  5. maria-db:
  6. image: mariadb:10-focal
  7. container_name: s-maria-db
  8. command: '--default-authentication-plugin=mysql_native_password'
  9. restart: always
  10. healthcheck:
  11. test: ["CMD-SHEL", "mysqladmin ping -h 127.0.0.1 --password=secret --silent"]
  12. interval: 3s
  13. retries: 5
  14. start_period: 30s
  15. expose:
  16. - "3306:3306"
  17. # 设置一些环境变量来创建数据库
  18. environment:
  19. MYSQL_ROOT_PASSWORD: "secret"
  20. MYSQL_DATABASE: "s_db"
  21. # 挂载数据卷以确保不丢失数据
  22. volumes:
  23. - db-data:/var/lib/mysql
  24. volumes:
  25. db-data:

这是我连接数据库的Go代码:

  1. func Connect() (*sql.DB, error) {
  2. db, err := sql.Open("mysql", "root:secret@/s_db")
  3. if err != nil {
  4. return nil, err
  5. }
  6. defer db.Close()
  7. pingErr := db.Ping()
  8. if pingErr != nil {
  9. return nil, pingErr
  10. }
  11. return db, nil
  12. }

我总是看到dial tcp 127.0.0.1:3306: connect: connection refused的错误。

我可以执行以下命令:

  1. docker exec -it s-maria-db bash
  2. .
  3. .
  4. .
  5. MariaDB [(none)]> show databases;
  6. +--------------------+
  7. | Database |
  8. +--------------------+
  9. | information_schema |
  10. | s_db |
  11. | mysql |
  12. | performance_schema |
  13. | sys |
  14. +--------------------+

并且可以看到数据库已正确配置,但我无法连接到它。

英文:

Attempting to create a golang mysql multi container app. Similar to docker example https://docs.docker.com/get-started/07_multi_container/

I do not understand why connection is refused.

dial tcp 127.0.0.1:3306: connect: connection refused

Here is my docker-compose.yaml

  1. version: '3.7'
  2. services:
  3. api:
  4. # api service starts ok but fatal error at db connection
  5. maria-db:
  6. image: mariadb:10-focal
  7. container_name: s-maria-db
  8. command: '--default-authentication-plugin=mysql_native_password'
  9. restart: always
  10. healthcheck:
  11. test: ["CMD-SHEL", "mysqladmin ping -h 127.0.0.1 --password=secret --silent"]
  12. interval: 3s
  13. retries: 5
  14. start_period: 30s
  15. expose:
  16. - "3306:3306"
  17. # setting some env vars to create the DB
  18. environment:
  19. MYSQL_ROOT_PASSWORD: "secret"
  20. MYSQL_DATABASE: "s_db"
  21. # we mount a data volume to make sure we don't lose data
  22. volumes:
  23. - db-data:/var/lib/mysql
  24. volumes:
  25. db-data:

Here is my go-code to connect to db

  1. func Connect() (*sql.DB, error) {
  2. db, err := sql.Open("mysql", "root:secret@/s_db")
  3. if err != nil {
  4. return nil, err
  5. }
  6. defer db.Close()
  7. pingErr := db.Ping()
  8. if pingErr != nil {
  9. return nil, pingErr
  10. }
  11. return db, nil
  12. }

I always see dial tcp 127.0.0.1:3306: connect: connection refused

I can

  1. docker exec -it s-maria-db bash
  2. .
  3. .
  4. .
  5. MariaDB [(none)]> show databases;
  6. +--------------------+
  7. | Database |
  8. +--------------------+
  9. | information_schema |
  10. | s_db |
  11. | mysql |
  12. | performance_schema |
  13. | sys |
  14. +--------------------+

and see the db is configured correctly , but I can never connect to it.

答案1

得分: 2

尝试使用容器的名称进行连接,因为Docker Compose使用Docker网络。这样可以通过容器的名称作为网络别名进行连接。

  1. func Connect() (*sql.DB, error) {
  2. db, err := sql.Open("mysql", "root:secret@tcp(s-maria-db)/s_db")
  3. if err != nil {
  4. return nil, err
  5. }
  6. defer db.Close()
  7. pingErr := db.Ping()
  8. if pingErr != nil {
  9. return nil, pingErr
  10. }
  11. return db, nil
  12. }
英文:

try to connect using container's name hence docker composer uses docker network. That allows you to connect via container's name as a network alias.

  1. func Connect() (*sql.DB, error) {
  2. db, err := sql.Open("mysql", "root:secret@tcp(s-maria-db)/s_db")
  3. if err != nil {
  4. return nil, err
  5. }
  6. defer db.Close()
  7. pingErr := db.Ping()
  8. if pingErr != nil {
  9. return nil, pingErr
  10. }
  11. return db, nil

}

答案2

得分: 2

此外,更新的代码如下:

  1. for i := 0; i < 60; i++ {
  2. if err := db.Ping(); err == nil {
  3. fmt.Print("我们已连接!")
  4. break
  5. }
  6. time.Sleep(time.Second)
  7. }

代码来源:https://github.com/docker/awesome-compose/blob/master/nginx-golang-mysql/backend/main.go

英文:

Additionally updated go with

  1. for i := 0; i &lt; 60; i++ {
  2. if err := db.Ping(); err == nil {
  3. fmt.Print(&quot;We are connected!&quot;)
  4. break
  5. }
  6. time.Sleep(time.Second)
  7. }

as seen https://github.com/docker/awesome-compose/blob/master/nginx-golang-mysql/backend/main.go

huangapple
  • 本文由 发表于 2023年3月31日 00:59:22
  • 转载请务必保留本文链接:https://go.coder-hub.com/75891043.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定