我正在尝试从我的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"
希望这有助于找到解决方案!
答案 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并查看