使用docker打包flask项目,并使用nginx运行。所以程序放在一个镜像
1.Centos安装好docker :yum -y install docker
2.代码目录,主程序是book.py:
docker-book/
├── book
│ ├── app_config.py
│ ├── book.py
│ ├── db
│ ├── gunicorn.conf.py
│ ├── log
│ ├── model
│ ├── requirements.txt
│ ├── static
│ ├── templates
│ └── util
├── Dockerfile
├── nginx-book.conf
├── nginx.conf
└── build.sh
说明:
gunicorn.conf.py是gunicorn运行时候的配置:
import gevent.monkey
gevent.monkey.patch_all()
import multiprocessing
bind = '0.0.0.0:9009'
# workers = multiprocessing.cpu_count() * 1 + 1
backlog = 2048
workers=1
worker_class = 'gunicorn.workers.ggevent.GeventWorker'
proc_name = 'gunicorn.proc'
pidfile = 'log/gunicorn.pid'
errorlog = 'log/gun_err.log'
accesslog ='log/gun_access.log'
loglevel = 'info'
daemon = True
#debug = True
nginx-book.conf是nginx运行的配置
server {
listen 80;
server_name book.yzf.net; # 这是HOST机器的外部域名,用地址也行
location / {
proxy_pass http://127.0.0.1:9009; # 这里是指向 gunicorn host 的服务地址
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
3.Dockerfile如下是给nginx单独启动的docker,直接引用了现成的docker,替换下我们自己的配置文件
#nx-gunicorn-flask with python2
FROM centos:7
LABEL author="guoyouchun"
LABEL purpose = 'install yzf book management system'
ENV PYTHONIOENCODING=utf-8
#指定容器目录
RUN mkdir -p /home/yzfbook/
WORKDIR /home/yzfbook
#把源码拷贝过来,不需要book目录
COPY book .
#安装NGINX
COPY nginx-release-centos-7-0.el7.ngx.noarch.rpm .
RUN rpm -Uvh ./nginx-release-centos-7-0.el7.ngx.noarch.rpm
RUN rm -f ./nginx-release-centos-7-0.el7.ngx.noarch.rpm
RUN yum install -y nginx
RUN rm -f /etc/nginx/conf.d/*
COPY nginx.conf /etc/nginx/nginx.conf
COPY ngin-book.conf /etc/nginx/conf.d/
#安装python依赖
COPY setuptools-40.8.0 ./setuptools-40.8.0
COPY pip-19.0.3 ./pip-19.0.3
WORKDIR /home/yzfbook/setuptools-40.8.0
RUN python setup.py install
WORKDIR /home/yzfbook/pip-19.0.3
RUN python setup.py install
RUN rm -rf /home/yzfbook/setuptools-40.8.0 /home/yzfbook/pip-19.0.3
WORKDIR /home/yzfbook
RUN pip install -r requirements.txt -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com
# 安装 gunicorn
RUN pip install gunicorn -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com
#启动:
RUN chmod +x ./start.sh
CMD ["./start.sh"]
4.start.sh是运行脚本。发现nginx在容器里面启动不来,还没找出为啥原因,只能手动启动
#!/bin/sh
cd /home/yzfbook/
gunicorn -c gunicorn.conf.py book:app
nginx
5.全量的build.sh脚本如下::
#!/bin/sh
#删除镜像,重新打包
docker ps -a |grep mybook|awk -F ' ' '{print $1}'|xargs docker stop
docker ps -a |grep mybook|awk -F ' ' '{print $1}'|xargs docker rm
docker image list |grep mybook|awk -F ' ' '{print $3}'|xargs docker image rm
docker build -f Dockerfile -t mybook:v1 .
#解决权限问题 setenforce 0
#在主机建立好映射的目录 mkdir -p /data/log/{nginx,book}
docker run -p 80:80 -v /data/log/nginx:/var/log/nginx -v /data/log/yzfbook:/home/yzfbook/log --name mybook -d mybook:v1
#这个为了解决nginx在容器没法执行
myid=`docker ps|grep mybook|awk -F ' ' '{print $1}' `
docker exec -it $myid /bin/bash
nginx
6.访问80端口