写在前面-总结
前言:本项目后端使用的是flask框架进行开发,数据库以及oss存储使用的都是第三方服务。
前端使用vue开发。部署采用的是docker+nginx+gunicorn+supervisor。
遇到的一些坑:我是在windwos下开发,进行docker build,在build image时遇到了很多很多网上常见的问题。
apt 无法更新
比如在apt时用了很多方法装不上nginx这些包,看了网上的博客,换了apt源发现还是有问题,最后发现是博客提供的源有问题,源的ftp可能更新了路径不对。
ps:如果换了源还不对,可以拿着源的url自己去访问一下,我就是这样发现的问题。下载image时超时、报错
这个时候需要切换docker的源,打开docker的setting,切换源。
ps:网上很多方法,这个我没遇到很大的坑。在初期搭建环境的时候最好不要==“一步到位”==,一步一步的来,完成一部先进入容器内部看看,自己在容器内先测试接下来的命令,要不然只凭docker build的报错命令是有很多看不出来的。
进入主题
既然可以搜到这篇blog,首先我认为docker的基础命令都是ok的,否则建议先看一下这几篇文章。
容器十年 —— 一部软件交付编年史关于构建flask项目的docker技术文档(纯英文)基础命令(这样的文章有很多…)
因为本项目后端使用的时supervisor管理进程,gunicorn启动项目。所以需要了解上面两个技术的基本使用。
supervisor官方文档(英文)
supervisor基础命令
gunicorn官方(英文)
gunicorn基础命令
基础命令的文档有很多,网上可以搜到很多的中文文档,但是有的可能没有写清楚是在什么环境下安装,安装的什么版本,具体的参数是什么功能,导致很多人虽然跟着技术博客做出来,但是会遇到很多问题。还是推荐大家FQ看一下官方的文档,虽然是英文的吧。
一、文件的配置信息
1、Dockfile
# 使用python镜像,可以去去找适合自己的镜像FROM python:3.6.4WORKDIR /appCOPY . .#更新apt-get源 使用163的源RUN echo "deb /debian/ jessie main non-free contrib" >/etc/apt/sources.list \&& apt-get update \&& apt install -y nginx supervisor \&& pip3 install gunicorn \&& pip install -r requirements.txt -i /pypi/simple/ADD supervisord.conf /etc/supervisor/conf.d/supervisord.confADD gunicorn.conf /etc/supervisor/conf.d/gunicorn.confADD nginx_arrway.conf /etc/nginx/conf.d/nginx_arrway.confCMD supervisord
上面的这些命令都很基础,最麻烦的一点可能就是在windows下无法apt update,那就用我上面RUN的第一行命令,换源,亲测有效的。
2、 supervisor
[supervisord]nodaemon=true[program:nginx]command=/usr/sbin/nginx[program:arrway-server]directory = /appcommand = gunicorn -b 0:5500 -w 8 app:app
我的supervisor.conf没有配置那么多的东西,比如log文件等,根据自己的需求可以看上面的技术文档自己增加对应的参数进去。因为这里我直接使用了gunicorn启动,所以没有用到gunicorn.conf文件。根据自己的实际情况可以去配置。
3、nginx
宿主主机的配置:
server {listen 80;server_name '你的域名';location / {proxy_pass http://127.0.0.1:5000; # 这里指向的是启动容器时映射的端口}}
容器内nginx配置
server {listen 5000; # 监听被映射的端口location /api/v1/ {proxy_pass http://127.0.0.1:5500; # 这个是后端项目启动的端口,对应在supervisor.conf使用gunicorn启动时的端口}location / {# 这里指向前端静态文件,因为我是在build镜像前打包的项目,所以直接指向就ok。# 也可以在dockerfile文件中使用命令打包前端项目,但是装npm有时候可能会遇到很多无法预测的错误。root /app/web/dist;index index.html;try_files $uri $uri/ /index.html;}}
二、 build镜像
build 镜像
docker build -t [镜像名]:[tag] .
使用exec命令可以进入镜像内部查看
docker exec -t [images ID] /bin/bash
使用run命令启动镜像,此时会生成一个容器
docker run -it -p 5000:5000 [images ID]# images ID 可以通过 docker images -a 查看
上传镜像
# 登陆镜像仓库$ sudo docker login --username=skykxt_fy -# 创建标签$ sudo docker tag [ImageId] -/skykxt/arrway:[镜像版本号]# 上传到仓库$ sudo docker push -/skykxt/arrway:[镜像版本号]
服务器拉取镜像
$ sudo docker pull -/skykxt/arrway:[镜像版本号]
拉取镜像后就可以run,生成容器。到此大功告成。
总结
其实这些技术都不是很难理解,比较麻烦的就是把很多技术糅合到一起,根据自己的情况去选择技术如何搭配。然而网上很多的例子也不一定符合自己开发的环境,就会掉入很深的坑,最主要的还是学会解决问题,形成一个良好的解决问题的思路。
最后呢还是推荐大家多去看看技术的官方文档,FQ去看看那边的技术,因为那边讲的一般都很细,很原理的一些东西。
如果你发现了这篇blog有问题,或者有更好的解决方案,尽快和我留言吧~