我正在尝试使用docker-compose运行2个docker容器并将mysql容器连接到app容器.Mysql容器正在运行但是app容器无法启动时出现错误错误:2003:无法连接在' 127.0.0.1:3306'上的MySQL服务器(111连接被拒绝) 好像我的app容器正在尝试连接我的主机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)}
答案 0 :(得分:2)
我可以看到两个问题:
尝试添加
links:
- mysql:mysql
到Docker Compose文件中的app
服务。这样可以确保您可以从mysql
访问app
容器。它将在您的app
容器中设置主机名映射(DNS),因此当您ping mysql
app
时,它会将其解析为mysql
容器的IP地址。< / p>
在.py
文件中,您在哪里定义要连接的主机?将host="mysql"
添加到connect
来电。默认情况下,它会连接到127.0.0.1
,这就是您所看到的。
cnx = mysql.connector.connect(host="mysql", user="root", password = 'root', database=malicious)
修复这两个问题可以解决您的问题。
答案 1 :(得分:0)
您可能需要考虑使用 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: