Flask+MySQL+Redis的Docker配置
Docker配置了好多天,昨天晚上终于把碎遮项目的Docker打包完成了,后面会继续完善项目代码,把稳定版本打包后推送到DockerHub上。
网上关于Docker配置的文章很多,但大部分都是复制粘贴,让人不明所以。。在上面我浪费了好多时间。
Docker的下载和安装就不再赘述,直接开始配置环节,我使用的是docker-compose.yml,docker compose 在 Docker 容器运用中具有很大的学习意义,docker compose
是一个整合发布应用的利器。而使用 docker compose 时,懂得如何编排 docker compose
配置文件是很重要的。
要使用docker-compose,首先要把每个部分的Dockerfile写好,然后在docker-compose.yml文件中统一构建和启动
docker-compose.yml配置文件详解可以看:https://juejin.im/post/5aed4a776fb9a07a9918bb42
在我的项目结构是:
虽然用到了redis,但是redis数据库镜像没有啥需要配置的地方,所以就不用单独再写一个文件夹了。
docker-compose.yml内容为:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | version: '3' services: redis: image: "redis" mysql: image: mysql: 5.7 build: . / mysql environment: - MYSQL_DATABASE = SZheScan - MYSQL_ROOT_PASSWORD = root ports: - "3306:3306" command: - - character - set - server = utf8mb4 - - collation - server = utf8mb4_unicode_ci web: build: . / SZhe_Scan ports: - "5000:5000" links: - mysql:mysql - redis:redis depends_on: - mysql |
redis服务的镜像基于容器镜像redis启动,无需要配置的地方,mysql服务基于容器镜像mysql5.7进行启动,包含mysql的dockerfile的文件夹是mysql文件夹,我们在build的时候要将其路径写出来,即./mysql,environment添加环境变量,可以看到添加了我们使用的数据库名为SZheScan,(可能读者会奇怪,数据库初始化的时候应该是空的,应该什么时候创建数据库及其里面的表文件?别急,继续往下看)数据库的密码为root,最后是web服务,web服务的dockerfile在SZhe_Scan文件夹下,所以包含该路径,端口号映射为外部的5000端口,links用于链接另一容器服务,如需要使用到另一容器的mysql服务。可以给出服务名和别名;也可以仅给出服务名,我们使用服务名和别名链接到两个数据库。事实上,在docker-compose启动的时候,它会检查你的links关系,从而依照应当有的顺序来启动,比如你需要先创建数据库,再启动Web服务。但是我这里又添加了一个depends_on来指定服务依赖mysql,可以省略depends_on。
然后我们需要在mysql和SZhe_Scan的文件夹下都编写对应的Dockfile文件(如果你不止这些服务,比如还有nginx等,再多加一个nginx文件夹,同时在其中编写其dockerfile和相关配置即可)
接着到mysql文件夹下:
其中有三个文件,一个Dockerfile,是mysql启动的时候会依照其配置启动的,init文件夹下的文件是数据库的初始化配置,mysqld.cnd是数据库的另一个初始化配置,这里的文件位置放置不太好。
先看mysql的Dockerfile:
1 2 3 | FROM mysql: 5.7 ADD mysqld.cnf / etc / mysql / mysql.conf.d / mysqld.cnf COPY . / init / init.sql / docker - entrypoint - initdb.d |
第一行是基于的镜像,与docker-compose.yml里面的配置一样,是mysql:5.7,第二行是将本地的配置文件复制到容器的配置文件中,第三行是将init文件夹中的初始化数据库sql语句复制到/docker-entrypoint-initdb.d文件夹下。
重点讲第三行:
基础介绍参考自:https://blog.csdn.net/10km/article/details/79046864
摘录一部分:
默认情况下,mysql镜像创建的docker容器启动时只是一个空的数据库实例,为了简化docker部署,我们需要
在docker创建mysql容器的时,数据库和表已经自动建好,初始化数据也已自动录入,也就是说容器启动后数据库就可用了。这就需要容器启动时能自动执行sql脚本。
在mysql官方镜像中提供了容器启动时自动执行/docker-entrypoint-initdb.d
文件夹下的脚本的功能(包括shell脚本和sql脚本)docker-entrypoint.sh
中下面这段代码就是干这事儿的
1 2 3 4 5 6 7 8 9 | for f in /docker-entrypoint-initdb .d/*; do case "$f" in *.sh) echo "$0: running $f" ; . "$f" ;; *.sql) echo "$0: running $f" ; "${mysql[@]}" < "$f" ; echo ;; *.sql.gz) echo "$0: running $f" ; gunzip -c "$f" | "${mysql[@]}" ; echo ;; *) echo "$0: ignoring $f" ;; esac echo done |
摘录完毕。
简单来说,在/docker-entrypoint-initdb.d文件夹下的,以.sh .sql .sql.gz结尾的文件,都会被自动执行,并且它执行的时间是在容器启动的时候执行的,所以只要我们将数据库需要初始化的sql文件或者bash文件复制进该文件夹,就能够实现数据库的库,表,数据的初始化(比如说你要初始化一个管理员用户之类的)
当然,如果你在这个文件夹下写了很多个sql文件的话,它的执行顺序是没有保证的,但是网上也有很多的办法进行处理,不在本篇博客的讨论范围之内。
init文件夹下的初始化sql文件为init.sql
内容为:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 | CREATE DATABASE IF NOT EXISTS SZheScan default charset utf8 COLLATE utf8_general_ci; use SZheScan; CREATE TABLE ` user ` ( `id` int (11) unsigned NOT NULL AUTO_INCREMENT, `email` varchar (20) NOT NULL , `username` varchar (50) NOT NULL , `pw_hash` varchar (128) NOT NULL , PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE `baseinfo` ( `id` int (11) unsigned NOT NULL AUTO_INCREMENT, `url` varchar (10) NOT NULL , `status` varchar (4) NOT NULL , `title` varchar (50), ` date ` varchar (30) NOT NULL , `responseheader` TEXT NOT NULL , `Server` varchar (30), `portserver` TEXT, `sendir` TEXT, `boolcheck` tinyint(1), PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE `ipinfo` ( `id` int (11) unsigned NOT NULL AUTO_INCREMENT, `baseinfoid` int (11) NOT NULL , `bindingdomain` TEXT, `sitestation` TEXT, `CMessage` TEXT NOT NULL , `ipaddr` varchar (100) NOT NULL , PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE `domaininfo` ( `id` int (11) unsigned NOT NULL AUTO_INCREMENT, `baseinfoid` int (11) NOT NULL , `subdomain` TEXT, `whois` TEXT, `bindingip` TEXT, `sitestation` TEXT, `recordinfo` varchar (100), `domainaddr` varchar (100), PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE `buglist` ( `id` int (11) unsigned NOT NULL AUTO_INCREMENT, `oldurl` varchar (50), `bugurl` varchar (50), `bugname` varchar (100) NOT NULL , `buggrade` varchar (7) NOT NULL , `payload` varchar (100), `bugdetail` TEXT, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE `poc` ( `id` int (11) unsigned NOT NULL AUTO_INCREMENT, ` name ` varchar (100) NOT NULL , ` rule ` TEXT, `expression` TEXT, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE `log` ( `id` int (11) unsigned NOT NULL AUTO_INCREMENT, `ip` varchar (20) NOT NULL , `email` varchar (50) NOT NULL , ` date ` DATE , PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE `invitationcode` ( `id` int (11) unsigned NOT NULL AUTO_INCREMENT, `code` varchar (36) NOT NULL , PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; |
做的事情是:创建一个SZheScan的数据库,然后在其中创建所需要的表。
这里需要说明的是,flask应用我在编写的时候,是使用migrate进行数据库模型的迁移的,但是在网上没有找到好的方法,将数据库迁移模型直接在docker中创建其对应的表文件,只好出此下策,手动将表模型转换成sql语句进行创建。
mysqld.cnf文件里面写的是一些数据库基本配置,网上很多博客都有,比较长,这里不再贴出。
最后到web服务SZhe_Scan文件夹:
此文件夹下关注config.py和Dockerfile
config.py即你项目的配置文件。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | import os import redis ''' 配置文件: debug=true secret_key,session中的24位随机盐值 MySQL数据库配置 数据库名为scan_test_demo python3:https://blog.csdn.net/qq562029186/article/details/81325074 ''' DEBUG = True SECRET_KEY = os.urandom( 24 ) HOSTNAME = 'mysql' PORT = '3306' DATABASE = 'SZheScan' USERNAME = 'root' PASSWORD = 'root' #SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:root@127.0.0.1/tushare?charset=utf8' SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8' . format (USERNAME,PASSWORD,HOSTNAME,PORT,DATABASE) SQLALCHEMY_TRACK_MODIFICATIONS = False HOST = "redis" redisPool = redis.ConnectionPool(host = HOST,port = 6379 , db = 0 , decode_responses = True ) |
事实上这个在你编写项目的时候已经写好了,需要注意MySQL的HOSTNAME和redis的HOST。
相信读者已经看出来了,这里的HOSTNAME不再是我们平常用的127.0.0.1,而变成了docker-compose.yml文件中mysql数据库服务的名字:mysql,而redis的HOST也变成了docker-compose.yml中的redis数据库服务的名字:redis
另外还需要将数据库密码修改为root,当然你docker-compose.yml里面的MySQL密码是啥就写啥,不要拘泥于此。MySQL数据库也改为我们在init.sql数据库初始文件中创建的数据库名称。
再看flask项目的Dockerfile文件
1 2 3 4 5 6 7 | FROM python: 3.6 WORKDIR / code ENV FLASK_APP index.py ENV FLASK_RUN_HOST 0.0 . 0.0 COPY . . RUN pip install - r requirements.txt - i https: / / pypi.tuna.tsinghua.edu.cn / simple CMD [ "flask" , "run" ] |
本flask应用基于python3.6镜像搭建,当然,对于镜像的选择也是一门学问,在满足项目所有服务的前提下,基础镜像越小越好。
后面的配置这些就很简单了,相信你也能够看懂,这里为了pip下载快一点选择了国内的镜像网站,确实快了很多。还有如果你的flask服务是运行在服务器上,需要像我一样,运行在0.0.0.0的IP地址上,ENV FLASK_RUN_HOST 0.0.0.0
所有都弄好了之后,回到最开始的位置:
使用命令
1 | docker - compose up |
就可以启动服务啦。
也可以使用
1 | docker - compose up - d |
将docker服务运行在后台。
如果还是运行不起来的话,也不要慌张,运行的时候会显示报错的原因,见招拆招就完事了,慢慢来会配置成功的。
参考链接:
https://www.cnblogs.com/luozx207/p/9935252.html
__EOF__

本文链接:https://www.cnblogs.com/Cl0ud/p/12955857.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!