(Prawdopodobnie jest to głupie pytanie ze względu na moją ograniczoną wiedzę z administracją Docker lub mysql, ale ponieważ spędziłem cały wieczór nad tym problemem, odważę się je zadać.)
W skrócie
Chcę uruchomić mysql w kontenerze docker i połączyć się z nim z mojego hosta. Jak dotąd najlepsze, co osiągnąłem, to:
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
Więcej szczegółów
Używam następujących 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
W katalogu, w którym znajduje się ten plik, mogę pomyślnie zbudować obraz i uruchomić go za pomocą:
> docker build -t my-image .
> docker run -d -p 12345:3306 my-image
Kiedy dołączam do obrazu, wydaje się, że działa dobrze:
# 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.
[...]
Jednak nie mam takiego sukcesu od gospodarza:
> mysql -P 12345 -uroot
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
Jeszcze więcej szczegółów
- Widziałem, że jest pytanie, które wygląda jak moje . Jednak to nie jest to samo (i tak nie ma żadnych odpowiedzi)
- Widziałem, że są obrazy poświęcone mysql , ale nie odniosłem z nimi większego sukcesu
- Mogę
grep -v
czuć się dziwnie. Trzeba przyznać, że można to zrobić czystszym sposobem. Ale kiedy dołączam mój obraz, widzę, że faktycznie działał zgodnie z oczekiwaniami (tj: usunąłbind-address
). I widzę w kontenerze/var/log/mysql/error.log
:
Nazwa hosta serwera (adres-wiązania): „0.0.0.0”; port: 3306 - „0.0.0.0” jest zastępowane jako „0.0.0.0”; Gniazdo serwera utworzone na IP: „0.0.0.0”.
mysql
docker
dockerfile
gturri
źródło
źródło
Odpowiedzi:
Jeśli twój host Docker MySQL działa poprawnie, możesz połączyć się z nim z lokalnego komputera, ale powinieneś określić hosta, port i protokół w następujący sposób:
Zmień 3306 na numer portu, który przekazałeś z kontenera Docker (w twoim przypadku będzie to 12345).
Ponieważ używasz MySQL w kontenerze Docker, gniazdo nie jest dostępne i musisz połączyć się przez TCP. Ustawienie „--protocol” w poleceniu mysql to zmieni.
źródło
--socket=/var/run/mysqld/mysqld.sock
2. Zamontować ten plik poza kontenerem Docker 3. Określić ścieżkę do gniazda w kliencie MySQL za pomocą--socket=/host/mysql.sock
--protocol=tcp
końcu udało mi się połączyć. Dzięki @maniekq zarówno za miłą odpowiedź, jak i wyjaśnienie dotyczące gniazd w komentarzu!Jeśli użyjesz „127.0.0.1” zamiast localhost, mysql użyje metody tcp i powinieneś być w stanie połączyć kontener z:
źródło
Polecam sprawdzić docker-compose. Oto jak to by działało:
Utwórz plik o nazwie docker-compose.yml, który wygląda następująco:
Następnie uruchom:
Uwagi:
Teraz możesz w ten sposób uzyskać dostęp do konsoli mysql:
Uwagi:
Możesz przekazać flagę -d, aby uruchomić kontener mysql / mariadb w trybie odłączonym / w tle.
Hasło to „wp”, które jest zdefiniowane w pliku docker-compose.yml.
Ta sama rada co maniekq, ale pełny przykład z docker-compose.
źródło
--protocol=tcp
naprawiłem wszystko dla mnie. Dziękuję Ci!Prostą metodą jest udostępnienie gniazda mysql unix maszynie hosta. Następnie podłącz przez gniazdo
Kroki:
mkdir /host
docker run -it -v /host:/shared <mysql image>
./etc/my.cnf
i zmień wpis gniazda w pliku nasocket=/shared/mysql.sock
service mysql restart
w dockerzemysql -u root --socket=/host/mysql.sock
. W przypadku hasła użyj opcji -pźródło
jeśli uruchamiasz docker w docker-machine?
wykonaj, aby uzyskać adres IP:
zwraca adres IP maszyny i spróbuj połączyć się z mysql:
źródło
Robię to, uruchamiając tymczasowy kontener Dockera na moim serwerze, więc nie muszę się martwić, co jest zainstalowane na moim hoście. Najpierw określam, czego potrzebuję (co powinieneś zmodyfikować do swoich celów):
Zawsze tworzę nową sieć dockerową, której będą potrzebne inne kontenery:
Uruchom serwer bazy danych mySQL:
Przechwyć adres IP nowego kontenera serwera
Otwórz interfejs wiersza poleceń do serwera:
Ten ostatni kontener usunie się sam po wyjściu z interfejsu mySQL, podczas gdy serwer będzie nadal działał. Wolumen można również udostępniać między serwerem a hostem, aby ułatwić importowanie danych lub skryptów. Mam nadzieję że to pomoże!
źródło
Pamiętaj, aby zmienić użytkownika, port i hosta, aby pasowały do twoich konfiguracji. Opcja -p jest wymagana, jeśli użytkownik bazy danych jest skonfigurowany przy użyciu hasła
źródło
Do konwersji , możesz utworzyć
~/.my.cnf
plik na hoście:Następnie następnym razem po prostu uruchom
mysql
klienta mysql, aby otworzyć połączenie.źródło
Udało mi się połączyć mój serwer sql5.7 działający na moim hoście za pomocą poniższego polecenia: mysql -h 10.10.1.7 -P 3307 --protocol = tcp -u root -p, gdzie podane IP to mój adres IP hosta, a 3307 to port forwaded w mysql docker. Po wpisaniu polecenia wpisz hasło do myql. to jest to. teraz jesteś połączony z kontenerem dokera mysql z twojego hosta
źródło
uruchom następujące polecenie, aby uruchomić kontener
uruchom to polecenie, aby uzyskać bazę danych mysql na komputerze-hoście
w twoim przypadku tak jest
źródło
--protocol=tcp
flagę, jak opisano w kilku innych komentarzach / odpowiedziach. W moim przypadku było to wyjątkowo zagmatwane, ponieważ miałem również uruchomioną lokalną, niedokeryzowaną instancję mysql. Domyślnie, nawet jeśli port jest określony, nawet jeśli port jest nieprawidłowy, polecenie „mysql” połączy się przez plik gniazda z lokalną instancją.mysql -u root -P <EXPOSED_DOCKER_PORT_HERE> -h <YOUR_HOST_IP_ADDRESS_HERE> --protocol=tcp -p
. Flaga--protocol=tcp
jest kluczem do tego, aby to zadziałało.W swoim terminalu uruchom:
docker exec -it container_name /bin/bash
Następnie:mysql
źródło
DOBRZE. W końcu rozwiązałem ten problem. Oto moje rozwiązanie użyte w https://sqlflow.org/sqlflow .
Kompletne rozwiązanie
Aby demo było samodzielne, przeniosłem cały niezbędny kod na https://github.com/wangkuiyi/mysql-server-in-docker .
Klucz do rozwiązania
Nie używam oficjalnego obrazu na DockerHub.com https://hub.docker.com/r/mysql/mysql-server . Zamiast tego stworzyłem własne, instalując MySQL na Ubuntu 18.04. Takie podejście daje mi szansę na uruchomienie mysqld i powiązanie go z 0.0.0.0 (wszystkie adresy IP) .
Aby uzyskać szczegółowe informacje, zapoznaj się z tymi wierszami w moim repozytorium GitHub.
Aby zweryfikować moje rozwiązanie
apt-get
.Połącz się z innego kontenera na tym samym hoście
Klienta MySQL możemy uruchomić nawet z innego kontenera (na tym samym hoście).
Połącz z innego hosta
Na moim iMacu instaluję klienta MySQL za pomocą Homebrew.
Następnie mogę uzyskać dostęp do powyższego hosta Ubuntu (192.168.1.22).
Połącz się z kontenera działającego na innym hoście
Mogę nawet uruchomić klienta MySQL w kontenerze działającym na iMacu, aby połączyć się z serwerem MySQL w kontenerze na mojej stacji roboczej Ubuntu.
Specjalny przypadek
W przypadku, gdy uruchamiamy klienta i serwer MySQL w oddzielnych kontenerach działających na tym samym hoście - może się to zdarzyć, gdy konfigurujemy CI, nie musimy budować własnego obrazu Docker serwera MySQL. Zamiast tego możemy użyć
--net=container:mysql_server_container_name
gdy uruchamiamy kontener klienta.Aby uruchomić serwer
Aby uruchomić klienta
źródło
docker run -e MYSQL_ROOT_PASSWORD = pass --name sql-db -p 3306: 3306 mysql
docker exec -it sql-db bash
mysql -u root -p
źródło
ERROR 1524 (HY000): Plugin 'unix_socket' is not loaded
zmień "localhost" na swój prawdziwy adres ip,
ponieważ jest to mysql_connect ()
źródło