使用docker-compose一键部署Flask项目
部分菜单
docker-compose.yml
docker-compose.yml
version: '2.0'
services:
mysql:
image: mysql
restart: always
command: '--default-authentication-plugin=mysql_native_password'
volumes:
- ./script/data/mysql/init:/docker-entrypoint-initdb.d/
environment:
MYSQL_ROOT_PASSWORD: 'root'
mongo:
restart: always
build:
context: .
dockerfile: mongo-dockerfile
environment:
MONGO_INITDB_DATABASE: bookstore
MONGO_INITDB_ROOT_USERNAME: root
MONGO_INITDB_ROOT_PASSWORD: root
nginx:
image: nginx
# restart: always
volumes:
- ./conf/nginx.conf:/etc/nginx/conf.d/default.conf
ports:
- 8080:80
depends_on:
- web
links:
- web
web:
# restart: always
build:
context: .
dockerfile: Dockerfile
volumes:
- .:/code
expose:
- 8000
links:
- mysql
- mongo
- 这里主要注意的一点就是docker-compose启动容器的时候,在容器的
/docker-entrypoint-initdb.d/
目录下的文件会自动运行,正如文件夹名称所说初始化数据库,但是只会运行.sh
和.sql
文件,其他的都会忽略。
所以这里的MySQL数据库的初始化建表建库都直接把本地的init
文件夹里面的映射到了容器的/docker-entrypoint-initdb.d/
目录下。
MySQL部分
-
从老数据库导出数据
mysqldump -u root -p bookstore > './bookstore.sql'
使用mysqldump工具直接导出整个数据的数据
注意里面只包含建表和数据插入语句而已,没有包含数据库的建表语句
想要直接运行的需要自己添加创建数据库的语句
CREATE DATABASE IF NOT EXISTS bookstore DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
也可以在docker-compose的environment中设置初始化的数据库,有数据库就可以直接运行
mysql -uroot -proot bookstore < bookstore.sql
导入数据命令了(没有试过)
MYSQL_DATABASE: userdb
MongoDB部分
- 数据库导出命令
mongodump -d bookstore -o /home/caisi/PycharmProjects/BookStore/script/data/
- 数据库数据导入命令
mongorestore -d bookstore --dir /home/caisi/PycharmProjects/BookStore/script/data/bookstore/
因为MongoDB数据库和集合的惰性,所以数据库名不用创建也可以直接导入数据
这里用到了dockerfile容器构建文件
理论上讲,应该也能和MySQL一样,把备份的数据从本地映射到容器中,然后写一个.sh
脚本在容器启动的时候自动运行导入数据命令,但是搞了半天就是说映射的文件夹没有找到。
- mongodb 容器构建mongo-dockerfile文件
> mongo-dockerfile
# https://blog.csdn.net/weixin_44807848/article/details/108120323
FROM mongo
RUN mkdir -p ./home/mongodb && touch ./home/mongodb/.dbshell && chown -R 999:999 ./home/mongodb
ENV WORKSPACE /usr/local/work
ENV AUTO_RUN_DIR /docker-entrypoint-initdb.d
ENV INSTALL_MONGO_SHELL mongo-setup.sh
RUN mkdir -p $WORKSPACE
COPY ./script/data/bookstore $WORKSPACE/bookstore
COPY ./script/data/mongo/init/$INSTALL_MONGO_SHELL $AUTO_RUN_DIR/
RUN chmod a+x $AUTO_RUN_DIR/$INSTALL_MONGO_SHELL
- 导入数据
.sh
文件
> mongo-setup.sh
#!/bin/sh
mongorestore -h localhost --authenticationDatabase admin -u root -p root -d bookstore --dir $WORKSPACE/bookstore
上面的/bookstore
文件夹找不到的问题,搞了半天后才忽然注意到,™的原来是在.sh
文件中最后面多了一个空行的原因,因为Windows系统下的换行字符和Unix的不同!
最后docker-copose在version: '2'
中直接用build: .
会报错,所以可以使用context:
设置dockerfile的文件路径,dockerfile:
就是文件名了。
Nginx部分
nginx配置使用了Flask官网中的简单配置
server {
listen 80;
server_name localhost;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
location / {
proxy_pass http://web:8000;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
这里直接把配置文件映射到/etc/nginx/conf.d/default.conf
中,Nginx的配置文件中include
了conf.d
文件夹下面的文件,所以直接把default.conf
server
放进来就可以了。
主要就是改了proxy_pass http://web:8000;
其中web
是docker-compose的服务名(容器),docker会把web
映射成相应的IP。
web部分
这里分两部分,uwsgi和dockerfile
uwsgi
[uwsgi]
module = app:create_app()
master = true
protocol=http
processes = 2
chdir = /bookstore
socket = 0.0.0.0:8000
chmod-socket = 666
vacuum = true
buffer-size = 32768
这里就是module = app:create_app()
,其中app
是入口文件,也就是app.py
, create_app()
就是Flask的工厂函数了
Dockerfile
FROM python:3.5
RUN mkdir /bookstore
WORKDIR /bookstore
COPY requirements.txt /bookstore/requirements.txt
RUN pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt
COPY . /bookstore
CMD ["uwsgi", "uwsgi.ini"]
这里就是按照相应的依赖包,把项目从本地复制到容器中,最后在容器运行的时候启动uwsgi服务。
最后需要注意的是在docker-compose.yml
中需要为web
服务开启端口expose:
,否则Nginx代理不了web
。
总结
- 到这里终于完成了项目部署了,虽然只是简单的配置选项,也踩过很多坑,正是因为自己踩过这么多坑,也对docker-compose有了更多的了解。
- 学docker和Nginx之前可以先看一下相关的书籍,了解一些相关的理论知识,虽然看了也记不了多少,但是可以眼熟一下,后面再看相应的例子就轻松许多了。