Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

359
Views
Docker: MySQL rechaza la IP del host a menos que lo reinicie manualmente

Aquí está mi Dockerfile:

 FROM debian:jessie-backports RUN apt-get update --yes && apt-get upgrade --yes RUN DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \ git \ curl \ build-essential\ libssl-dev\ ca-certificates\ mysql-server\ redis-server\ elasticsearch USER root ENV HOME /root # MYSQL SETUP RUN sed -i -e"s/^bind-address\s*=\s*127.0.0.1/#bind-address = 0.0.0.0/" /etc/mysql/my.cnf RUN sed -i -e"s/^#max_connections\s*=\s*100/max_connections = 200/" /etc/mysql/my.cnf RUN echo "\n[mysqld]\nskip-grant-tables\n" >> /etc/mysql/my.cnf VOLUME ["/var/lib/mysql", "/var/log/mysql"] EXPOSE 3306 # REDIS SETUP RUN echo "daemonize yes\nbind 0.0.0.0" >> /etc/redis/redis-serve.conf RUN sed 's/^daemonize no/daemonize yes/' -i /etc/redis/redis.conf \ && sed 's/^bind 127.0.0.1/bind 0.0.0.0/' -i /etc/redis/redis.conf \ && sed 's/^# unixsocket /unixsocket /' -i /etc/redis/redis.conf \ && sed 's/^# unixsocketperm 755/unixsocketperm 777/' -i /etc/redis/redis.conf \ && sed '/^logfile/d' -i /etc/redis/redis.conf VOLUME ["/var/lib/redis", "/var/log/redis"] EXPOSE 6379 6380 # ELASTICSEARCH SETUP RUN sed 's/^#START_DAEMON=true/START_DAEMON=true/' -i /etc/default/elasticsearch VOLUME ["/opt/elasticsearch/data", "/opt/elasticsearch/logs"] EXPOSE 9200 9300 ADD docker-entrypoint.sh /usr/local/bin/docker-entrypoint.sh RUN chmod 777 /usr/local/bin/docker-entrypoint.sh ENTRYPOINT ["/usr/local/bin/docker-entrypoint.sh"]

El punto de entrada:

 #!/bin/bash /etc/init.d/mysql start /etc/init.d/redis-server start /etc/init.d/elasticsearch start /bin/bash

Y el comando que estoy ejecutando para iniciar el contenedor:

 docker run -i -t -p 3306:3306 -p 6379:6379 -p 9200:9200 -p 9300:9300 assethost

Quiero conectarme al servidor MySQL que se ejecuta en el contenedor desde el host, pero esto es lo que sucede cuando intento conectarme:

ERROR 1130 (HY000): Host '192.168.99.1' is not allowed to connect to this MySQL server

Tanto Redis como Elasticsearch se exponen muy bien. MySQL solo comenzará a aceptar hosts externos si lo reinicio manualmente desde el shell Bash que aparece desde el punto de entrada cuando ejecuto el contenedor. Tengo que ejecutar /etc/init.d/mysql restart . Solo entonces, puedo conectarme con éxito desde el host usando el cliente MySQL.

Tenga en cuenta que estoy usando docker-machine , por lo que tengo que darle al cliente MySQL la IP del host para poder conectarme.

¿Cómo puedo conectarme desde el host a la instancia de MySQL que se ejecuta en el contenedor sin tener que reiniciar MySQL manualmente?

Docker versión 1.12.1, compilación 23cf638

about 4 years ago · Santiago Trujillo
3 answers
Answer question

0

Descubrí una manera de aplicar la opción skip-grant-tables al inicio.

Solución alterna

En docker-entrypoint.sh, cambié /etc/init.d/mysql start a

HOME=/etc/mysql /usr/bin/mysqld_safe > /dev/null 2>&1 &

Otros cambios

Como ya había una sección [mysqld] en my.cnf, cambié la siguiente línea en Dockerfile RUN echo "\n[mysqld]\nskip-grant-tables\n" >> /etc/mysql/my.cnf

a

RUN sed -i '/\[mysqld\]/ a skip-grant-tables\nskip-name-resolve' /etc/mysql/my.cnf

Agregué skip-name-resolve para que mysql no intente resolver los nombres de las direcciones IP locales.

Advertencias

La solución alternativa ya no funciona cuando se ejecuta /etc/init.d/mysql restart , pero /etc/init.d/mysql stop; /etc/init.d/mysql start conservó la opción 'skip-grant-tables'.

about 4 years ago · Santiago Trujillo Report

0

Supongo que MySQL ya comenzó después de su instalación y ejecutar sed para cambiar la configuración no surtirá efecto. El punto de entrada que tiene tiene mysql start , pero probablemente esté viendo que MySQL ya se está ejecutando y no está haciendo nada. Intente cambiar ese comando a mysql restart , para que su secuencia de comandos bash de punto de entrada se convierta en:

 #!/bin/bash /etc/init.d/mysql restart /etc/init.d/redis-server start /etc/init.d/elasticsearch start /bin/bash
about 4 years ago · Santiago Trujillo Report

0

Está utilizando el indicador skip-grant-tables para iniciar sesión sin contraseña. Creo que debido a algunas razones del script /etc/init.d/mysql , el indicador se ignora en el primer inicio, lo que hace que se rechace la conexión desde root@192.168.99.1 . Creo que Docker no tiene nada que ver con este problema.

Para responder a su pregunta, no tiene que reiniciar a mano , puede cambiar su punto de entrada a:

 #!/bin/bash /etc/init.d/mysql start # Wait for mysql to be fully up, then restart (eg, 5 seconds) sleep 5 /etc/init.d/mysql restart /etc/init.d/redis-server start /etc/init.d/elasticsearch start /bin/bash

O bien, no use /etc/init.d/mysql start , en su lugar invoque mysqld directamente

 #!/bin/bash mysqld & /etc/init.d/redis-server start /etc/init.d/elasticsearch start /bin/bash

Además, aunque crear un grupo [mysqld] más en my.cnf no es un problema, debe agregar una nueva configuración al grupo existente:

 RUN sed -i '/\[mysqld\]/a skip-grant-tables' /etc/mysql/my.cnf

Consulte el documento para conocer varias formas de iniciar/detener el servidor Mysql

about 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!