vlambda博客
学习文章列表

#网络后台开发#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