Zugriff auf docker-container mysql-Datenbanken

Ich versuche, Zugriff auf mysql-Datenbanken aus meiner docker-host, an den container.

Es ist mein eigenes dockerfile, das installieren einer Datenbank setzen auf port 3306.
Ich starte meine Andockfenster mit dem Andockfenster-Komponieren, und meine compose-Datei mapping-3308-host-port auf 3306 container-Hafen.

Kann ich den Zugriff auf mysql von host wie diese :
mysql -h localhost -P 3308 -u root -pMyPassword

Es gut funktioniert, was ich aber nicht herausfinden können, warum kann ich nicht sehen, alle Daten von meinem container?

Ab in den container, ich habe ein test-Datenbanken, die ich verbinden kann, ohne jedes problem. Aber wenn ich eine Verbindung vom host in den container mysql-Prozess, Es scheint zu zeigen, mir die mysql Daten von der host-Maschine benutzt, nicht aus dem container.

Irgendwelche Ideen?

Dank 🙂

EDIT 1 :

So, hier ist die erste Möglichkeit, kann ich die mysql-Verbindung in den container :

docker exec -it MyContainer mysql -uroot -pMyPassword
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test_db            |
+--------------------+

Es mir meine db : test_db
Aber Wenn ich access von :

mysql -h localhost -P 3308 -u root -pMyPassword
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
+--------------------+

Meine test_db ist nicht hier.

Und das Ergebnis docker ps

CONTAINER ID        IMAGE                 COMMAND                  CREATED                 STATUS              PORTS                                                                                                    NAMES
a0de6a691d72        MyContainer           "docker-entrypoint.sh"   3 hours ago             Up 3 hours          9000/tcp, 0.0.0.0:8085->80/tcp, 0.0.0.0:3308->3306/tcp, 0.0.0.0:8084->8000/tcp, 0.0.0.0:8086->8080/tcp   MyContainer

EDIT 2 :
Ich bin die Entwicklung einer standard-docker-container für web-hosting Produktion environnement. Jeder host wird gesteuert durch ajenti. Die Gastgeber arbeiten mit einem nginx reverse proxy, das verteilen von websites, die auf die richtige container. Jedes Ding ist wokring gut. So, hier ist meine Dockerfile :

FROM php:5.6-fpm

RUN apt-get update && apt-get install -y --no-install-recommends \
    git \
    libxml2-dev \
    python \
    build-essential \
    make \ 
    gcc \
    python-dev \
    locales \
    python-pip

RUN dpkg-reconfigure locales && \
    locale-gen C.UTF-8 && \
    /usr/sbin/update-locale LANG=C.UTF-8

ENV LC_ALL C.UTF-8

ARG MYSQL_ROOT_PASSWORD

RUN export DEBIAN_FRONTEND=noninteractive; \
    echo mysql-server mysql-server/root_password password $MYSQL_ROOT_PASSWORD | debconf-set-selections; \
    echo mysql-server mysql-server/root_password_again password $MYSQL_ROOT_PASSWORD | debconf-set-selections;

RUN apt-get update && apt-get install -y -q mysql-server php5-mysql

RUN rm /etc/apt/apt.conf.d/docker-gzip-indexes

RUN apt-get update && apt-get install -y wget

RUN wget http://repo.ajenti.org/debian/key -O- | apt-key add -
RUN echo "deb http://repo.ajenti.org/debian main main debian" > /etc/apt/sources.list.d/ajenti.list
RUN apt-get update && apt-get install -y ajenti cron unzip ajenti-v ajenti-v-php-fpm ajenti-v-mysql ajenti-v-nginx

RUN apt-get install -y python-setuptools python-dev \
    && easy_install -U gevent==1.1b3 \
    && sed -i -e s/ssl_version=PROTOCOL_SSLv3/ssl_version=PROTOCOL_SSLv23/ /usr/local/lib/python2.7/dist-packages/gevent-1.1b3-py2.7-linux-x86_64.egg/gevent/ssl.py

EXPOSE 80 8000 8080 3306 

RUN mkdir /tmp/tempfiles \
    && mv /srv /tmp/tempfiles \
    && mv /var/lib/mysql /tmp/tempfiles \
    && mv /var/log /tmp/tempfiles \
    && mv /etc/ajenti /tmp/tempfiles

COPY docker-entrypoint.sh /usr/local/bin/
RUN ln -s /usr/local/bin/docker-entrypoint.sh /entrypoint.sh # backwards compat

ENTRYPOINT ["docker-entrypoint.sh"]

Als ich sagte, ich wollte in der Lage sein zu tun bereitstellen eines neuen Behälters leicht. So habe ich eine docker-entrypoint.sh die Kopie wollte die Dateien auf meine Lautstärke, wenn ich starten Sie das container :

#!/bin/bash
DIR="/var/lib/mysql"
# look for empty dir 
if [ ! "$(ls -A $DIR)" ]; then
    cp -avr /tmp/tempfiles/mysql /var/lib/
fi
# rest of the logic

DIR="/srv"
# look for empty dir 
if [ ! "$(ls -A $DIR)" ]; then
    cp -avr /tmp/tempfiles/srv /
fi
# rest of the logic

DIR="/var/log"
# look for empty dir 
if [ ! "$(ls -A $DIR)" ]; then
    cp -avr /tmp/tempfiles/log /var/
fi
# rest of the logic

DIR="/etc/ajenti"
# look for empty dir 
if [ ! "$(ls -A $DIR)" ]; then
    cp -avr /tmp/tempfiles/ajenti /etc/
fi
# rest of the logic

Schließlich, meine docker-Komponieren.yml zu starten alles, und Karte-Anschlüsse :

version: '2'

services:
    ajenti:
        build: 
            context: ./dockerfiles/                                        
            args:                                                                      
                MYSQL_ROOT_PASSWORD: MyPassword
        volumes:
            - ./logs:/var/log
            - ./html:/srv
            - ./ajenti:/etc/ajenti
            - ./mysql-data:/var/lib/mysql
            - ./apache2:/etc/apache2
        ports:
            - "8084:8000"
            #NGINX
            - "8085:80"
            #APACHE
            - "8086:8080"
            - "3308:3306"

Hoffe, dies wird helfen, eine Lösung zu finden !

Könnte helfen, genau zu wissen, wie ist Ihre Dockerfile und die docker run-Befehle, die Sie verwenden.
Auch die docker-Komponieren.yml wäre hilfreich.
Ich bearbeitet meine Frage mit den Infos, ich hoffe, das kann helfen !

InformationsquelleAutor Mayous | 2017-03-04

Schreibe einen Kommentar