Nelze získat přístup k MySQL z jiné nádoby?

0

Otázka

Přečetl jsem si toto vlákno a mnoho další návody, ale stále se nemůžete dostat připojení k práci.

Vytvořil jsem dva kontejnery a jsou na stejné síti net_aa MySQL kontejner byl vytvořen pomocí tohoto příkazu:

docker run -itd --name mysql_a -p 3319:3306 -e MYSQL_ROOT_PASSWORD=passwd --network net_a mysql:latest 

V jiné nádobě chci pro přístup k databázi MySQL db_a pomocí PyMySQL, a snažil jsem se toto:

import pymysql.cursors
connection = pymysql.connect(
    host="mysql_a",
    user="root",
    password="passwd",
    database="db_a",
    port=3319, charset="utf8")
cur = connection.cursor()

Ale chyba araises:

--> 353 samostatně.connect() 354 355 def enter(self):

/usr/local/lib/python3.8/dist-packages/pymysql/connections.py v připojení(self, ponožky) 662-li LADĚNÍ: 663 tisku(exc.traceback) --> 664 zvýšit exc 665 666 #, Pokud e je ani DatabaseError nebo IOError, je To chyba.

OperationalError: (2003, "nelze se připojit k MySQL serveru 'mysql_a' ([Errno 111] Connection refused)")

Myslel jsem, že to bylo proto, že nejsou na stejné síti, pak jsem ping kontejner jméno mysql_a z jiné nádoby, a to ukazuje toto:

PING mysql_a (172.18.0.3) 56(84) bytes of data.
64 bytes from mysql_a.net_a (172.18.0.3): icmp_seq=1 ttl=64 time=0.078 ms
64 bytes from mysql_a.net_a (172.18.0.3): icmp_seq=2 ttl=64 time=0.068 ms
64 bytes from mysql_a.net_a (172.18.0.3): icmp_seq=3 ttl=64 time=0.061 ms
64 bytes from mysql_a.net_a (172.18.0.3): icmp_seq=4 ttl=64 time=0.061 ms

Zajímalo by mě, proč to nefunguje? Možná single-host bridge sítě nefungují v tomto případě, a já by se měli naučit něco o multi-host překrytí sítí?

containers docker mysql pymysql
2021-11-17 15:57:20
1

Nejlepší odpověď

0

Přidat tuto otázku, a odpověď jen pro ty, kteří udělali stejnou chybu jako já. Strávil jsem tři noci přijít. Pokud jste publikoval 3306 služeb mimo Docker mapování 3306 na určitý port N na hostitele rozhraní, neměli byste používat port N, a 3306 by měl být v Pořádku vzhledem k tomu, dva kontejnery jsou ve stejné hostitele a sítě(nastavení-síťové arg).

Hostitel může být nakonfigurován jako kontejner jméno nebo IP adresa. A tady je případ, v Pythonu scénář pomocí PyMySQL:

import pymysql.cursors
connection = pymysql.connect(
    host="mysql_a", # or 172.18.0.3 in this case
    user="root",
    password="passwd",
    database="db_a",
    port=3306, charset="utf8")
cur = connection.cursor()
  

Jako doktor čte:

Aby se port k dispozici služby mimo Docker, nebo Docker kontejnery , které nejsou připojeny do kontejneru sítě, použijte --publikovat nebo -p vlajky. Tím se vytvoří pravidlo brány firewall, které mapy kontejneru přístavu do přístavu na přístavní Dělník hostitele do vnějšího světa.

2021-11-17 16:07:38

V jiných jazycích

Tato stránka je v jiných jazycích

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................