Use Docker-compose build Flask project, and use mysql, mongodb and nginx

使用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的配置文件中includeconf.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.pycreate_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之前可以先看一下相关的书籍,了解一些相关的理论知识,虽然看了也记不了多少,但是可以眼熟一下,后面再看相应的例子就轻松许多了。

项目GitHub地址

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值