Möglichkeiten zur Behebung des Problems 2003 (HY000): Verbindung zum MySQL-Server „db_mysql:3306“ nicht möglich (111)
<p>Ich habe kürzlich versucht, meinen FastAPI-Python-Server zu containerisieren (auch für Replikations-/Verdopplungszwecke). Vorher hatte ich nur einen MySQL-Server in einem Docker-Container und alles war in Ordnung, aber als ich meinen Webserver auch zu einem Dienst machte, konnte er keine Verbindung zum MySQL-Server herstellen, sodass die Anwendung jetzt nicht funktioniert.</p>
<p>Das Folgende ist ein Codeausschnitt für den Server-Datenbank-Initialisierungs-Connector in der Anwendung</p>
<pre class="lang-py Prettyprint-override"><code>aus Fastapi Import FastAPI
mysql.connector importieren
app = FastAPI()
dbconfig = {
"host": "localhost",
"Datenbank": "server_db",
"Benutzer": "db_user",
"Passwort": "Benutzerpasswort"
}
# Datenbankverbindung prüfen
versuchen:
init_cnx = mysql.connector.connect(
host='localhost',
user='db_user',
passwort='Benutzerpasswort'
)
Cursor = init_cnx.cursor()
Cursor.execute("DATENBANKEN WIE 'server_db' ANZEIGEN")
if Cursor.fetchone() == None:
# Wenn die Datenbank nicht vorhanden ist, erstellen Sie die Datenbank
Cursor.execute("CREATE DATABASE server_db")
Cursor.execute("USE server_db")
Cursor.execute("CREATE TABLE-Nachrichten ("
"message_id INT NOT NULL AUTO_INCREMENT,"
"Absendername VARCHAR(32),"
"message_text VARCHAR(64),"
"erstellt am DATUM"
"user_messages_count INT,"
"PRIMÄRSCHLÜSSEL (message_id));")
print('Datenbank wurde erstellt!')
Cursor.close()
init_cnx.close()
außer mysql.connector.Error als Fehler:
print("Ein Fehler ist in init_cnx aufgetreten:", err)
# Datenbank-I/O-Funktion
async defexecute_db_query(query,cursor_buffered=False):
cnx = mysql.connector.connect(**dbconfig)
versuchen:
Cursor = cnx.cursor(buffered=cursor_buffered)
Cursor.execute("USE server_db")
Cursor.execute(Abfrage)
Ergebnis = Cursor.fetchall()
cnx.commit()
print("Abfrage erfolgreich ausgeführt!")
Ergebnis zurückgeben
außer Ausnahme als e:
print("Fehler beim Ausführen der Abfrage:", e)
Endlich:
wenn cnx:
cnx.close()
# Rufen Sie die Stammverzeichnisfunktion ab, mit der nur überprüft wird, ob die Anwendung mit der Datenbank verbunden ist
@app.get("/")
async def get_root():
versuchen:
entries_count =waiteexecute_db_query("SELECT COUNT(*) FROM Messages", Cursor_buffered=True)
return {"Nachrichteneinträge": Einträge_count[0][0]}
außer Ausnahme als e:
return {"Fehler": e}
</code></pre>
<p>Docker-Datei des Servers</p>
<pre class="brush:php;toolbar:false;">FROM python:3.11.4-slim-bookworm
WORKDIR/app
KOPIEREN Sie „requirements.txt“.
FÜHREN Sie pip install --no-cache-dir -r require.txt aus
KOPIEREN Sie server.py .
8000 belichten
CMD ["uvicorn", "server:app", "--host", "0.0.0.0", "--port", "8000"]</pre>
<p>init.sql-Skript</p>
<pre class="lang-sql Prettyprint-override"><code>CREATE USER 'db_user'@'%' IDENTIFIED BY 'user-password';
GEWÄHREN SIE ALLE PRIVILEGIEN FÜR *.* TO 'db_user'@'%' WITH GRANT OPTION;
FLUSH-PRIVILEGIEN;
</code></pre>
<p>und docker-compose.yml</p>
<pre class="lang-yaml Prettyprint-override"><code>version: "3.8"
Dienstleistungen:
db_mysql:
Bild: mysql:8
Neustart: immer
Umfeld:
MYSQL_ROOT_PASSWORD: "root"
Bände:
- "./mysql/init.sql:/docker-entrypoint-initdb.d/init.sql"
- "./mysql/db_mysql_data:/var/lib/mysql"
- "./mysql/mysql_logs:/var/log/mysql"
Netzwerke:
-dummy_network
Server 1:
Bild: dummy_msg_server
Häfen:
- „8081:8000“
Netzwerke:
- dummy_network
#Befehl: sh -c "sleep 60s"
kommt drauf an:
-db_mysql
server_2:
Bild: dummy_msg_server
Häfen:
- „8082:8000“
Netzwerke:
- dummy_network
#Befehl: sh -c "sleep 60s"
kommt drauf an:
-db_mysql
Bände:
db_mysql_data: #external: true
Netzwerke:
dummy_network:
Fahrer: Brücke
</code></pre>
<p>Obwohl der Versuch, die API zu verwenden, bevor der MySQL-Container vollständig initialisiert wurde, zu einem Fehler führen kann, stellt dies kein Problem dar, da ich warte, bis der MySQL-Server anzeigt, dass er bereit ist, die Anfrage zu verarbeiten. Ansonsten versuche ich nicht, eine Verbindung zum MySQL-Server herzustellen. </p>
<p>Ich habe versucht, eine Verbindung über den Hostnamen/die IP-Adresse herzustellen.
Versuchen Sie, das python:3.11.4-Image in der Docker-Datei auf eine frühere Debian-Version zu ändern und nicht das Slim-Image zu verwenden.Versuchen Sie, explizit ein öffentliches Netzwerk für den Container zu verwenden. Docker zeigt ständig an, dass sich der Container in einem Netzwerk befindet, und die Curl-Anfrage vom Server-Container gibt etwas zurück.
Darüber hinaus stellte docker-compose.yml zuvor Port 3306:3306 für den db_mysql-Dienst bereit. Ich schätze, das ist auch kein Problem. </p>
<p><strong>Update 1. </strong>Während der Untersuchung wurde festgestellt, dass die Anwendung keine Probleme damit hat, Anfragen an sie zu senden und die richtige Antwort zu erhalten, wenn die Datenbank bereits erstellt wurde. Das einzige Problem dabei ist, dass die Datenbank nicht mit dem Erstellungsskript im Code erstellt werden kann. </p><p>
(Ich schätze, ich sollte den Codeblock aktualisieren, da sich das Projekt jetzt in einer anderen Phase befindet.)</p>