访问docker容器mysql数据库

时间:2017-03-04 15:29:01

标签: mysql docker docker-compose

我正在尝试从我的docker主机访问容器的mysql数据库。

它是我自己的dockerfile,它在端口3306上安装数据库公开。 我使用docker-compose启动我的docker,我的compose文件在3306容器端口上映射3308主机端口。

我可以从主机访问mysql,如下所示: mysql -h localhost -P 3308 -u root -pMyPassword

它运作良好,但我无法弄清楚,为什么我无法从容器中看到任何数据?

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

有什么想法吗?

谢谢:)

编辑1:

所以这是我可以将mysql连接到容器的第一种方式:

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: 我正在为web托管生产环境开发一个标准的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 -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"]

正如我所说,我希望能够轻松部署新容器。所以我创建了一个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"

希望这有助于找到解决方案!

3 个答案:

答案 0 :(得分:2)

我终于找到了一个解决方案而且非常简单......

首先,我需要让mysql绑定外部地址,所以我将容器内的行绑定地址更改为“0.0.0.0”。 接下来我刚用mysql -h 127.0.0.1 -P 3308 -u root -pMyPassword

更改了命令行

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

感谢大家的帮助:)

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

就我而言,我感到困惑是因为docker使用了不同的主机和端口。因此,您需要找到它们,然后执行以下操作:

mysql -P <portnumber> -h <host IP> -u db_name -p

大多数人会将与Docker DB相关的变量放入docker容器的环境中,所以请这样做:

sudo docker exec -it container_name env

查看是否有一个名为DB_HOST或DB_PORT的变量或类似的变量。如果没有,请查看源代码。如果是PHP项目,则找到一个配置目录并查看main.php并查看