(É provavelmente uma pergunta idiota devido ao meu conhecimento limitado com a administração do Docker ou do mysql, mas como passei uma noite inteira neste assunto, atrevo-me a perguntar.)
Em poucas palavras
Eu quero executar o mysql em um contêiner docker e me conectar a ele do meu host. Até agora, o melhor que consegui foi:
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
Mais detalhes
Estou usando o seguinte Dockerfile
:
FROM ubuntu:14.04.3
RUN apt-get update && apt-get install -y mysql-server
# Ensure we won't bind to localhost only
RUN grep -v bind-address /etc/mysql/my.cnf > temp.txt \
&& mv temp.txt /etc/mysql/my.cnf
# It doesn't seem needed since I'll use -p, but it can't hurt
EXPOSE 3306
CMD /etc/init.d/mysql start && tail -F /var/log/mysql.log
No diretório onde está este arquivo, posso construir a imagem com sucesso e executá-la com:
> docker build -t my-image .
> docker run -d -p 12345:3306 my-image
Quando anexo à imagem, parece funcionar muito bem:
# from the host
> docker exec -it <my_image_name> bash
#inside of the container now
$ mysql -u root
Welcome to the MySQL monitor. Commands end with ; or \g.
[...]
No entanto, não tenho muito sucesso do anfitrião:
> mysql -P 12345 -uroot
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
Ainda mais detalhes
- Eu vi que há uma pergunta que se parece com a minha . No entanto, não é o mesmo (e não tem nenhuma resposta de qualquer maneira)
- Eu vi que existem imagens dedicadas ao mysql , mas não tive mais sucesso com elas
- Minha
grep -v
podem se sentir estranho. É verdade que pode haver uma maneira mais limpa de fazer isso. Mas quando anexo minha imagem, posso observar que ela realmente funcionou conforme o esperado (ou seja: removi obind-address
). E posso ver no contêiner/var/log/mysql/error.log
:
Nome do host do servidor (endereço de ligação): '0.0.0.0'; porta: 3306 - '0.0.0.0' resolve para '0.0.0.0'; Soquete do servidor criado no IP: '0.0.0.0'.
mysql
docker
dockerfile
gturri
fonte
fonte
Respostas:
Se o seu host Docker MySQL estiver funcionando corretamente, você pode se conectar a ele a partir da máquina local, mas deve especificar o host, a porta e o protocolo assim:
Altere 3306 para o número da porta que você encaminhou do contêiner Docker (no seu caso, será 12345).
Como você está executando o MySQL dentro do contêiner Docker, o soquete não está disponível e você precisa se conectar por meio de TCP. Configurar "--protocol" no comando mysql mudará isso.
fonte
--socket=/var/run/mysqld/mysqld.sock
2. Monte este arquivo fora do contêiner Docker 3. Especifique o caminho para o soquete no cliente MySQL com--socket=/host/mysql.sock
--protocol=tcp
finalmente fiz a conexão funcionar. Obrigado @maniekq pela boa resposta e sua explicação sobre sockets via seu comentário!Se você usar "127.0.0.1" em vez de localhost, o mysql usará o método tcp e você deverá ser capaz de conectar o contêiner com:
fonte
Eu recomendo verificar docker-compose. Veja como isso funcionaria:
Crie um arquivo chamado docker-compose.yml parecido com este:
Em seguida, execute:
Notas:
Agora, você pode acessar o console mysql desta forma:
Notas:
Você pode passar o sinalizador -d para executar o contêiner mysql / mariadb no modo separado / plano de fundo.
A senha é "wp", que é definida no arquivo docker-compose.yml.
Mesmo conselho de maniekq, mas exemplo completo com docker-compose.
fonte
--protocol=tcp
consertou tudo para mim. Obrigado!O método simples é compartilhar o socket unix mysql com a máquina host. Em seguida, conecte através do soquete
Passos:
mkdir /host
docker run -it -v /host:/shared <mysql image>
./etc/my.cnf
e mude a entrada de socket no arquivo parasocket=/shared/mysql.sock
service mysql restart
no dockermysql -u root --socket=/host/mysql.sock
. Se a senha usar a opção -pfonte
se você está executando docker em docker-machine?
execute para obter o ip:
retorna o ip da máquina e tenta conectar o mysql:
fonte
Eu faço isso executando um contêiner docker temporário em meu servidor para que não precise me preocupar com o que está instalado em meu host. Primeiro, eu defino o que preciso (o que você deve modificar para seus propósitos):
Sempre crio uma nova rede docker da qual todos os outros contêineres precisarão:
Inicie um servidor de banco de dados mySQL:
Capture o endereço IP do novo container do servidor
Abra uma interface de linha de comando para o servidor:
Este último contêiner será removido quando você sair da interface mySQL, enquanto o servidor continuará em execução. Você também pode compartilhar um volume entre o servidor e o host para facilitar a importação de dados ou scripts. Espero que isto ajude!
fonte
Lembre-se de alterar o usuário, porta e host para que correspondam às suas configurações. O sinalizador -p é necessário se o usuário do seu banco de dados estiver configurado com uma senha
fonte
Para conversão, você pode criar o
~/.my.cnf
arquivo no host:Então, da próxima vez, basta executar o
mysql
cliente mysql para abrir a conexão.fonte
Consegui conectar meu sql server5.7 rodando em meu host usando o comando abaixo: mysql -h 10.10.1.7 -P 3307 --protocol = tcp -u root -p onde o ip fornecido é meu ip host e 3307 é o porta forwaded no mysql docker. Depois de inserir o comando digite a senha para myql. é isso. Agora você está conectado ao contêiner do mysql docker da sua máquina host
fonte
execute o seguinte comando para executar o contêiner
execute este comando para obter mysql db na máquina host
no seu caso é
fonte
--protocol=tcp
sinalizador conforme descrito em vários outros comentários / respostas. No meu caso, foi ainda mais confuso porque eu tinha uma instância local, não dockerizada, do mysql rodando também. Por padrão, mesmo quando a porta é especificada, mesmo se a porta estiver incorreta, o comando 'mysql' se conectará por meio do arquivo de soquete à instância local.mysql -u root -P <EXPOSED_DOCKER_PORT_HERE> -h <YOUR_HOST_IP_ADDRESS_HERE> --protocol=tcp -p
. O sinalizador--protocol=tcp
é a chave para fazer este trabalho.Em seu terminal, execute:
docker exec -it container_name /bin/bash
Então:mysql
fonte
ESTÁ BEM. Eu finalmente resolvi esse problema. Aqui segue minha solução usada em https://sqlflow.org/sqlflow .
A Solução Completa
Para tornar a demonstração independente, movi todo o código necessário para https://github.com/wangkuiyi/mysql-server-in-docker .
A chave para a solução
Não uso a imagem oficial no DockerHub.com https://hub.docker.com/r/mysql/mysql-server . Em vez disso, criei meu próprio instalando o MySQL no Ubuntu 18.04. Essa abordagem me dá a chance de iniciar o mysqld e vinculá-lo a 0.0.0.0 (todos os IPs) .
Para obter detalhes, consulte essas linhas em meu repositório GitHub.
Para verificar minha solução
apt-get
.Conecte-se de outro contêiner no mesmo host
Podemos executar o cliente MySQL até mesmo de outro contêiner (no mesmo host).
Conecte-se de outro host
No meu iMac, instalo o cliente MySQL usando o Homebrew.
Então, posso acessar o host Ubuntu acima (192.168.1.22).
Conectar de um contêiner em execução em outro host
Posso até executar o cliente MySQL em um contêiner em execução no iMac para me conectar ao servidor MySQL em um contêiner na minha estação de trabalho Ubuntu.
Um Caso Especial
No caso de executarmos o cliente e o servidor MySQL em contêineres separados em execução no mesmo host - isso pode acontecer quando estamos configurando um CI, não precisamos construir nossa própria imagem Docker do servidor MySQL. Em vez disso, podemos usar o
--net=container:mysql_server_container_name
quando executamos o contêiner do cliente.Para iniciar o servidor
Para iniciar o cliente
fonte
docker run -e MYSQL_ROOT_PASSWORD = pass --name sql-db -p 3306: 3306 mysql
docker exec -it sql-db bash
mysql -u root -p
fonte
ERROR 1524 (HY000): Plugin 'unix_socket' is not loaded
mude "localhost" para seu endereço de con ip real
porque é para mysql_connect ()
fonte