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内容为:

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:

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中下面这段代码就是干这事儿的
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

内容为:
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即你项目的配置文件。

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文件

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
所有都弄好了之后,回到最开始的位置:

使用命令
docker-compose up
就可以启动服务啦。
也可以使用
docker-compose up -d
将docker服务运行在后台。
如果还是运行不起来的话,也不要慌张,运行的时候会显示报错的原因,见招拆招就完事了,慢慢来会配置成功的。
参考链接:
https://www.cnblogs.com/luozx207/p/9935252.html
Flask+MySQL+Redis的Docker配置的更多相关文章
- 实战接口开发:python + flask + mysql + redis(根据反馈,持续细化更新。。。)
前言 自动化已经成为测试的必备技能之一了,所以,很多想跳槽的测试朋友都在自学,特别是最实用的接口自动化, 但是很多人因为没有可以练手的项目而苦恼,最终导致缺乏实战经验,其实,完全可以自己开发个简单项目 ...
- 从docker到docker-compose部署一个nginx+flask+mysql+redis应用
目的是把一个flask项目的mysql数据库.redis数据库.flask应用.nginx服务分别装到四个容器中,然后用docker-compose命令同时启动与关闭 一.安装docker Docke ...
- 整理spring + mysql + redis + 测试 的配置格式 和源码
经过多次整理,最终以这样的文件格式配置 目前配好的基本模板: 1 <?xml version="1.0" encoding="UTF-8"?> 2 ...
- demo项目开发(Python+flask+mysql+redis只包含后端接口)
[demo项目开发需求] 用户信息管理,可以注册.登录.添加用户.删除用户 注册:任何用户可以注册,对用户提交的注册信息进行校验,返回对应的信息,其中: 用户名:必填,唯一 密码:必填,只能6-12位 ...
- Docker下Python Flask+Redis+MySQL+RQ队列简单配置
本篇博文主要讲解Docker下使用RQ队列的通信配置,主要是网上的部分文章写的不太清楚,特写一篇 作者使用docker-compose.yml文件调度各部分文件Dockerfile,起初是这样写的 v ...
- MySQL、MongoDB、Redis数据库Docker镜像制作
MySQL.MongoDB.Redis数据库Docker镜像制作 在多台主机上进行数据库部署时,如果使用传统的MySQL的交互式的安装方式将会重复很多遍.如果做成镜像,那么我们只需要make once ...
- 一文教您如何通过 Docker 快速搭建各种测试环境(Mysql, Redis, Elasticsearch, MongoDB) | 建议收藏
欢迎关注个人微信公众号: 小哈学Java, 文末分享阿里 P8 高级架构师吐血总结的 <Java 核心知识整理&面试.pdf>资源链接!! 个人网站: https://www.ex ...
- 手写redis的docker文件,通过docker-compose配置redis
在前面一遍随笔,配置的是mysql主从的docker-compose配置.今天我们来学习配置编排容器redis. 准备环境: docker 18.06.1-ce docker-compose 1.23 ...
- linux记录-docker配置mysql
docker部署mysql 1.拉取镜像 docker pull mysql 2.docker rm containerID 删除镜像iD 3.创建镜像 docker run --name=m ...
随机推荐
- Cocos Creator与VS Code整合代码提示问题
Cocos Creator与VS Code整合开发配置 在Cocos Creator中依次点击下面框中的菜单 VS Code工作流 配置Cocos Creator的默认编辑器 Cocos Creato ...
- 第05组 Alpha冲刺 (3/6)
.th1 { font-family: 黑体; font-size: 25px; color: rgba(0, 0, 255, 1) } #ka { margin-top: 50px } .aaa11 ...
- Pytorch显存动态分配规律探索
下面通过实验来探索Pytorch分配显存的方式. 实验 显存到主存 我使用VSCode的jupyter来进行实验,首先只导入pytorch,代码如下: import torch 打开任务管理器查看主存 ...
- quic 分析 1
问题1:quic握手过程是怎样的? 怎样节约握手时间?握手时间多少个RTT?握手过程成涉及到哪些概念以及变量(代码) 0~1 RTT握手过程 QUIC握手的过程是需要一次数据交互,0-RTT时延即 ...
- Kafka 消费者及消费者分区策略
消费方式: consumer 采用 pull(拉)模式从 broker 中读取数据. push(推)模式很难适应消费速率不同的消费者,因为消息发送速率是由 broker 决定的. 它的目标是尽可能以最 ...
- PyQt5信号与槽关联的两种方式
目录 通过QtDesigner 手动关联的方式 通过QtDesigner 单击菜单栏切换到信号槽编辑模式 单击控件并拖动鼠标到信号的接收对象上,一般为对话框自己,松开鼠标弹出信号和槽选择框 选中cli ...
- HashMap 链表插入方式 → 头插为何改成尾插 ?
开心一刻 一天,楼主在路上碰到了一个很久没见的朋友,找了个餐馆,坐下聊了起来 楼主:在哪上班了 ? 朋友:火葬场啊 楼主:在那上班,一个月多少钱啊 ? 朋友:两万多啊 楼主(不可思议):多少 ? 朋友 ...
- 缩点Tarjan算法解析+[题解]受欢迎的牛
(注:我在网上找了一些图,希望原博主不要在意,谢谢,(。☉౪ ⊙。)) 首先来了解什么是强连通分量 有向图强连通分量:在有向图G中,如果两个顶点vi,vj间(vi>vj)有一条从vi到vj的有向 ...
- 微信公众号平台Url Token EncodingAESKey 注意点
最近公司让我开发微信公众号平台扫码登录,同步用户信息于PC端,所做的过程当中遇到了一些坑,做完了就总结一下需要注意的点,如若大家开发过程中遇到同样的问题,可以借鉴! 第一:配置域名 作用:配置域名为了 ...
- FL Studio 插件使用技巧——Fruity Reeverb 2 (上)
许多学习FL的用户会发现,自己在听大师的电子音乐作品时都能感受到他们的音乐有一股强大的空间感,有时还能感知到深邃的意境.不少人会因此而疑惑:为什么出自我们之手的音乐就没有这样的效果呢?我们的音乐里到底 ...