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