Docker部署Flask项目 三

Docker 部署 Flask项目

该项目采用的时 nginx+mariadb+uwsgi的方式,主要时熟悉一些docker的基本的操作,如果只是单纯的单机的部署,建议还是采用传统的方式好点

环境搭建

#拉取镜像官方 Image
sudo docker pull python
sudo docker pull nginx
sudo docker pull mariadb

#导出依赖
pip freeze > requirements.txt
# 安装依赖
pip install -r requirements.txt

创建Mariadb容器

其实不建议数据库用容器创建,用本机的好点,便于维护

# 创建一个名为 mariadb01容器
sudo docker run --name mariadb01 -e MYSQL_ROOT_PASSWORD=R319913j -d  mariadb
# 进入容器创建数据库,建议用dockerfile
sudo docker exec -it mariadb01 /bin/bash
#登录mysql
mysql -u root -p R319913j
#创建数据库
create databse ginger
#退出
exit

创建python容器

编写DockerFile的方式创建镜像,进而创建容器。

# 基础镜像
FROM python
# 指定创建者信息
LABEL maintainer="rao@demo.com"
# 复制项目到容器指定目录, ADD有相识的功能并具有解压功能
COPY FlaskDemo /app/
# 切换工作目录
WORKDIR /app
# 执行命令
RUN pip install -r /app/requirement.txt
WORKDIR /app/FlaskDemo/
# 将容器中的端口暴露出来
EXPOSE 5000
# 容器启动时执行的命令
CMD ["uwsgi","--http",":5000","--wsgi-file","RaoShop.py","--callable", "app"]s


#配置文件启动,注意路径,这个很容器出现问题
CMD ["uwsgi","--ini","uwsgi.ini"]

uwsgi配置文件,走nginx http 配置改为 socket

[uwsgi]
#这个地址建议 flask app配置地址一致
http=0.0.0.0:5000
# 项目目录
chdir=/app/FlaskDemo
# 启动uwsgi的用户名和用户组
uid=root
gid=root
#flask项目必须的配置
callable= app
#指定虚拟环境路径
#home=/home/rao/.virtualenvs/FlaskDemo-w2G0QPDG
# 指定项目启动文件,该路径是相对于 chdir目录来的
wsgi-file = /app/FlaskDemo/RaoShop.py

# 启用主进程
master=true
# 进程个数
workers=5
pidfile=/app/FlaskDemo/scripts/uwsgi.pid
# 自动移除unix Socket和pid文件当服务停止的时候
vacuum=true
# 序列化接受的内容,如果可能的话
thunder-lock=true
# 启用线程
enable-threads=true
# 设置自中断时间
harakiri=30
# 设置缓冲
post-buffering=32768
# 设置后台启动,在docker容器中,需要禁用该配置(未知)
#daemonize=/app/FlaskDemo/scripts/uwsgi.logi
# 设置缓存大小
buffer-size=32768

创建镜像

# 在当前目录查找dockerfile创建Image
sudo docker build -t test01 .

创建容器
# 创建test01容器, --link 连接 mariadb01 -e 指定环境变量
sudo docker run -d --name test01 -v$(pwd):/app --link mariadb01:mysql -e MYSQL_HOST=mariadb01 test01

Nginx容器

编写nginx的confi文件,映射到相依目录下

    server {
    listen       80;
    # ifconf 内网地址
    server_name  0.0.0.0

    #开启静态文件处理强能力
    sendfile on;
    #charset koi8-r;
    #配置请求日志
    #access_log  /var/log/nginx/host.access.log  main;

    # uwsgi相关参数配置
    location / {
        include uwsgi_params;
        # 这个地址,通过 sudo docker inspect test01 查看ip地址,端口与 uwsgi配置文件一致
        uwsgi_pass 172.17.0.3:5000;
    }

    # 静态文件定义
    location /static {
        #开启gzip
        #gzip on;
        #指定gzip http的版本
        #gzip_http_version 1.1;
        #指定gzip压缩比
        #gzip_comp_level 2;
        #指定需要压缩的格式
        #gzip_types text/pain application/javascript application/x-javascript text/css/application/xml text/javascript application/x-http-php ima  # e/jpeg image/gif image/png;
        # 映射的静态文件目录 实际为 /opt/test/static
        root /opt/test ;
    }

}

