#网络后台开发#Docker
-Hints:本篇文章所编纂的资料均来自网络,特此感谢参与奉献的有关人员。
项目移植
-代码移植的问题
运行平台的特异性,操作系统的设置,各种库和组件的安装会影响软件的运行。
-代码移植的方法
1 虚拟机:可以在一种操作系统里面运行另一种操作系统
缺陷:
1 资源占用多
2 冗余步骤多
3 启动慢
2 Linux容器:Linux 容器不是模拟一个完整的操作系统,而是对进程进行隔离。对于容器里面的进程来说,它接触到的各种资源都是虚拟的,从而实现与底层系统的隔离。
优势:
1 启动快
2 资源占用少
3 体积小
Docker
Docker 将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。
-用途:
(1)提供一次性的环境。比如,本地测试他人的软件、持续集成的时候提供单元测试和构建的环境。
(2)提供弹性的云服务。因为Docker 容器可以随开随关,很适合动态扩容和缩容。
(3)组建微服务架构。通过多个容器,一台机器可以跑多个服务,因此在本机就可以模拟出微服务架构。
-类型:
镜像是容器启动的基础,它包含了容器运行所需的所有基本文件和配置信息,通俗地说,就是只读文件和文件夹的组合。 在docker里,一切都是以镜像为基础的,镜像是Docker容器启动的先决条件。
在 Docker 运行容器之前,本地需要存在对应的镜像。 如果本地没有对应的镜像,Docker会尝试从默认镜像仓库下载。
-指令
#查看拉取的镜像
docker images
#查看docker正在运行的实例
docker ps
#查看docker所有的实例
docker ps -a
#关闭docker容器
docker stop DockerName
#删除docker容器
docker rm DockerName
#删除docker镜像
Docker rmi DockerName:Version
-资料
https://blog.csdn.net/qq_44045338/article/details/115243567
https://www.imooc.com/article/317550
Docker部署过程
-资料
https://www.jb51.net/article/182504.htm
Dockerfile
Dockerfile是由一系列命令和参数构成的脚本,这些命令应用基于基础镜像并最终创建一个新的镜像。
1、对于开发人员,可以为开发团队提供一个完全一致的开发环境。
2、对于测试人员,可以直接拿开发时所构建的镜像或者通过Dockerfile文件构建一个新的镜像开始工作
3、对于运维人员,在部署时,可以实现应用的无缝移植。
-示例
在项目根目录创建Dockerfile文件
FROM python:3.4
WORKDIR /code
COPY requirements.txt ./
RUN pip install -r requirements.txt
#由于我们需要运行容器的时候,直接映射目录,所以不需要把app代码复制到容器中
#COPY . .
CMD ["gunicorn", "myapp:app","-c", "./gunicorn.conf"]
-说明
FROM 基础包
WORKDIR工作目录
COPY复制文件
RUN 创建镜像时(docker build)执行的命令,把一些依赖打包到镜像中,多个命令可以&&连接
CMD 启动容器时(docker run)执行的命令ps:由于我们需要运行容器的时候,直接映射目录,所以不需要把app代码复制到容器中,注释掉COPY. .
-资料
https://www.jianshu.com/p/c82c0f3681c4
https://cloud.tencent.com/developer/article/1595634
https://www.jianshu.com/p/eb4064392b3e
参考范例
-参考范例-基于镜像python:3.7
###宿主:关闭防火墙
#开机不启动防火墙
systemctl disable firewalld
#关闭防火墙
systemctl stop firewalld
###宿主:安装docker
yum install -y yum-utilsdevice-mapper-persistent-data lvm2
yum-config-manager --add-repohttp://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum makecache fast
yum install -y docker-ce-19.03.9docker-compose
### docker配置启动
#启动docker服务
systemctl start docker
#设置docker开机启动
systemctl enable docker
#查看docker服务状态
systemctl status docker.service
#启动docker服务
service docker start
###宿主:创建Flask项目
#创建项目路径
mkdir flasktest
#进入项目路径
cd flasktest
#创建Flask项目
vi app.py
# -*- coding:utf-8 -*-
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello, World!'
if __name__ == "__main__":
app.run()
###创建gunicorn配置文件
vi gun.conf
bind = '0.0.0.0:8001'
backlog = 512
timeout = 30
worker_class = 'gevent'
workers = 4
threads = 8
loglevel = 'info'
accesslog = "gunicorn_access.log"
errorlog = "gunicorn_error.log"
reload=True
###创建Dockerfile
vi Dockerfile
FROM python:3.7
MAINTAINER "xx<[email protected]>"
ENV PIPURL"https://repo.huaweicloud.com/repository/pypi/simple"
WORKDIR /flasktest
COPY . .
RUN pip --no-cache-dir install -i ${PIPURL} --upgrade pip
RUN pip --no-cache-dir install -i ${PIPURL} gunicorn flask gevent
CMD gunicorn -c gun.conf app:app
###创建Docker镜像
#构建docker镜像
docker build . -t=flask-test:latest
#查看docker镜像
docker images
#运行docker镜像
docker run -it -p 80:8001--name="flask-test" -d flask-test
###打包和迁移Docker镜像
#将docker镜像导出为静态文件
docker save flask-test:latest >flask-test.tar
#其他目标服务器:将静态文件还原为镜像,并导入docker
docker load < flask-test.tar
#其他目标服务器:运行docker镜像
docker run -it -p 80:8001--name="flask-test" -d flask-test
详细资料:
https://blog.csdn.net/mighty13/article/details/121586507
https://blog.csdn.net/EndTheme_Xin/article/details/90519975
https://blog.csdn.net/a1017938493/article/details/116211930
-参考范例-基于镜像centos:7
###宿主主机:关闭防火墙
# 开机不启动防火墙
systemctl disable firewalld
# 关闭防火墙
systemctl stop firewalld
###宿主主机:安装docker
yum install -y docker
#启动docker服务
systemctl start docker
#设置docker开机启动
systemctl enable docker
#查看docker服务状态
systemctl status docker.service
###宿主主机:拉取docker镜像
#拉去最新版本的centos镜像:docker里的centos是精简版的,docker里的系统镜像还有编程语言镜像是打包镜像的时候用的基础镜像,不自己打包镜像用不到,单独启动这类镜像会直接结束。
docker pull centos:7
#查看本地docker镜像
docker images
###docker容器:配置环境
#运行docker centos镜像
#-d:让容器在后台运行。
#--name:对容器的命名
#-P:将容器内部使用的网络端口映射到我们使用的主机上。
#-t:在新容器内指定一个伪终端或终端。
#-i:允许你对容器内的标准输入(STDIN) 进行交互。
#-p:绑定指定端口,-p指定要映射的端口,一个指定端口上只可以绑定一个容器,一个容器可以有多个指定端口;支持的格式如下:IP:HOSTPORT:CONTAINERPORT:指定ip、指定宿主机port、指定容器port
docker run -itd -p 8000:8000 --name centoscentos:7
###进入docker容器
docker attach centos
#安装 python依赖包
yum -y group install "Developmenttools"
yum -y install zlib-devel bzip2-developenssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-develdb4-devel libpcap-devel xz-devel libffi-devel
#下载安装wget
yum -y install wget
yum -y install setup
yum -y install perl
#下载python安装包
wget https://www.python.org/ftp/python/3.7.6/Python-3.7.6.tar.xz
#解压缩
tar -xvJf Python-3.7.6.tar.xz
#安装
#第一个指定安装的路径,不指定的话,安装过程中可能软件所需要的文件复制到其他不同目录,删除软件很不方便,复制软件也不方便. #第二个可以提高python10%-20%代码运行速度. #第三个是为了安装pip需要用到ssl,后面报错会有提到.
cd Python-3.7.6
./configure --prefix=/usr/local/python3--enable-optimizations --with-ssl
make && make install
#安装which
yum install which
#查看python 可执行文件的位置: /usr/bin/python
which python
#进行python版本备份
mv /usr/bin/python /usr/bin/python.bak
#确认目录下/usr/local/目录下就会有python3了。
ls /usr/local/python3/bin/
#创建软链接
ln -s /usr/local/python3/bin/python3/usr/bin/python
ln -s /usr/local/python3/bin/pip3/usr/bin/pip
ln -s /usr/local/python3/bin/gunicorn/usr/bin/gunicorn
#查看版本
python -V
python2 -V
#查看pip 版本
pip -V
#安装flask模块
pip install flask
#安装gunicorn +gevent
pip install gunicorn gevent
#编辑gunicorn配置文件
vi /gunicorn.conf
workers = 5 # 定义同时开启的处理请求的进程数量,根据网站流量适当调整
worker_class = "gevent" # 采用gevent库,支持异步处理请求,提高吞吐量
bind = "0.0.0.0:8000"
###退出docker
exit
###创建Flask项目
#将宿主文件拷贝到容器文件
docker cp /home/app.py centos:/
#重启docker容器
docker restart centos
#获取docker容器信息
docker ps -a
#进入容器-方式1
docker attach ContainerId
#进入容器-方式2
docker exec -it centos bash
#测试gunicorn geventflask
gunicorn app:app -c gunicorn.conf
#退出docker
exit
#重启docker
docker restart centos
###创建项目镜像
#基于容器的镜像保存
docker commit DockerName NewDockerName
#镜像备份
docker save -o NewDockerName.tarNewDockerName
#其他目标服务器:镜像恢复与迁移
docker load -i NewDockerName.tar
#关闭容器
docker stop DockerName
#删除容器
docker rm DockerName
#删除镜像
docker rmi DockerName:Version
详细资料:
https://blog.csdn.net/u011089760/article/details/90681807
https://cloud.tencent.com/developer/article/1595634
关键组件
-WSGI服务器
Web Server Gateway Interface 的缩写,即 Web 服务器网关接口。Python web开发中,服务端程序分为两个部分
服务器程序:用来接收、整理客户端发送的请求,比如Nginx
应用程序:处理服务器程序传递过来的请求,比如Flask,Django,Tornado
-Gunicorn
在开发时flask的run命令可以直接启动提供web服务,实际上是由Werkzeug提供的WSGI服务器,相当于Flask内置了一个WSGI服务器,只适合在开发调试的时候使用;在生产环境中需要一个更强健,性能更高的WSGI服务器,WSGI服务器也被称为独立的WSGI容器,主流的WSGI容器有Gunicorn和uWSGI
-Nginx
Nginx是Web服务器,流行的Web服务器还有Apache,Tengine等,Web服务器主要负责和客户端交换数据,处理请求和响应,像Gunicorn这类WSGI服务器内置了Web服务器,但是内置的Web服务器不够强健,更流行的部署方式是采用一个常规的Web服务器运行在前端,为WSGI服务器提供反向代理。在Gunicorn之后再加一层Nginx有以下好处:
负载均衡: 当有多个应用多台机器时需要做负载均衡
静态文件处理:经过配置之后,Nginx可以直接处理静态文件请求而不用经过Python服务器,Gunicorn或者Flask等对静态资源的处理效率不如Nginx,并且Nginx可以对静态文件设置缓存
安全问题:Gunicorn暴露在公网公网十分危险,在Nginx挡在前面会安全不少
抗并发压力:前端多一层Nginx,可以吸收一些瞬时的并发请求作为请求缓冲,让Nginx先保持住连接,然后后端慢慢消化
支持的http协议更广:gunicorn的http解析可能有bug,Nginx处理更好
提供其他额外功能:比如IP过滤等
-gevent
gevent:是一个基于协程的python网络库,在遇到IO阻塞时,程序会自动进行切换,可以让开发者用同步的方式写异步IO代码。
协程:是单线程下的并发,又称微线程,是一种并发编程模式,协程并发的本质是切换+保存状态。
参考资料
https://www.ruanyifeng.com/blog/2018/02/docker-tutorial.html
https://www.cnblogs.com/wholj/p/10551999.html
https://www.zhihu.com/question/402716284
https://blog.csdn.net/u011089760/article/details/90681807
https://www.csdn.net/tags/NtzaMgysODc3MC1ibG9n.html
https://www.imooc.com/article/317550
https://blog.csdn.net/qq_39146974/article/details/107715964
Centos7 安装Python3.6+Nginx+Gunicorn+Flask
https://www.58jb.com/html/175.html
https://blog.csdn.net/make_progress/article/details/107210315
Flask服务器部署:使用Docker+Gunicorn+gevent+Nginx部署Flask应用
https://www.jianshu.com/p/df77fe3bea24
Centos 7 Docker容器运行RabbitMQ出现WARNING: IPv4 forwarding is disabled. Networking will not work.
https://blog.csdn.net/qq_44241551/article/details/104574538