Я не понимаю, почему я не могу подключиться к mysql с помощью многоконтейнерного приложения docker compose golang mariadb/mysql

Попытка создать многоконтейнерное приложение golang mysql. Аналогично примеру с докером https://docs.docker.com/get-started/07_multi_container/

Я не понимаю, почему в соединении отказывают.

dial tcp 127.0.0.1:3306: connect: connection refused

Вот мой docker-compose.yaml

version: '3.7'

services:
  api:
    # api service starts ok but fatal error at db connection
  maria-db:
    image: mariadb:10-focal
    container_name: s-maria-db
    command: '--default-authentication-plugin=mysql_native_password'
    restart: always
    healthcheck:
      test: ["CMD-SHEL", "mysqladmin ping -h 127.0.0.1 --password=secret --silent"]
      interval: 3s
      retries: 5
      start_period: 30s
    expose:
      - "3306:3306"
    # setting some env vars to create the DB
    environment:
      MYSQL_ROOT_PASSWORD: "secret"
      MYSQL_DATABASE: "s_db"

    # we mount a data volume to make sure we don't lose data
    volumes:
      - db-data:/var/lib/mysql

volumes:
  db-data:


Вот мой код для подключения к БД

func Connect() (*sql.DB, error) {
    db, err := sql.Open("mysql", "root:secret@/s_db")
    
    if err != nil {
        return nil, err
    }

    defer db.Close()

    pingErr := db.Ping()
    if pingErr != nil {
        return nil, pingErr
    }
    return db, nil
}

Я всегда вижу dial tcp 127.0.0.1:3306: connect: connection refused

Я могу

docker exec -it s-maria-db bash
.
.
.
MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| s_db        |
| mysql              |
| performance_schema |
| sys                |
+--------------------+

и вижу, что БД настроена правильно, но я никогда не могу к ней подключиться.

Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
0
82
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

попробуйте подключиться, используя имя контейнера, поэтому композитор докеров использует сеть докеров. Это позволяет вам подключаться через имя контейнера в качестве сетевого псевдонима.

func Connect() (*sql.DB, error) {
db, err := sql.Open("mysql", "root:secret@tcp(s-maria-db)/s_db")

if err != nil {
    return nil, err
}

defer db.Close()

pingErr := db.Ping()
if pingErr != nil {
    return nil, pingErr
}
return db, nil

}

Я все еще вижу отказ в подключении, когда на db.Ping() @charindu

YouWontBreakMySoul 30.03.2023 21:01

Дополнительно обновлено

    for i := 0; i < 60; i++ {
        if err := db.Ping(); err == nil {
            fmt.Print("We are connected!")
            break
        }
        time.Sleep(time.Second)
    }

как видно https://github.com/docker/awesome-compose/blob/master/nginx-golang-mysql/backend/main.go

Другие вопросы по теме