在阿里云使用docker部署flask(nginx+gunicory)

阿里云高性能服务器2折起:点我购买

近期有两个flask小项目需要部署在阿里云服务器上,最终成功使用docker完成部署,中间踩了不少坑,特此记录下来,希望帮助别的同学少踩坑。

服务器是阿里云Ubuntu 14.04.5 LTS,使用nginx+gunicory部署,supervisor监控程序。

这里重点说下docker部分,关于docker教程,推荐这个:Docker-从入门到实践

不熟悉docker的同学务必看下相关教程,docker相关安装及如何加速这里我不赘述了,只对我用到的即部署环节所需要注意的进行说明。

我的Dockerfile如下:

FROM ubuntu:16.04

LABEL maintainer="BlackRun"
ENV PYTHONIOENCODING=utf-8


RUN  sed -i s@/archive.ubuntu.com/@/mirrors.aliyun.com/@g /etc/apt/sources.list \
&& sed -i s@/security.ubuntu.com/@/mirrors.aliyun.com/@g /etc/apt/sources.list \
&& apt-get clean \
&& apt-get update \
&& apt-get install -y python3-pip python3-dev nginx supervisor\
&& rm -rf /var/lib/apt/lists/*
ADD pip.conf /etc/pip.conf
COPY supervisord.conf /etc/supervisord.conf
COPY supervisor.conf /etc/supervisor/
RUN pip3 install --upgrade pip 


COPY . /app
WORKDIR /app
RUN  pip3 install -r requirements.txt \
&& ln -s /app/nginx.conf /etc/nginx/conf.d \
&& rm -rf /etc/nginx/sites-enabled/default \
&& rm -rf /etc/supervisor/supervisord.conf \
&& sed -i 's/nodaemon=false/nodaemon=true/g' /etc/supervisord.conf
EXPOSE 9001
EXPOSE 9002
CMD ["supervisord", "-c", "/etc/supervisord.conf"]

下面一一作出说明:
前三行,说明了基础镜像使用官方的ubuntu:16.04、作者名、设置PYTHONIOENCODING变量名

这里需要注意的是,根据教程,Docker每有一个RUN就会多一层镜像,所以应该避免使用RUN命令。具体请查看前面给出的教程。

sed -i s@/archive.ubuntu.com/@/mirrors.aliyun.com/@g /etc/apt/sources.list
sed -i s@/security.ubuntu.com/@/mirrors.aliyun.com/@g /etc/apt/sources.list

两行命令,设定ubuntu的apt源为阿里源,加快下面下载所需依赖的速度。其中sed是linux下一种在线编辑器。

 apt-get clean \
 apt-get update \
 apt-get install -y python3-pip python3-dev nginx supervisor\
 rm -rf /var/lib/apt/lists/*

这四行对apt进行更新,安装依赖,最后删除相关包,节省空间,熟悉ubuntu的同学应该都理解

ADD pip.conf /etc/pip.conf
COPY supervisord.conf /etc/supervisord.conf
COPY supervisor.conf /etc/supervisor/
RUN pip3 install --upgrade pip 

我习惯使用阿里源从python库中下载文件,所以使用pip.conf添加阿里源。2、3行是复制supervisor相关配置文件进image文件里,最后一行更新pip.

pip.conf

[global]
trusted-host=mirrors.aliyun.com
index-url=http://mirrors.aliyun.com/pypi/simple

supervisor.conf

[program:nginx-app]
command = /usr/sbin/nginx -g "daemon off;"
stdout_logfile = /var/log/supervisor/nginx_stdout.log
stdout_logfile_maxbytes = 10MB
stderr_logfile = /var/log/supervisor/nginx_error.log
stderr_logfile_maxbytes = 10MB

[program:student_filter_gunicorn]
command = /usr/local/bin/gunicorn -w 4 -b 127.0.0.1:8002 app:app
directory = /app/student_filter
stdout_logfile = /var/log/supervisor/student_filter_gunicorn_out.log
stdout_logfile_maxbytes = 10MB
stderr_logfile = /var/log/supervisor/student_filter_gunicorn_error.log
stderr_logfile_maxbytes = 10MB

[program:xueji_gunicorn]
command = /usr/local/bin/gunicorn -w 4 -b 127.0.0.1:8003 app_mac:app
directory = /app/xueji
stdout_logfile = /var/log/supervisor/xueji_gunicorn_out.log
stdout_logfile_maxbytes = 10MB
stderr_logfile = /var/log/supervisor/xueji_gunicorn_error.log
stderr_logfile_maxbytes = 10MB

这里使用gunicorn监听8002和8003两个端口运行python应用,然后用nginx作反向代理。
添加日志文件,是为了方便调试,不加也行。

具体supervisor使用教程可以查看我以前的文章supervisor使用小计

COPY . /app
WORKDIR /app
RUN  pip3 install -r requirements.txt \
&& ln -s /app/nginx.conf /etc/nginx/conf.d \
&& rm -rf /etc/nginx/sites-enabled/default \
&& rm -rf /etc/supervisor/supervisord.conf \
&& sed -i 's/nodaemon=false/nodaemon=true/g' /etc/

再回到Dockerfile中,上面命令第一行将当前目录下所有文件复制到容器的/app目录下。然后用WORKDIR命令说明工作目录(相当于运行 cd /app)

下面3-7行,分别是安装我的项目用到的python库,建立nginx配置文件的软链接,然后删除nginx和supervisor默认配置文件,将supervisor配置为后台运行。

rm -rf /etc/nginx/sites-enabled/default

其中有个大坑就是上面这句一定要有,因为默认配置文件监听了80端口,如果你在配置文件里也监听80端口,导致你访问80端口时候只会显示nginx的欢迎界面。

EXPOSE 9001
EXPOSE 9002
CMD ["supervisord", "-c", "/etc/supervisord.conf"]

最后三行,声明运行容器时提供的服务端口以及运行supervisord命令,将整个应用拉起来运行。

因为项目很小所以我的nginx.conf很简单,需要其他功能的同学请自行添加
nginx.conf

server {
   listen  9002;
   server_name 127.0.0.1;

   location  /  {
      proxy_pass   http://127.0.0.1:8002;
   }
  }

  server {
   listen  9003;
   server_name 127.0.0.1;

   location  /  {
      proxy_pass   http://127.0.0.1:8003;
   }
  }

最后运行在Dockerfile目录下运行下面命令即可生成容器,一切顺利的话就可以在浏览器里访问到你的应用了。

docker image build -t flask .
docker container run --name flask -d -p 9002:9002 -p 9003:9003 flask

我还用到了阿里云提供的镜像服务,建立了自己的镜像仓库,将本地生成好的image推送到阿里云镜像仓库,然后在云服务器上再拉取下来,方便快捷。具体可以看:阿里云容器镜像服务,目前是免费的。当然你也可以推送到docker官方的仓库。

下面简单说下踩的坑和一些排错技巧:

一、上面提到的一定要删除nginx的默认配置文件。
二、在ubuntu上安装docker不要使用apt-get安装,使用下面命令安装

sudo curl -sSL https://get.docker.com/ | sh

三、docker官方的ubuntu镜像,少了很多东西,不方便调试,所以可以在容器中使用下面命令安装一些常用的工具:

apt-get update
apt-get install -y lsof net-tools curl vim

然后结合相关的日志就可以排错。

我最后在阿里云服务器上拉取镜像后,发现通过浏览器仍然无法访问程序,这时候可以用docker exec 命令进入到容器里,然后运行下面命令:

curl http://127.0.0.1:8002
curl http://127.0.0.1:9002

我的返回了正确的html代码,说明我的部署没有问题,看了下阿里云服务器,我的是专有网络,在安全组里打开9002和9003即可正常访问。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343

推荐阅读更多精彩内容

  • Docker — 云时代的程序分发方式 要说最近一年云计算业界有什么大事件?Google Compute Engi...
    ahohoho阅读 15,508评论 15 147
  • 《Docker从入门到实践》阅读笔记 原书地址: https://yeasy.gitbooks.io/docker...
    GuoYuebo阅读 11,352评论 1 39
  • 【20】六盘山 一夜差不多无眠,想破脑袋也无用!网上搜寻了一下成吉思汗的“怯薛军”,还真让我发现了...
    一点文字阅读 1,873评论 32 74
  • 难和易,是俩个相对应的名词。 一件事情,不同的人有不同的看法,不同的认知。你觉得这件事情很容易,可能相对于我来说就...
    nopainsnog_d0ec阅读 313评论 0 0
  • 《红海行动》根据“也门撤侨”的真实事件改编,讲述伊维亚共和国发生政变,我国侨民被困险境,而他们唯一能指望的只有被派...
    贝贝赵阅读 334评论 2 0