web-dev-qa-db-de.com

Herstellen einer Verbindung zum Docker-MySQL-Container auf einem Remote-Computer

Ich habe zwei Maschinen. Mein Rechner mit IP1(Europe) und anderer Rechner mit öffentlichem IP2(USA). Auf IP2 läuft der Mysql-Container mit dem Volume /var/lib/mysql, das in einem Ordner auf dem Host-Computer ~/mysqldatabase repliziert werden soll. Firewall-Regel für Port 3306 wird hinzugefügt. Ich habe auch eine SSH-Verbindung zur Maschine. Ich bin mir nicht sicher, wo ich anfangen soll. Wenn es kein Docker gibt, füge ich es normalerweise hinzu 

bind-address = 0.0.0.0

als Konfiguration in Mysql öffne ich den Firewall-Port 3306 (oder einen anderen, der auf Mysql verweist) und die Dinge funktionieren .. So kann ich wahrscheinlich das Mysql-Server-Paket (der Host ist ubuntu16.04) außerhalb von Docker installiert die IP2-Maschine und um sie auf den ~/mysqldatabase-Ordner zu setzen, aber ist das wirklich notwendig? Gibt es eine Möglichkeit, eine direkte Verbindung von IP1 zu IP2:mysql_container:mysql_database herzustellen

Ich verwende den mysql docker-Container auf zwei Arten. Eine ist mit Docker-Datei. Und der andere ist mit dem systemctl-Dienst.

Teil der docker-compose.yml:

version: "3"
services:
  mysql:
    image: mysql:5.7
    volumes:
      - /home/username/mysqldatabase:/var/lib/mysql
    ports:
      - '3306:3306'
    environment:
        MYSQL_ROOT_PASSWORD: rootpass
        MYSQL_DATABASE: somedb
        MYSQL_USER: someuser
        MYSQL_PASSWORD: someuserpassword

mysql.service 

[Unit]
Description=Run %p
Requires=docker.service
After=docker.service

[Service]
Restart=always
ExecStartPre=-/usr/bin/docker kill %p
ExecStartPre=-/usr/bin/docker rm -f %p
docker run --rm --name mysql -v /home/username/mysqldatabase:/var/lib/mysql -p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=rootpass -e MYSQL_DATABASE=somedb -e MYSQL_USER=someuser -e MYSQL_PASSWORD=someuserpassword \
mysql:5.7
ExecStop=/usr/bin/docker stop %p

[Install]
WantedBy=multi-user.target

Um die Dinge einfacher zu machen, sage ich, dass ich nur den zweiten Ansatz verwende.

Ich habe nicht "T haben:

  • 1.mysql-client, mysql-server oder mysql auf dem IP2-Rechner
  • 2.und ich habe nirgendwo festgelegt, an 0.0.0.0 zu binden, weil ich direkt an den Mysql-Container anschließen möchte. Wahrscheinlich muss ich es einstellen, um in diesem Container auf 0.0.0.0 zu binden.

Ergebnis für die Firewall 

Sudo netstat -tunlp | grep 3306
tcp6       0      0 :::3306                 :::*                    LISTEN      24717/docker-proxy
10
makkasi

Ich denke, Ihr MySQL-Container hört auf IPv6 (sehen Sie Ihr Netstat-Ergebnis). Ursache kann Ihre Docker-Konfiguration sein. Ich weiß nicht, wie ich das Problem beheben kann. Ich persönlich schalte einfach ipv6 auf meinen Docker-Hosts aus, um dieses Problem zu vermeiden.

Ich hoffe es hilft.

2
Webvoid

Sie geben nicht an, wie Sie Ihren Mysql-Container ausführen ...

Sie müssen angeben, welcher Port "veröffentlicht" werden soll, d. H. Welcher Port von "außerhalb" zum "Inneren" Ihres mysql-Containers gehen soll.

Um dies zu erreichen, geben Sie entweder eine -p-Option an, wenn Sie docker run tun, oder fügen Sie sie Ihrem docker-compose.yml hinzu.

docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -p 3306:3306 -d mysql:tag

oder docker-compose.yml

version: '3.1'

services:
  db:
    image: mysql
    restart: always
    ports:
      - 3306:3306
    environment:
      MYSQL_ROOT_PASSWORD: example

Lesen Sie mehr über Veröffentlichungsports hier .

1
Alex Karshin