我对Docker比较新,所以请耐心等待。我有一个在同一个Docker容器中运行的Python webapp和MySQL DB。
$ vi Dockerfile
FROM mysql
ENV MYSQL_HOST=127.0.0.1 \
MYSQL_ROOT_PASSWORD=pass
ADD testDB.sql /docker-entrypoint-initdb.d
EXPOSE 3306
FROM python:3.4
RUN pip install Flask
RUN pip install flask_cors
RUN pip install mysql-connector==2.1.6
COPY . /app
WORKDIR /app
ENTRYPOINT ["python"]
CMD ["Api.py"]
以下是应该连接到数据库的API的片段:
d_host='127.0.0.1'
d_user='root'
d_password='pass'
d_database='testDB'
@webapp.route('/testGet')
def testGet():
import mysql.connector
conn = mysql.connector.connect(host=d_host,
user=d_user,
password=d_password,
database=d_database, )
cursor = conn.cursor()
SQL = """SELECT text FROM testing ORDER BY testID DESC LIMIT 1;"""
cursor.execute( SQL )
c = cursor.fetchone()
conn.commit()
cursor.close()
conn.close()
return c[0]
但是,我一直收到以下错误:
mysql.connector.errors.InterfaceError: 2003: Can't connect to MySQL server on '127.0.0.1:3306' (111 Connection refused)
非常感谢任何帮助/想法。
修改
MySQL没有运行。现在它正在运行,但我仍然遇到同样的错误。此外,我的.sql转储文件未被导入。更新的代码:
$ vi Dockerfile:
FROM mysql
ADD dump.sql /docker-entrypoint-initdb.d
FROM python:3.4
RUN pip install Flask
RUN pip install flask_cors
RUN pip install mysql-connector==2.1.6
COPY . /app
WORKDIR /app
ENTRYPOINT ["python"]
CMD ["Api.py"]
我觉得我应该在这个文件中导入MySQL:
$ vi docker-compose.yml
version: '2.1'
services:
web:
build: .
ports:
- "5000:5000"
links:
- mysql
container_name: flask_app
mysql:
image: mysql
container_name: db
environment:
- MYSQL_ROOT_PASSWORD=root
ports:
- "3306:3306"
目前的代码基于这个问题:Docker Compose mysql import .sql
答案 0 :(得分:1)
我认为你的MySQL服务没有运行。这就是你无法连接到MySQL的原因。
要确认这一点,您可以打开容器的终端并检查MySQL服务是否正在运行。
如果要在一个容器中运行多个服务,则需要执行一些操作。 Read here for a detail explanation
或者你可以有两个单独的容器,使用docker-compose很容易让它运行。使用以下内容创建docker-compose.yml文件:
version: '3'
services:
main:
image: mysql
container_name: db
environment:
- MYSQL_DATABASE=db_name
- MYSQL_ROOT_PASSWORD=root
- MYSQL_USER=user
- MYSQL_PASSWORD=pass
volumes:
- ./data/db:/docker-entrypoint-initdb.d # here you can import your dump
ports:
- "3306:3306"
flask:
build: .
container_name: flask_app
然后为flask_app创建一个Dockerfile,并将其放在与docker-compose.yml相同的级别。有关如何使用docker-compose check here
运行烧瓶的更详细说明修改强>
我现在向docker-compose.yml - ./data/db:/docker-entrypoint-initdb.d
添加了一个卷。将转储放在此文件夹中:./ data / db,在主机中。
例如:
|- docker-compose.yml
|- Dockerfile
|- data/
|- db/
|- dump.sql
答案 1 :(得分:1)
我的问题最终出现在API本身。第d_host='127.0.0.1'
行
应该是d_host='mysql'
。
现在有效。对于后代,这里是基于lloiacono帮助的其他修改文件。我已经选择了他们的答案作为正确答案,因为如果没有他们的帮助我就不会进入这个阶段! Dockerfile
:
FROM python:3.4
RUN pip3 install Flask
RUN pip3 install flask_cors
RUN pip3 install mysql-connector-python
COPY . /app
WORKDIR /app
ENTRYPOINT ["python"]
CMD ["api.py"]
docker-compose.yml
:
version: '3'
services:
mysql:
image: mysql
container_name: db
environment:
- MYSQL_ROOT_PASSWORD=root
volumes:
- ./data/db:/docker-entrypoint-initdb.d
ports:
- "3306:3306"
web:
build: .
ports:
- "5000:5000"
container_name: flask_app