Docker+Uwsgi+nginx+flask
最近一直在忙着公司项目,学习服务器开发时间不长,希望可以记录点东西,如果写的错误,不好的请指正
项目中用python+swagger 基本完成了后台服务器的接口开发,但是需要将程序部署到其他服务器上,因此用到了docker
简介
Web应用随时可能被攻击者利用来夺取整个主机的权限,这是很常见也是很恐怖的一件事。为了更高的安全性,就需要将不同应用之间进行隔离(尤其是在这些应用属于不同的用户的情况下),然而这种隔离的实现一直是个挑战。到目前为止,隔离性的实现方法已经有了很多,然而它们要么太过昂贵(时间的层面以及资源的层面),要么太过复杂(无论对开发者还是对管理员)。
本文将讨论如何让“容器化”的Python Web应用跑在安全的沙箱里,严格的坚守在其各自的环境中(当然,除非你指定它们与其他应用进行“连接”)。我将一步一步的介绍如何创建一个Docker容器,如何用这个容器来跑我们的Python Web应用,以及如何用一个Dockerfile来描述整个构建过程以实现完整的自动化
关于Docker简介:https://www.cnblogs.com/SzeCheng/p/6822905.html
个人感觉上面对于基础的docker介绍的不错,那个快照不错
Docker安装(Ubuntu 14.04)
1.更新apt源,并保证https和ca证书成功安装
1.$ sudo apt-get update
2.$ sudo apt-get install apt-transport-https ca-certificates
2.添加新的GPG**
1. $ sudo apt-key adv \
2. --keyserver hkp://ha.pool.sks-keyservers.net:80 \
3. --recv-keys 58118E89F3A912897C070ADBF76221572C52609D
3.通过lsb_release -a命令查看系统的版本,Ubuntu14.04
1. Trusty 14.04 (LTS) deb https://apt.dockerproject.org/repo ubuntu-trusty main
4.设置源
1. $ echo "deb https://apt.dockerproject.org/repo ubuntu-trusty main" | sudo tee /etc/apt/sources.list.d/docker.list
5.更新APT1. $ sudo apt-get update
6.确认APT已经更新,正常会输出结果1. $ apt-cache policy docker-engine
2.
3. docker-engine:
4. Installed: 1.12.2-0~trusty
5. Candidate: 1.12.2-0~trusty
6. Version table:
7. *** 1.12.2-0~trusty 0
8. 500 https://apt.dockerproject.org/repo/ ubuntu-trusty/main amd64 Packages
9. 100 /var/lib/dpkg/status
10. 1.12.1-0~trusty 0
11. 500 https://apt.dockerproject.org/repo/ ubuntu-trusty/main amd64 Packages
12. 1.12.0-0~trusty 0
13. 500 https://apt.dockerproject.org/repo/ ubuntu-trusty/main amd64 Packages
7. 再次更新源
1. $ sudo apt-get update
8.安装增强包
1. $ sudo apt-get install linux-image-extra-$(uname -r) linux-image-extra-virtual
9.再次更新源1. $ sudo apt-get update
10.安装Docker1. $ sudo apt-get install docker-engine
11.启动Docker守护进程1. $ sudo service docker start
12.验证Docker是否安装成功(查看docker版本)
1. $ docker -v
截图:
参考:
https://docs.docker.com/engine/installation/linux/ubuntulinux/
docker需要3.10或者更高版本的内核支持,通过uname -r查看内核版本
部署调试
1. requirements.txt文件生成
安装#pip install pipreqs
进入项目目录下执行# pipreqs ./ 自动在当前目录下生成requirements.txt文件
2. 将程序放到部署环境中,在Dockerfile文件目录下
docker build -t myimage . (建立镜像)
docker run -d --name mycontainer -p 80:80 myimage (创建容器,容器是运行在镜像里面的)
这里的80:80 说明一下,前面的80是Docker暴露的端口,冒号后面的80指镜像里面的虚拟端口,在运行镜像后,docker 会监听端口80(暴露端口),外面程序调用访问端口80,docker链接到里面的虚拟端口80(docker里面的程序需要访问虚拟端口80)
建立镜像成功后的截图:
运行容器失败截图:
可以打印docker的日志信息,查看报错信息:
docker logs container_id
如上图所示,ConfigParser 没有__getitem__这个方法,最后查到原因是python版本不同(2.7 和3)ConfigParser模块里面的方法改变,这里修改python相关代码,容器运行成功! 接口调用成功
相关问题
1. 文件结尾包含^M
解决办法:$dos2unix filename
2. 在python程序中的import导入模块时, 有时会报错
解决办法: 需要在requirements.txt文件中添加此模块,运行前进行安装
相关命令
通过当前目录生成需要的requirements.txt文件,命令如下:
$ pip install pipreqs
$ pipreqs/path/to/project
查看docker里面的image
docker images
删除image
docker rmi -f image-id
查看docker里面的容器
docker ps -a
删除docker容器
docker rm /mycontainer (容器名)
停止容器
docker stop 690b648a23dafe1ddc689c0651c3a148f8017e33326b992f84a1a94927b6 (container_id)
查看日志信息
docker logs 690b648a23dafe1ddc689c0651c3a148f8017e33326b992f84a1a94927b6 (container_id)
注意:删除容器时,需要先停止容器,再去移除
最后给几个参考链接:
https://hub.docker.com/r/tiangolo/uwsgi-nginx-flask/
http://blog.csdn.net/daiyudong2020/article/details/53353064