欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Docker+Uwsgi+nginx+flask

程序员文章站 2022-07-12 17:14:57
...

    最近一直在忙着公司项目,学习服务器开发时间不长,希望可以记录点东西,如果写的错误,不好的请指正

    项目中用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.更新APT
1.	$ 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.安装Docker
1.	$ sudo apt-get install docker-engine
11.启动Docker守护进程
1.	$ sudo service docker start

12.验证Docker是否安装成功(查看docker版本)

1.	$ docker -v

截图:

Docker+Uwsgi+nginx+flask

参考:

    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+Uwsgi+nginx+flask

    运行容器失败截图:

Docker+Uwsgi+nginx+flask

可以打印docker的日志信息,查看报错信息:

    docker logs  container_id

    如上图所示,ConfigParser  没有__getitem__这个方法,最后查到原因是python版本不同(2.7 和3)ConfigParser模块里面的方法改变,这里修改python相关代码,容器运行成功! 接口调用成功

    Docker+Uwsgi+nginx+flask


相关问题

    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

相关标签: docker 部署