<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          #網(wǎng)絡(luò)后臺(tái)開發(fā)#Docker

          共 7768字,需瀏覽 16分鐘

           ·

          2022-04-16 11:05

          -Start:關(guān)注本公眾號(hào)后,可直接聯(lián)系后臺(tái)獲取排版美化的詳細(xì)文檔!

          -Hints:本篇文章所編纂的資料均來自網(wǎng)絡(luò),特此感謝參與奉獻(xiàn)的有關(guān)人員。


          項(xiàng)目移植

          -代碼移植的問題

          運(yùn)行平臺(tái)的特異性,操作系統(tǒng)的設(shè)置,各種庫和組件的安裝會(huì)影響軟件的運(yùn)行。

          ?-代碼移植的方法

          1 虛擬機(jī):可以在一種操作系統(tǒng)里面運(yùn)行另一種操作系統(tǒng)

          缺陷:

          1 資源占用多

          2 冗余步驟多

          3 啟動(dòng)慢

          2 Linux容器:Linux 容器不是模擬一個(gè)完整的操作系統(tǒng),而是對(duì)進(jìn)程進(jìn)行隔離。對(duì)于容器里面的進(jìn)程來說,它接觸到的各種資源都是虛擬的,從而實(shí)現(xiàn)與底層系統(tǒng)的隔離。

          優(yōu)勢(shì):

          1 啟動(dòng)快

          2 資源占用少

          3 體積小

          ?



          Docker

          Docker 將應(yīng)用程序與該程序的依賴,打包在一個(gè)文件里面。運(yùn)行這個(gè)文件,就會(huì)生成一個(gè)虛擬容器。程序在這個(gè)虛擬容器里運(yùn)行,就好像在真實(shí)的物理機(jī)上運(yùn)行一樣。

          -用途:

          (1)提供一次性的環(huán)境。比如,本地測(cè)試他人的軟件、持續(xù)集成的時(shí)候提供單元測(cè)試和構(gòu)建的環(huán)境。

          (2)提供彈性的云服務(wù)。因?yàn)镈ocker 容器可以隨開隨關(guān),很適合動(dòng)態(tài)擴(kuò)容和縮容。

          (3)組建微服務(wù)架構(gòu)。通過多個(gè)容器,一臺(tái)機(jī)器可以跑多個(gè)服務(wù),因此在本機(jī)就可以模擬出微服務(wù)架構(gòu)。

          -類型:

          鏡像是容器啟動(dòng)的基礎(chǔ),它包含了容器運(yùn)行所需的所有基本文件和配置信息,通俗地說,就是只讀文件和文件夾的組合。 在docker里,一切都是以鏡像為基礎(chǔ)的,鏡像是Docker容器啟動(dòng)的先決條件。

          在 Docker 運(yùn)行容器之前,本地需要存在對(duì)應(yīng)的鏡像。 如果本地沒有對(duì)應(yīng)的鏡像,Docker會(huì)嘗試從默認(rèn)鏡像倉(cāng)庫下載。

          ?-指令

          #查看拉取的鏡像

          docker images

          #查看docker正在運(yùn)行的實(shí)例

          docker ps

          #查看docker所有的實(shí)例

          docker ps -a

          #關(guān)閉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是由一系列命令和參數(shù)構(gòu)成的腳本,這些命令應(yīng)用基于基礎(chǔ)鏡像并最終創(chuàng)建一個(gè)新的鏡像。

          1、對(duì)于開發(fā)人員,可以為開發(fā)團(tuán)隊(duì)提供一個(gè)完全一致的開發(fā)環(huán)境。

          2、對(duì)于測(cè)試人員,可以直接拿開發(fā)時(shí)所構(gòu)建的鏡像或者通過Dockerfile文件構(gòu)建一個(gè)新的鏡像開始工作

          3、對(duì)于運(yùn)維人員,在部署時(shí),可以實(shí)現(xiàn)應(yīng)用的無縫移植。

          -示例

          在項(xiàng)目根目錄創(chuàng)建Dockerfile文件

          FROM python:3.4

          WORKDIR /code

          COPY requirements.txt ./

          RUN pip install -r requirements.txt

          #由于我們需要運(yùn)行容器的時(shí)候,直接映射目錄,所以不需要把a(bǔ)pp代碼復(fù)制到容器中

          #COPY . .

          CMD ["gunicorn", "myapp:app","-c", "./gunicorn.conf"]

          -說明

          FROM 基礎(chǔ)包
          WORKDIR工作目錄
          COPY復(fù)制文件
          RUN 創(chuàng)建鏡像時(shí)(docker build)執(zhí)行的命令,把一些依賴打包到鏡像中,多個(gè)命令可以&&連接
          CMD 啟動(dòng)容器時(shí)(docker run)執(zhí)行的命令ps:由于我們需要運(yùn)行容器的時(shí)候,直接映射目錄,所以不需要把a(bǔ)pp代碼復(fù)制到容器中,注釋掉COPY. .

          -資料

          https://www.jianshu.com/p/c82c0f3681c4
          https://cloud.tencent.com/developer/article/1595634

          https://www.jianshu.com/p/eb4064392b3e


          參考范例

          -參考范例-基于鏡像python:3.7

          ###宿主:關(guān)閉防火墻

          #開機(jī)不啟動(dòng)防火墻

          systemctl disable firewalld

          #關(guān)閉防火墻???

          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配置啟動(dòng)

          #啟動(dòng)docker服務(wù)

          systemctl start docker

          #設(shè)置docker開機(jī)啟動(dòng)

          systemctl enable docker

          #查看docker服務(wù)狀態(tài)

          systemctl status docker.service

          #啟動(dòng)docker服務(wù)

          service docker start

          ?

          ###宿主:創(chuàng)建Flask項(xiàng)目

          #創(chuàng)建項(xiàng)目路徑

          mkdir flasktest

          #進(jìn)入項(xiàng)目路徑

          cd flasktest

          #創(chuàng)建Flask項(xiàng)目

          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()

          ?

          ###創(chuàng)建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

          ?

          ###創(chuàng)建Dockerfile

          vi Dockerfile

          FROM python:3.7

          MAINTAINER "xx"

          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

          ?

          ###創(chuàng)建Docker鏡像

          #構(gòu)建docker鏡像

          docker build . -t=flask-test:latest

          #查看docker鏡像

          docker images

          #運(yùn)行docker鏡像

          docker run -it -p 80:8001--name="flask-test" -d flask-test

          ?

          ###打包和遷移Docker鏡像

          #將docker鏡像導(dǎo)出為靜態(tài)文件

          docker save flask-test:latest >flask-test.tar

          #其他目標(biāo)服務(wù)器:將靜態(tài)文件還原為鏡像,并導(dǎo)入docker

          docker load < flask-test.tar

          #其他目標(biāo)服務(wù)器:運(yùn)行docker鏡像

          docker run -it -p 80:8001--name="flask-test" -d flask-test

          ?

          詳細(xì)資料:

          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

          ###宿主主機(jī):關(guān)閉防火墻

          # 開機(jī)不啟動(dòng)防火墻

          systemctl disable firewalld

          # 關(guān)閉防火墻???

          systemctl stop firewalld???

          ?

          ###宿主主機(jī):安裝docker

          yum install -y docker

          #啟動(dòng)docker服務(wù)

          systemctl start docker

          #設(shè)置docker開機(jī)啟動(dòng)

          systemctl enable docker

          #查看docker服務(wù)狀態(tài)

          systemctl status docker.service

          ?

          ###宿主主機(jī):拉取docker鏡像

          #拉去最新版本的centos鏡像:docker里的centos是精簡(jiǎn)版的,docker里的系統(tǒng)鏡像還有編程語言鏡像是打包鏡像的時(shí)候用的基礎(chǔ)鏡像,不自己打包鏡像用不到,單獨(dú)啟動(dòng)這類鏡像會(huì)直接結(jié)束。

          docker pull centos:7

          #查看本地docker鏡像

          docker images

          ?

          ###docker容器:配置環(huán)境

          #運(yùn)行docker centos鏡像

          #-d:讓容器在后臺(tái)運(yùn)行。

          #--name:對(duì)容器的命名

          #-P:將容器內(nèi)部使用的網(wǎng)絡(luò)端口映射到我們使用的主機(jī)上。

          #-t:在新容器內(nèi)指定一個(gè)偽終端或終端。

          #-i:允許你對(duì)容器內(nèi)的標(biāo)準(zhǔn)輸入(STDIN) 進(jìn)行交互。

          #-p:綁定指定端口,-p指定要映射的端口,一個(gè)指定端口上只可以綁定一個(gè)容器,一個(gè)容器可以有多個(gè)指定端口;支持的格式如下:IP:HOSTPORT:CONTAINERPORT:指定ip、指定宿主機(jī)port、指定容器port

          docker run -itd -p 8000:8000 --name centoscentos:7

          ###進(jìn)入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

          #安裝

          #第一個(gè)指定安裝的路徑,不指定的話,安裝過程中可能軟件所需要的文件復(fù)制到其他不同目錄,刪除軟件很不方便,復(fù)制軟件也不方便. #第二個(gè)可以提高python10%-20%代碼運(yùn)行速度. #第三個(gè)是為了安裝pip需要用到ssl,后面報(bào)錯(cuò)會(huì)有提到.

          cd Python-3.7.6

          ./configure --prefix=/usr/local/python3--enable-optimizations --with-ssl

          make && make install

          #安裝which

          yum install which

          #查看python 可執(zhí)行文件的位置: /usr/bin/python

          which python

          #進(jìn)行python版本備份

          mv /usr/bin/python /usr/bin/python.bak

          #確認(rèn)目錄下/usr/local/目錄下就會(huì)有python3了。

          ls /usr/local/python3/bin/

          #創(chuàng)建軟鏈接

          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??? # 定義同時(shí)開啟的處理請(qǐng)求的進(jìn)程數(shù)量,根據(jù)網(wǎng)站流量適當(dāng)調(diào)整

          worker_class = "gevent"?? # 采用gevent庫,支持異步處理請(qǐng)求,提高吞吐量

          bind = "0.0.0.0:8000"

          ###退出docker

          exit

          ?

          ###創(chuàng)建Flask項(xiàng)目

          #將宿主文件拷貝到容器文件

          docker cp /home/app.py? centos:/

          #重啟docker容器

          docker restart centos

          #獲取docker容器信息

          docker ps -a

          #進(jìn)入容器-方式1

          docker attach ContainerId

          #進(jìn)入容器-方式2

          docker exec -it centos bash

          #測(cè)試gunicorn geventflask

          gunicorn app:app -c gunicorn.conf

          #退出docker

          exit

          #重啟docker

          docker restart centos

          ?

          ###創(chuàng)建項(xiàng)目鏡像

          #基于容器的鏡像保存

          docker commit DockerName NewDockerName

          #鏡像備份

          docker save -o NewDockerName.tarNewDockerName

          #其他目標(biāo)服務(wù)器:鏡像恢復(fù)與遷移

          docker load -i NewDockerName.tar

          ?

          #關(guān)閉容器

          docker stop DockerName

          #刪除容器

          docker rm DockerName

          #刪除鏡像

          docker rmi DockerName:Version

          ?

          詳細(xì)資料:

          https://blog.csdn.net/u011089760/article/details/90681807

          https://cloud.tencent.com/developer/article/1595634

          ?

          關(guān)鍵組件

          -WSGI服務(wù)器

          Web Server Gateway Interface 的縮寫,即 Web 服務(wù)器網(wǎng)關(guān)接口。Python web開發(fā)中,服務(wù)端程序分為兩個(gè)部分

          服務(wù)器程序:用來接收、整理客戶端發(fā)送的請(qǐng)求,比如Nginx

          應(yīng)用程序:處理服務(wù)器程序傳遞過來的請(qǐng)求,比如Flask,Django,Tornado

          -Gunicorn

          在開發(fā)時(shí)flask的run命令可以直接啟動(dòng)提供web服務(wù),實(shí)際上是由Werkzeug提供的WSGI服務(wù)器,相當(dāng)于Flask內(nèi)置了一個(gè)WSGI服務(wù)器,只適合在開發(fā)調(diào)試的時(shí)候使用;在生產(chǎn)環(huán)境中需要一個(gè)更強(qiáng)健,性能更高的WSGI服務(wù)器,WSGI服務(wù)器也被稱為獨(dú)立的WSGI容器,主流的WSGI容器有Gunicorn和uWSGI
          -Nginx

          Nginx是Web服務(wù)器,流行的Web服務(wù)器還有Apache,Tengine等,Web服務(wù)器主要負(fù)責(zé)和客戶端交換數(shù)據(jù),處理請(qǐng)求和響應(yīng),像Gunicorn這類WSGI服務(wù)器內(nèi)置了Web服務(wù)器,但是內(nèi)置的Web服務(wù)器不夠強(qiáng)健,更流行的部署方式是采用一個(gè)常規(guī)的Web服務(wù)器運(yùn)行在前端,為WSGI服務(wù)器提供反向代理。在Gunicorn之后再加一層Nginx有以下好處:

          負(fù)載均衡: 當(dāng)有多個(gè)應(yīng)用多臺(tái)機(jī)器時(shí)需要做負(fù)載均衡

          靜態(tài)文件處理:經(jīng)過配置之后,Nginx可以直接處理靜態(tài)文件請(qǐng)求而不用經(jīng)過Python服務(wù)器,Gunicorn或者Flask等對(duì)靜態(tài)資源的處理效率不如Nginx,并且Nginx可以對(duì)靜態(tài)文件設(shè)置緩存

          安全問題:Gunicorn暴露在公網(wǎng)公網(wǎng)十分危險(xiǎn),在Nginx擋在前面會(huì)安全不少

          抗并發(fā)壓力:前端多一層Nginx,可以吸收一些瞬時(shí)的并發(fā)請(qǐng)求作為請(qǐng)求緩沖,讓Nginx先保持住連接,然后后端慢慢消化

          支持的http協(xié)議更廣:gunicorn的http解析可能有bug,Nginx處理更好

          提供其他額外功能:比如IP過濾等

          -gevent

          gevent:是一個(gè)基于協(xié)程的python網(wǎng)絡(luò)庫,在遇到IO阻塞時(shí),程序會(huì)自動(dòng)進(jìn)行切換,可以讓開發(fā)者用同步的方式寫異步IO代碼。
          協(xié)程:是單線程下的并發(fā),又稱微線程,是一種并發(fā)編程模式,協(xié)程并發(fā)的本質(zhì)是切換+保存狀態(tài)。

          ?

          參考資料

          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服務(wù)器部署:使用Docker+Gunicorn+gevent+Nginx部署Flask應(yīng)用

          https://www.jianshu.com/p/df77fe3bea24

          Centos 7 Docker容器運(yùn)行RabbitMQ出現(xiàn)WARNING: IPv4 forwarding is disabled. Networking will not work.

          https://blog.csdn.net/qq_44241551/article/details/104574538

          公眾號(hào)二維碼

          End:如果有興趣了解量化交易、數(shù)據(jù)分析和互聯(lián)網(wǎng)+的實(shí)用技術(shù),歡迎關(guān)注本公眾號(hào)

          瀏覽 61
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  小宝精品一区二区三区 | 麻豆AV无码精品一区二区色欲 | 新天堂AV | 播五月婷婷 | 日本一级一片免费视频 |