Docker MySQL - не удается подключиться из приложения Spring Boot к базе данных MySQL - PullRequest
0 голосов
/ 04 июня 2019

Я пытаюсь подключиться из моего приложения для весенней загрузки к базе данных MySQL в Docker.Каждый в своем собственном контейнере.

Но у меня, должно быть, что-то не так, потому что я не могу этого сделать.

Для простоты:

свойства приложения:

# URL for the mysql db
spring.datasource.url=jdbc:mysql://workaround-mysql:3308/workaround?serverTimezone=UTC&max_allowed_packet=15728640
# User name in mysql
spring.datasource.username=springuser
# Password for mysql
spring.datasource.password=admin
#Port at which application runs
server.port=8080

docker-compose для MySQL:

version: '3'
services:
  workaround-mysql:
    container_name: workaround-mysql
    image: mysql
    environment:
      MYSQL_DATABASE: workaround
      MYSQL_USER: springuser
      MYSQL_PASSWORD: admin
      MYSQL_ROOT_PASSWORD: admin
      MYSQL_ROOT_HOST: '%'
    ports:
      - "3308:3306"
    restart: always

Так довольно просто, верно?База данных, с которой я начинаю docker-compose up:

enter image description here

Кажется, что пока все работает нормально.

Теперь, когда у меня запущена база данныхДля приложения это его docker-compose.yml:

version: '3'
services:

  workaround:
    restart: always
    # will build ./docker/workaround/Dockerfile
    build: ./docker/workaround
    working_dir: /workaround
    volumes:
      - ./:/workaround
      - ~/.m2:/root/.m2
    expose:
      - "8080"
    command: "mvn clean spring-boot:run"

Для его Dockerfile я использую Linux Alpine и Java.

FROM alpine:3.9
....add java...
RUN apk update
RUN apk add dos2unix --update-cache --repository http://dl-3.alpinelinux.org/alpine/edge/community/ --allow-untrusted
RUN apk add bash
RUN apk add maven

Супер просто.Теперь давайте запустим приложение:

enter image description here

enter image description here

enter image description here

Неизвестный хост, поэтому давайте попробуем IP тогда:

    docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' workaround-mysql

# URL for the mysql db
spring.datasource.url=jdbc:mysql://172.20.0.2:3308/workaround?serverTimezone=UTC&max_allowed_packet=15728640

Теперь я получаю тайм-аут:

enter image description here

Как видите, я получаю ошибку.Что не так с моей настройкой и как это исправить?Либо у меня неизвестное исключение хоста, либо отказано в соединении, либо истекло время ожидания соединения.

Я попытался:

  • Использование ip контейнера в моем application.properties, не работает
  • Различные порты для MySQL и приложения
  • Различные образы и версии MySQL
  • Наличие всего в одном докере скомпоновано с таймером ожидания
  • для базы данных.
  • Минимальная настройка с https://github.com/hellokoding/hellokoding-courses/tree/master/docker-examples/dockercompose-springboot-mysql-nginx Также привела к сбою канала связи, Сайт был доступен, но я сомневаюсь, что дБ был подключен правильно.

Примечания :

  • Я запускаю все это на одном компьютере, я использую порт 3308, потому что у меня локальная база данных MySQL на 3306.

  • Вот docker ps -a

enter image description here

@ Выход Vusal ОТВЕТ:

enter image description here

Тольковещь, отличная от кода в ответе Я ждал, пока база данных будет готова 30 секунд

command: /bin/bash -c "sleep 30;mvn clean spring-boot:run;"

Ответы [ 3 ]

3 голосов
/ 04 июня 2019

Попробуйте это docker-compose.yml:

version: '3'
services:
  workaround-mysql:
    container_name: workaround-mysql
    image: mysql
    environment:
      MYSQL_DATABASE: workaround
      MYSQL_USER: springuser
      MYSQL_PASSWORD: admin
      MYSQL_ROOT_PASSWORD: admin
      MYSQL_ROOT_HOST: '%'
    ports:
      - "3308:3306"
    restart: always
  workaround:
    depends_on: 
      - workaround-mysql
    restart: always
    # will build ./docker/workaround/Dockerfile
    build: ./docker/workaround
    working_dir: /workaround
    volumes:
      - ./:/workaround
      - ~/.m2:/root/.m2
    expose:
      - "8080"
    command: "mvn clean spring-boot:run"

И обновите свой application.properties, чтобы использовать следующий URL-адрес соединения JDBC:

spring.datasource.url=jdbc:mysql://workaround-mysql:3306/workaround?serverTimezone=UTC&max_allowed_packet=15728640

Должно работать, когда оба контейнера в одном и том же файле docker-compose, потому что docker-compose создает сеть по умолчанию для контейнеров, поэтому они могут разрешать друг друга по имени.

1 голос
/ 04 июня 2019

Чтобы служба подключалась к MySql через докер, она должна находиться в той же сети, посмотрите в сети Docker

Но для лучшего решения я бы предложила вам написать один файл компоновки Docker для MySql иПружинная загрузка. Причина в том, что она легко подключится, когда вы это сделаете. Никакой другой конфигурации не требуется.

version: "3"
services:
  mysql-service:
    image: mysql
    ports:
      - "3306:3306"
    environment:
      - MYSQL_DATABASE=db
      - MYSQL_USER=root
      - MYSQL_PASSWORD=pass
      - MYSQL_ROOT_PASSWORD=pass
  spring-service:
    image: springservce:latest
    ports:
      - "8080:8080"
    depends_on:
      - mysql-service

1 голос
/ 04 июня 2019

Пока вы не пытались запустить оба контейнера в одной сети.

Во-первых, забудьте о IP-адресации - его следует избегать любыми способами.

Во-вторых, запустите оба составных экземпляра с одной и той же докерной сетью.

В-третьих, не открывают порты - внутри мостовой сети все порты доступны для работающих контейнеров.

  1. Создать глобальную сеть

    docker network create foo
    
  2. Измените оба файла составления так, чтобы они использовали эту сеть вместо того, чтобы создавать каждый свой собственный:

    version: '3.5'
    services:
    
    ....
    
    networks:
      default:
        external: true
        name: foo
    
  3. Удалить директивы expose из составных файлов - внутри одной сети все порты по умолчанию доступны

  4. Измените строки подключения, чтобы использовать порт по умолчанию 3306 вместо 3308

  5. Наслаждайтесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...