创建容器
# -v 映射相关nginx目录 -p 映射端口
docker run -d --name nginx01 -p 8080:80 -v /home/rao/dokcerdemo/html:/usr/share/nginx/html -v /home/rao/dockerdemo:/opt/test -v /home/rao/dockerdemo/nginx.conf:/etc/nginx/conf.d --link test01 nginx

查看验证

至此三个容器创建创建完毕,验证
# 浏览器验证
# http://127.0.0.1:8080/admin/
# 查看容器
sudo docker contaienr ls -a

Docker Compose编排操作

这个是docker出的容器,比较适合单机的编排,简单快速

  • Docker Compose是一个工具
  • 这个工具可以通过 一个yml文件定义多容器的 docker应用
  • 通过一条命令就可以根据 yml文件的定义去创建或者管理这多个容器

docker-compose安装

地址:https://docs.docker.com/compose/install/

sudo curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose

sudo chmod +x /usr/local/bin/docker-compose

docker-compose --version

docker compose 命令

#使用默认的配置文件 docker-compose.yml -d 没有log
docker-compose up
#停止
docker-compose stop
#停止并删除 container
docker-compose down
#查看image
dokcer-compose images
#进入mysql
docker-compose exec mysql bash

使用 Docker Compose 部署项目

参考: https://blog.csdn.net/qq_36148847/article/details/79427878
yml文件

version: '3'
services:
  mariadbapp:
    image: "mariadb"
    container_name: 'mariadb02'
    environment:
      MYSQL_ROOT_PASSWORD: 'R319913j'

  webapp:
    build:
      context: ./web-app
      dockerfile: Dockerfile
    container_name: 'test02'
    environment:
      MYSQL_HOST: mariadb02
    links:
      - mariadbapp

  nginxapp:
    image: "nginx"
    container_name: 'nginx02'
    ports:
      - '8090:80'
    volumes:
      - ./nginx-app/nginx.conf:/etc/nginx/conf.d:ro
      - ./nginx-app/html:/usr/share/nginx/html:ro
      - ./nginx-app:/opt/test:ro
    links:
      - webapp

编辑运行

# mariadb没有初始化数据,需要手动创建数据库,使用dockerFile的方式构建mariadb,初始化数据配置等
# 有build文件需要先 build
sudo docker-compose up -d --build
# 查看验证

Docker 常见命令操作


-d 后台方式启动
-p 绑定宿主机端口
-v 挂载映射目录
--link 与容器网络通信,是单向的。
-e 设置环境变量
--name 容器名称

# 查看容器相关id
docker inspect containerId

#查看 newwork
sudo docker network ls
# 查看日志
sudo docker logs containerID

# pull 指定应用版本的镜像
sudo docker pull postgres:9.2

docker --link 属性时单向的,正在创建的容器连接到已存在的容器,而新建 network `docker network create -d bridge my-bridge` 将容器绑定到该容器上,两容器时互相通的。

-p 参数: 前者代表宿主机端口,后者代表从起端口


拷贝文件从宿主机到容器中,注意使用绝对路径

docker cp host_machine_fiel_path containerId: container_file_path
# 示例
docker cp /home/rao/docker/app.py 0d29c86c1352:/opt/

拷贝文件从容器到宿主机中

docker cp containerId: container_file_path host_machine_fiel_path

查看端口占用

#查看5000端口占用
lsof -i:5000
# 释放端口
kill -9 pid

nginx


systemctl enable nginx
systemctl restart nginx

相关问题

nginx错误日志
*1 upstream prematurely closed connection while reading response header from upstream
上游服务断开了

uwsgi 错误日志
invalid request block size: 21573 (max 4096)...skip
答案: https://stackoverflow.com/questions/15878176/uwsgi-invalid-request-block-size

posted @ 2018-09-20 11:00  NiRao  阅读(418)  评论(1编辑  收藏  举报