Docker 部署 Flask项目
该项目采用的时 nginx+mariadb+uwsgi的方式,主要时熟悉一些docker的基本的操作,如果只是单纯的单机的部署,建议还是采用传统的方式好点
环境搭建
#拉取镜像官方 Imagesudo docker pull pythonsudo docker pull nginxsudo 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# 进入容器创建数据库,建议用dockerfilesudo docker exec -it mariadb01 /bin/bash#登录mysqlmysql -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.txtWORKDIR /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=rootgid=root#flask项目必须的配置callable= app#指定虚拟环境路径#home=/home/rao/.virtualenvs/FlaskDemo-w2G0QPDG# 指定项目启动文件,该路径是相对于 chdir目录来的wsgi-file = /app/FlaskDemo/RaoShop.py# 启用主进程master=true# 进程个数workers=5pidfile=/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创建Imagesudo docker build -t test01 .
创建容器
# 创建test01容器, --link 连接 mariadb01 -e 指定环境变量 sudo docker run -d --name test01 -v$(pwd):/app --link mariadb01:mysql -e MYSQL_HOST=mariadb01 test01Nginx容器
编写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 -aDocker 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-composesudo chmod +x /usr/local/bin/docker-composedocker-compose --version
docker compose 命令
#使用默认的配置文件 docker-compose.yml -d 没有logdocker-compose up#停止docker-compose stop#停止并删除 containerdocker-compose down#查看imagedokcer-compose images#进入mysqldocker-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文件需要先 buildsudo docker-compose up -d --build# 查看验证
Docker 常见命令操作
-d 后台方式启动-p 绑定宿主机端口-v 挂载映射目录--link 与容器网络通信,是单向的。-e 设置环境变量--name 容器名称# 查看容器相关iddocker inspect containerId#查看 newworksudo docker network ls# 查看日志sudo docker logs containerID# pull 指定应用版本的镜像sudo docker pull postgres:9.2docker --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 nginxsystemctl 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