Mysql2 :: Error :: ConnectionError: Невозможно подключиться к серверу MySQL в «mysql» (111 «Отказано в соединении») - PullRequest
0 голосов
/ 16 января 2019

Я запускаю docker-compose для моих примеров приложений, и этот файл состоит из базы данных mysql и образа приложения. я получаю следующую ошибку.

$ docker logs -f sample-application
Can't connect to MySQL server on 'mysql' (111 "Connection refused")
Couldn't create database for {"adapter"=>"mysql2", "encoding"=>"utf8", "pool"=>5, "reconnect"=>true, "database"=>"datagen", "username"=>"root", "password"=>"password", "host"=>"mysql", "port"=>3306}
rake aborted!
Mysql2::Error::ConnectionError: Can't connect to MySQL server on 'mysql' (111 "Connection refused")
/usr/local/bundle/gems/mysql2-0.5.2/lib/mysql2/client.rb:90:in `connect'
/usr/local/bundle/gems/mysql2-0.5.2/lib/mysql2/client.rb:90:in `initialize'
/usr/local/bundle/gems/activerecord-5.2.1/lib/active_record/connection_adapters/mysql2_adapter.rb:22:in `new'
/usr/local/bundle/gems/activerecord-5.2.1/lib/active_record/connection_adapters/mysql2_adapter.rb:22:in `mysql2_connection'
/usr/local/bundle/gems/activerecord-5.2.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:809:in `new_connection'
/usr/local/bundle/gems/activerecord-5.2.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:853:in `checkout_new_connection'
/usr/local/bundle/gems/activerecord-5.2.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:832:in `try_to_checkout_new_connection'
/usr/local/bundle/gems/activerecord-5.2.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:793:in `acquire_connection'
/usr/local/bundle/gems/activerecord-5.2.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:521:in `checkout'
/usr/local/bundle/gems/activerecord-5.2.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:380:in `connection'
/usr/local/bundle/gems/activerecord-5.2.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:1008:in `retrieve_connection'
/usr/local/bundle/gems/activerecord-5.2.1/lib/active_record/connection_handling.rb:118:in `retrieve_connection'
/usr/local/bundle/gems/activerecord-5.2.1/lib/active_record/connection_handling.rb:90:in `connection'
/usr/local/bundle/gems/activerecord-5.2.1/lib/active_record/tasks/mysql_database_tasks.rb:6:in `connection'
/usr/local/bundle/gems/activerecord-5.2.1/lib/active_record/tasks/mysql_database_tasks.rb:14:in `create'
/usr/local/bundle/gems/activerecord-5.2.1/lib/active_record/tasks/database_tasks.rb:119:in `create'
/usr/local/bundle/gems/activerecord-5.2.1/lib/active_record/tasks/database_tasks.rb:139:in `block in create_current'
/usr/local/bundle/gems/activerecord-5.2.1/lib/active_record/tasks/database_tasks.rb:316:in `block in each_current_configuration'
/usr/local/bundle/gems/activerecord-5.2.1/lib/active_record/tasks/database_tasks.rb:313:in `each'
/usr/local/bundle/gems/activerecord-5.2.1/lib/active_record/tasks/database_tasks.rb:313:in `each_current_configuration'
/usr/local/bundle/gems/activerecord-5.2.1/lib/active_record/tasks/database_tasks.rb:138:in `create_current'
/usr/local/bundle/gems/activerecord-5.2.1/lib/active_record/railties/databases.rake:29:in `block (2 levels) in <top (required)>'
/usr/local/bundle/gems/rake-12.3.1/exe/rake:27:in `<top (required)>'
Tasks: TOP => db:create
(See full trace by running task with --trace)

Вот компоненты базы данных для файла yaml mysql docker-compose

version: '3.1'

services:
sample-service:
image: service:latest
hostname: sample-service
container_name: sample-service
depends_on:
  - sample-application
ports:
  - "8080:8080"
networks:
  - $NETWORK_NAME

mysql:
image: mysql:5.7
hostname: mysql
container_name: mysql
ports:
  - "3306:3306"
environment:
  - MYSQL_ROOT_PASSWORD=password
  - MYSQL_DATABASE=foo
  - MYSQL_USER=root
  - MYSQL_PASSWORD=password
networks:
  - $NETWORK_NAME

sample-application:
image: sample:latest 
hostname: mysql
container_name: sample-application
depends_on:
  - mysql
ports:
  - "3000:3000"
environment:
  - RAILS_ENV=production
  - DATABASE_HOST=mysql
  - DATABASE_USER=root
  - DATABASE_NAME=foo
  - DATABASE_PORT=3306
networks:
  - $NETWORK_NAME

networks:
  datagen:
external: true

Я могу пропинговать mysql из образа контейнера докера приложения. Соединение установлено успешно, и в то же время я могу получить доступ к изображению mysql с другого компьютера.

Таким образом, в образе mysql нет проблем, но я не могу подключиться к хосту mysql при работе с использованием docker compose. Переменная окружения, которую я передаю, также верна.

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

bash-4.2# find / -name "*.cnf"
/var/lib/mysql/auto.cnf
/usr/share/mysql/my-default.cnf
/etc/pki/tls/openssl.cnf
/etc/my.cnf
/healthcheck.cnf
bash-4.2# cat /etc/my.cnf
# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/5.6/en/server-configuration-defaults.html

[mysqld]
#
# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M
#
# Remove leading # to turn on a very important data integrity option: logging
# changes to the binary log between backups.
# log_bin
#
# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M
skip-host-cache
skip-name-resolve
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
secure-file-priv=/var/lib/mysql-files
user=mysql

# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

1 Ответ

0 голосов
/ 16 января 2019

Вам действительно нужна внешняя сеть? Единственная возможная причина - вы хотите подключить к нему другие контейнеры. В противном случае не используйте его - вы сможете получить доступ к контейнерам с хоста только через механизм показа портов.

Если вы не собираетесь обращаться к базе данных извне docker-compose, рассмотрите следующие изменения в файле:

  • удалены ненужные вещи
  • удаленные порты (внутри определенной пользователем сети вам не нужно показывать)

докер-compose.yml

version: '3.1'

services:
  mysql:
    image: mysql:5.7
    environment:
      - MYSQL_ROOT_PASSWORD=password
      - MYSQL_DATABASE=foo
      - MYSQL_USER=root
      - MYSQL_PASSWORD=password

  sample-application:
    image: sample:latest 
    depends_on:
      - mysql
    environment:
      - RAILS_ENV=production
      - DATABASE_HOST=mysql
      - DATABASE_USER=root
      - DATABASE_NAME=foo
      - DATABASE_PORT=3306

  sample-service:
    image: service:latest
    depends_on:
      - sample-application

При такой конфигурации вы можете обращаться к сервисам внутри сети по их именам, например, mysql, sample-service и sample-application

Кстати странная ситуация, когда сервис зависит от приложения, а не наоборот

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