Ich verwende MySQL-Server in Docker-Container und kann innerhalb von Docker zugreifen. So erstellen Sie eine Verbindung in MySQL-Workbench, die auf meinem lokalen Computer (Host-Computer) ausgeführt wird.
Sie müssen nur wenige Einstellungen in Ihrem Docker-Container vornehmen. Bitte folgen Sie den folgenden Schritten.
Geben Sie den MySQL-Konfigurationsblock in Ihrer docker-compose.yml an. Ich habe den folgenden mysql-Block unter services in meiner Datei docker-compose.yml.
services:
db:
image: mysql
volumes:
- "./.data/db:/var/lib/mysql"
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: mydb
MYSQL_USER: user
MYSQL_PASSWORD: pass
ports:
42333:3306
Starten Sie den Docker-Container neu und führen Sie die folgenden Befehle aus, um zur bash-Shell im mysql-Container zu gelangen
docker ps
docker exec -it <mysql container name> /bin/bash
Um innerhalb des Containers eine Verbindung zum mysql-Befehlszeilentyp herzustellen,
mysql -u root -p
Verwenden Sie MYSQL_ROOT_PASSWORD wie in der Docker-Compose.yml angegeben. Führen Sie die folgenden Befehle aus, um einen neuen Benutzer zu erstellen.
create user 'user'@'%' identified by 'pass';
grant all privileges on *.* to 'user'@'%' with grant option;
flush privileges;
Das Prozentzeichen (%) bedeutet alle IP's. Starten Sie den Docker-Container neu.
Geben Sie in Ihrer MySQL Workbench die Verbindungsdetails an. Verwenden Sie MYSQL_PASSWORD wie in Ihrer docker-compose.yml-Datei angegeben.
Sie sollten jetzt in der Lage sein, eine Verbindung zu Ihrem mysql-Container herzustellen.
2 Bedingungen für den Hafenbetrieb:
zunächst muss Ihr Docker-Lauf den Mysql-Port einem Host-Port zuordnen:
docker run -p Host:container
(zum Beispiel: docker run -d -p 3306:3306 tutum/mysql
)
zweitens: Wenn Sie Docker in einem VM (Docker-Computer mit boot2docker) verwenden, müssen Sie die IP-Adresse von docker-machine ip <VMname>
mit dem vom Host zugewiesenen Port verwenden.
http://$(docker-machine ip <VMname>):hostPort
Wenn Sie localhost
verwenden müssen, müssen Sie einige Portweiterleitungen auf der Ebene der VirtualBox durchführen :
VBoxManage controlvm "boot2docker-vm" natpf1 "tcp-port3306,tcp,,3306,,3306"
VBoxManage controlvm "boot2docker-vm" natpf1 "udp-port3306,udp,,3306,,$3306"
(controlvm
Wenn der VM ausgeführt wird, ist modifyvm
der VM ist gestoppt.) (Ersetzen Sie "boot2docker-vm
" durch den Namen Ihrer virtuellen Maschine: siehe docker-machine ls
)
2 MySQL-bezogene Bedingungen:
Wie in nkratzke/EasyMySQL/Dockerfile
dargestellt, müssen Sie den Fernzugriff aktivieren:
# Enable remote access (default is localhost only, we change this
# otherwise our database would not be reachable from outside the container)
RUN sed -i -e"s/^bind-address\s*=\s*127.0.0.1/bind-address = 0.0.0.0/" /etc/mysql/my.cnf
Sie müssen Benutzer erstellen, wenn Sie Ihre Datenbank in Ihrem Docker-Image starten.
Siehe zum Beispiel nkratzke/EasyMySQL/start-database.sh
, das vom Dockerfile CMD
aufgerufen wird.
/usr/sbin/mysqld &
sleep 5
echo "Creating user"
echo "CREATE USER '$user' IDENTIFIED BY '$password'" | mysql --default-character-set=utf8
echo "REVOKE ALL PRIVILEGES ON *.* FROM '$user'@'%'; FLUSH PRIVILEGES" | mysql --default-character-set=utf8
echo "GRANT SELECT ON *.* TO '$user'@'%'; FLUSH PRIVILEGES" | mysql --default-character-set=utf8
echo "finished"
Nach der Bereitstellung hat MySQL standardmäßig folgende Verbindungseinschränkungen:
mysql> select Host, user from mysql.user;
+-----------+---------------+
| Host | user |
+-----------+---------------+
| localhost | healthchecker |
| localhost | mysql.session |
| localhost | mysql.sys |
| localhost | root |
+-----------+---------------+
4 rows in set (0.00 sec)
Offensichtlich können Sie aus Sicherheitsgründen keine Verbindung außerhalb des Docker-Images herstellen. Wenn Sie dies ändern müssen, damit root von jedem Host aus eine Verbindung herstellen kann (beispielsweise zu Entwicklungszwecken), führen Sie folgende Schritte aus:
Starten Sie Ihr MySQL-Image mit allen erforderlichen Portzuordnungen:
docker run -p 3306:3306 --name=mysql57 -d mysql/mysql-server:5.7
oder, wenn die vollständige Portzuordnung erforderlich ist:
docker run -p 3306:3306 -p 33060:33060 --name=mysql57 -d mysql/mysql-server:5.7
Wenn dies die Neuinstallation ist, greifen Sie zum Standardkennwort:
docker logs mysql57 2>&1 | grep GENERATED
Verbinden Sie sich mit mysql
client direkt mit der mysqld im Docker:
docker exec -it mysql57 mysql -uroot -p
Bei dieser Neuinstallation werden Sie aufgefordert, das Kennwort mit dem Befehl ALTER USER
zu ändern. TU es.
SQL ausführen:
update mysql.user set Host = '%' where user='root';
Beenden Sie den mysql
-Client.
Starten Sie den Container neu:
docker restart mysql57
Jetzt können Sie von MySQL Workbench aus eine Verbindung herstellen
Host: `0.0.0.0`
port: `3306`
Nach allen Änderungen zeigt die Abfrage:
select Host, user from mysql.user;
+-----------+---------------+
| Host | user |
+-----------+---------------+
| % | root |
| localhost | healthchecker |
| localhost | mysql.session |
| localhost | mysql.sys |
+-----------+---------------+
Angenommen, Sie haben den nächsten Inhalt Ihrer docker-compose
-Datei:
database:
image: mysql:5.6
volumes:
- dbdata:/var/lib/mysql
environment:
- "MYSQL_DATABASE=Homestead"
- "MYSQL_USER=Homestead"
- "MYSQL_PASSWORD=secret"
- "MYSQL_ROOT_PASSWORD=secret"
ports:
- "33061:3306"
Für localhost verwenden Sie einfach Host 127.0.0.1 und 33061 port
@ Krishnas Antwort hat funktioniert, aber mit einer kleinen Änderung - Benutzer wurde wie folgt hinzugefügt
create user 'user'@'%' IDENTIFIED WITH mysql_native_password BY 'pass';
siehe Authentifizierungs-Plugin 'caching_sha2_password' kann nicht geladen werden
Ich habe eine Lösung dafür gefunden, indem ich den Feldwert inHostname: 127.0.0.1 (Localhost), Port standardmäßig 3306 mit Ihren Creds eingestellt habe.
Geben Sie Ihre Konfiguration docker-compose.yml
an. Weitere Details hier . Beispiel:
version: '3.1'
services:
mysql:
image: mysql:5.6
container_name: test-mysql
ports:
- 3306:3306
restart: always
environment:
MYSQL_ROOT_PASSWORD: password
docker-compose up
und ein anderes Terminal docker ps
aus, um Ihren Container anzuzeigen.docker exec -it test-mysql bash
mysql -u root -p
aus, um eine Verbindung zum Befehlszeilentyp mysql herzustellen.Ich folgte den Anweisungen in mysql docker hub . Schrieb diese docker-compose.yml
version: '3.1'
services:
db:
image: mysql
command: --default-authentication-plugin=mysql_native_password
environment:
MYSQL_ROOT_PASSWORD: example
ports:
- 3306:3306
Wechseln Sie zur MySQL-Workbench, wenn Sie eine Verbindung herstellen. jetzt Passwort eingeben (in meinem Fall example
)
Sie müssen die Host-/Gast-IP auf 0.0.0.0
Und den Host-/Gast-Port auf 3306
Unter "Einstellungen-> Netzwerk-> Portweiterleitung" konfigurieren.