一、在容器中运行数据库
在容器中运行 MySQL 之前,我们将创建几个卷,Docker 可以管理这些卷来存储我们的持久数据和配置。在容器中运行 MySQL 之前,我们将创建几个卷,Docker 可以管理这些卷来存储我们的持久数据和配置。
$ docker volume create mysql
$ docker volume create mysql_config
2. 现在我们将创建一个网络,我们的应用程序和数据库将使用该网络相互通信。该网络称为用户定义的桥接网络,它为我们提供了一个很好的 DNS 查找服务,我们可以在创建连接字符串时使用它。
$ docker network create mysqlnet
3. 现在我们可以在容器中运行 MySQL 并附加到我们上面创建的卷和网络。
docker run --rm -d -v mysql:/var/lib/mysql -v mysql_config:/etc/mysql -p 3306:3306 --network mysqlnet --name mysqldb -e MYSQL_ROOT_PASSWORD=149789 mysql:8.0
4. 现在,让我们确保我们的 MySQL 数据库正在运行并且我们可以连接到它。使用以下命令连接到容器内正在运行的 MySQL 数据库,并在提示输入密码时输入“149789”:
<span style="color:#0c5176 !important"><span style="background-color:#f5f8fa !important"><code><span style="color:#00688b">$ </span>docker <span style="color:#658b00">exec</span> <span style="color:#8b008b">-ti</span> mysqldb mysql <span style="color:#8b008b">-u</span> root <span style="color:#8b008b">-p</span>
Enter password:
Welcome to the MySQL monitor. Commands end with ; or <span style="color:#cd5555">\g</span><span style="color:#658b00">.</span>
Your MySQL connection id is 8
Server version: 8.0.23 MySQL Community Server - GPL
Copyright (c) 2000, 2021, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type <span style="color:#cd5555">'help;'</span> or <span style="color:#cd5555">'\h'</span> <span style="color:#8b008b">for </span>help. Type <span style="color:#cd5555">'\c'</span> to clear the current input statement.
mysql></code></span></span>
5. 将应用程序连接到数据库
import pymysql
import json
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello, Docker!'
@app.route('/widgets')
def get_widgets() :
mydb = pymysql.connect(
host="mysqldb",
user="root",
password="149789",
database="inventory"
)
cursor = mydb.cursor()
cursor.execute("SELECT * FROM widgets")
row_headers=[x[0] for x in cursor.description] #this will extract row headers
results = cursor.fetchall()
json_data=[]
for result in results:
json_data.append(dict(zip(row_headers,result)))
cursor.close()
return json.dumps(json_data)
@app.route('/initdb')
def db_init():
mydb = pymysql.connect(
host="mysqldb",
user="root",
password="149789"
)
cursor = mydb.cursor()
cursor.execute("DROP DATABASE IF EXISTS inventory")
cursor.execute("CREATE DATABASE inventory")
cursor.close()
mydb = pymysql.connect(
host="mysqldb",
user="root",
password="149789",
database="inventory"
)
cursor = mydb.cursor()
cursor.execute("DROP TABLE IF EXISTS widgets")
cursor.execute("CREATE TABLE widgets (name VARCHAR(255), description VARCHAR(255))")
cursor.execute('insert into widgets(name, description) values("bbb", "bbb"), ("aaa", "aaa");')
mydb.commit()
cursor.close()
return 'init database'
if __name__ == "__main__":
app.run(host ='0.0.0.0', port=5000)
6. 根据镜像创建容器添加到数据库网络,然后运行我们的容器。这允许我们通过其容器名称访问数据库。
docker run --rm -it --network mysqlnet --name flask_demo_cn -p 8000:5000 flask_demo_img
7. 打开浏览器访问三个接口试试吧:
成功了。
二、使用compose在本地开发
未完待续...