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 !
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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Habe ich endlich eine Lösung gefunden und es war ziemlich einfach...
Zunächst, ich möchte, mysql binden externe Adresse, also änderte ich die Zeile bind-Adresse '0.0.0.0' im inneren des Behälters.
Weiter habe ich gerade geändert die Befehlszeile mit
mysql -h 127.0.0.1 -P 3308 -u root -pMyPassword
Nun, es ist in Ordnung, ich kann Zugriff auf container von mysql-Daten aus dem host.
Danke an alle für Eure Hilfe 🙂
InformationsquelleAutor Mayous
wenn Sie ausführen, MySQL operation als entrypoint im dockerfile-Datei, werden Sie nur sehen, dass die operation, wenn Sie eine Verbindung zum container. versuchen Sie, die entrypoint.
https://docs.docker.com/engine/reference/builder/#entrypoint
Kannst du die Inhalte, die Sie
docker-entrypoint.sh
- Datei? dass Befehle nicht mehr ausgeführt werden können auf Gebäude statt?InformationsquelleAutor Ahmet Şimşek