访问docker容器mysql数据库

我想从我的docker主机到容器访问MySQL数据库。

这是我自己的dockerfile,在3306端口安装一个数据库。我用docker-compose启动docker,我的compose文件在3306 container port上映射3308主机端口。

我可以像这样从主机访问mysql: mysql -h localhost -P 3308 -u root -pMyPassword

它运行良好,但是我不明白为什么我不能从我的容器中看到任何数据?

从容器内部,我有一个testing数据库,我可以连接到没有任何问题。 但是当我从主机连接到容器的mysql进程时,它似乎向我显示来自主机的mysql数据,而不是来自容器的数据。

有任何想法吗?

谢谢 :)

编辑1:

所以这里是我可以连接到容器的第一个方法:

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

它显示我我的db:test_db但如果我从:

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

我的test_db不在这里。

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 

编辑2:我正在开发一个用于虚拟主机生产环境的标准docker集装箱。 每个主机由ajenti控制。 主机使用nginx反向代理,将网站重新分配到正确的容器上。 每件事情都很好。 所以这里是我的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 -es/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"] 

正如我所说,我希望能够轻松部署一个新的容器。 所以我创build了一个docker-entrypoint.sh,当我启动容器时,将所需的文件复制到我的卷中:

 #!/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 

最后,我的docker-compose.yml启动一切,并映射端口:

 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" 

希望这将有助于find解决scheme!

如果您在dockerfile文件中作为入口点执行MySQL操作,则只有在连接到容器时才会看到该操作。 尝试改变入口点。

https://docs.docker.com/engine/reference/builder/#entrypoint

我终于find了一个解决scheme,这很简单…

首先,我需要让mysql绑定外部地址,所以我把容器内的行绑定地址改为'0.0.0.0'。 接下来我只是用mysql -h 127.0.0.1 -P 3308 -u root -pMyPassword更改命令行

现在没关系,我可以从主机访问容器mysql数据。

感谢你的帮助 :)