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/bashY 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 assethostQuiero 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
Descubrí una manera de aplicar la opción skip-grant-tables al inicio.
En docker-entrypoint.sh, cambié /etc/init.d/mysql start a
HOME=/etc/mysql /usr/bin/mysqld_safe > /dev/null 2>&1 &
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.
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'.
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/bashEstá 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.cnfConsulte el documento para conocer varias formas de iniciar/detener el servidor Mysql