Docker撰写mysql连接失败
Posted
技术标签:
【中文标题】Docker撰写mysql连接失败【英文标题】:Docker compose mysql connection failing 【发布时间】:2017-06-25 16:28:54 【问题描述】:我正在尝试使用 docker-compose 运行 2 个 docker 容器并将 mysql 容器连接到应用程序容器。Mysql 容器正在运行,但应用程序容器无法启动并出现错误 Error:2003: Can't connect to MySQL '127.0.0.1:3306' 上的服务器(111 连接被拒绝) 似乎我的应用容器正在尝试连接我的主机 mysql 而不是 mysql 容器。
docker-compose.yml
version: '2'
services:
mysql:
image: mysql:5.7
container_name: database
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: malicious
MYSQL_USER: root
MYSQL_PASSWORD: root
app:
build: .
restart: unless-stopped
volumes:
- .:/Docker_compose_app #app directory
depends_on:
- "mysql"
command: [ "python", "database_update.py"]
restart: unless-restart
environment:
# Environment variables to configure the app on startup.
MYSQL_DATABASE: malicious
MYSQL_HOST: database
Dockerfile
FROM python:2.7
ADD . /Docker_compose_app
WORKDIR /Docker_compose_app
RUN apt-get update
RUN pip install --requirement requirement.txt
这是我的 database_update.py 文件。
def create_TB(cursor,connection):
query = '''CREATE TABLE (malicious VARCHAR(100) NOT NULL)'''.format("url_lookup")
cursor.execute(query)
connection.commit()
def connection():
try:
cnx = mysql.connector.connect(user="root",password = 'root',database=malicious)
cursor = cnx.cursor()
create_TB(cursor,cnx)
except mysql.connector.errors.Error as err:
data = "There is an issue in connection to DB":"Error: ".format(err)
【问题讨论】:
也许mysql需要一些时间来启动?在从您的应用开始连接之前尝试睡眠 10-30 秒 但它无法解决问题,因为即使在 mysql 容器启动后,app 容器仍然会出现相同的错误。我使用了 restrat: unless-restarted with app conatiner 【参考方案1】:您可能需要考虑使用 Docker 网络。
当我有两个单独的 Python 容器连接到一个 mysql-Container 时,我遇到了类似的问题,而这两个容器连接到了一个 Vue-Frontend。
首先我尝试使用链接(这不是最佳的,因为通信流不是完全线性的),就像你一样,但我遇到了这篇很棒的帖子: https://www.cbtnuggets.com/blog/devops/how-to-share-a-mysql-db-with-multiple-docker-containers
使用网络可以关闭端口映射,让您增强整体应用架构。
因此,我认为您应该尝试以下方法:
services:
python-app:
networks:
- network_name
...
mysql:
networks:
- network_name
...
networks:
network_name:
【讨论】:
【参考方案2】:我可以看到两个问题:
尝试添加
links:
- mysql:mysql
到 Docker Compose 文件中的 app
服务。这将确保您可以从app
访问mysql
容器。它将在您的app
容器中设置主机名映射(DNS),因此当您从app
中ping mysql
时,它会将其解析为mysql
容器的IP 地址。
在您的.py
文件中,您在哪里定义要连接到哪个主机?将host="mysql"
添加到connect
呼叫。默认情况下,它将连接到127.0.0.1
,这就是您所看到的。
cnx = mysql.connector.connect(host="mysql", user="root", password = 'root', database=malicious)
解决这两个问题应该可以解决您的问题。
【讨论】:
谢谢它解决了这个问题。但我想了解我的应用程序容器如何能够在不指定端口的情况下连接 mysql 连接器?我的意思是我没有指定端口或公开 mysql 端口。 MySQL 容器自动暴露 3306 端口(默认端口),Python MySQL 连接器使用 3306 作为默认值。如果您使用不同的端口,您可以在connect
调用中使用额外的 port=XXX
参数来提供它。
添加了这个步骤,还是一样的错误。连接将名称“mysql”解析为 IP 但无法连接(
@Sultan1991 你解决了吗?我也遇到了这个问题以上是关于Docker撰写mysql连接失败的主要内容,如果未能解决你的问题,请参考以下文章
使用docker-compose编写常规的lnmp容器,pdo连接mysql失败。
phpmyadmin 未使用 docker 连接----配置中定义的 controluser 连接失败