成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專(zhuān)欄INFORMATION COLUMN

Docker部署基于Nodejs的Web應(yīng)用-實(shí)戰(zhàn)篇

mikasa / 1767人閱讀

摘要:采用虛擬化的技術(shù)來(lái)虛擬化出應(yīng)用程序的運(yùn)行環(huán)境。安裝成功后,可以通過(guò)查看版本號(hào)盡量使用最新的穩(wěn)定版本。是鏡像名,是鏡像的版本號(hào),到此你已經(jīng)成功構(gòu)建了一個(gè)新的鏡像,你可以通過(guò),查看你的鏡像。部署時(shí)將此文件到生產(chǎn)環(huán)境服務(wù)器上。

Docker

docker是一個(gè)開(kāi)源的應(yīng)用容器引擎,可以為我們提供安全、可移植、可重復(fù)的自動(dòng)化部署的方式。docker采用虛擬化的技術(shù)來(lái)虛擬化出應(yīng)用程序的運(yùn)行環(huán)境。此種方式具有以下優(yōu)勢(shì):

每個(gè)部署的應(yīng)用程序都是一個(gè)容器,彼此隔離,互不影響;

服務(wù)器只需要安裝docker即可運(yùn)行構(gòu)建好的應(yīng)用程序鏡像,不會(huì)涉及復(fù)雜的服務(wù)器環(huán)境配置,因?yàn)榕渲枚荚谔囟ǖ膽?yīng)用程序所在的鏡像中去配置即可;

簡(jiǎn)化了自動(dòng)化部署和運(yùn)維的繁瑣流程,只需將構(gòu)建好的鏡像load到服務(wù)器的docker中即可運(yùn)行我們的應(yīng)用程序;

可以充分利用服務(wù)器的系統(tǒng)資源,一臺(tái)服務(wù)器上可以同時(shí)運(yùn)行多個(gè)容器;

docker采用的是c/s架構(gòu),Client通過(guò)接口與Server進(jìn)程通信實(shí)現(xiàn)容器的構(gòu)建,運(yùn)行和發(fā)布。docker比較重要的三個(gè)核心概念如下:

鏡像(images):一個(gè)只讀的模板,可以理解為應(yīng)用程序的運(yùn)行環(huán)境,包含了程序運(yùn)行所依賴(lài)的環(huán)境和基本配置,鏡像可以按照層級(jí)(從基礎(chǔ)鏡像開(kāi)始)來(lái)構(gòu)建,每一層包含特定的環(huán)境。

倉(cāng)庫(kù)(repository):一個(gè)用于存放鏡像文件的倉(cāng)庫(kù),如果你對(duì)git的倉(cāng)庫(kù)熟悉,應(yīng)該很容易理解,對(duì),就是那個(gè)。有私有倉(cāng)庫(kù)和公有倉(cāng)庫(kù)之分。

容器(container):一個(gè)運(yùn)行應(yīng)用程序的虛擬容器,在我們運(yùn)行鏡像時(shí)產(chǎn)生。容器包含自己的文件系統(tǒng)+隔離的進(jìn)程空間和包含其中的進(jìn)程。

前言

sharplook是一款通過(guò)大數(shù)據(jù)分析來(lái)解決客戶在監(jiān)控系統(tǒng)中存在的數(shù)據(jù)采集難、解析難、處理難的IT運(yùn)維產(chǎn)品。在給客戶部署產(chǎn)品的過(guò)程中涉及到比較多的環(huán)境配置和組件安裝以及復(fù)雜的依賴(lài)項(xiàng),這些繁瑣的流程降低了安裝部署的效率和產(chǎn)品質(zhì)量?;诖耍覀冮_(kāi)發(fā)了一款可以快速便捷的安裝部署套件,提供一種漂亮的安裝部署流程。產(chǎn)品采用 Nuxt + Koa 的基礎(chǔ)架構(gòu)進(jìn)行開(kāi)發(fā),其中采用nuxt來(lái)提供SSR(服務(wù)端渲染)功能,Nuxt.js是基于Vue.js的通用架構(gòu),其中集成了以下組件:

Vue2

Vue-Router

Vuex

Vue-Meta

另外,Nuxt.js 使用 Webpack 和 vue-loader 、 babel-loader 來(lái)處理代碼的自動(dòng)化構(gòu)建工作(如打包、代碼分層、壓縮等等)。

我們項(xiàng)目使用Nuxt.js作為中間件來(lái)進(jìn)行UI渲染,使用Koa啟動(dòng)我們自己的服務(wù)器,koa2 是由 Express 原班人馬打造的,致力于成為一個(gè)更小、更富有表現(xiàn)力、更健壯的 Web 框架。

關(guān)于如何快速搭建這樣一個(gè)項(xiàng)目,小生之前在《vue-cli “從入門(mén)到放棄”》中介紹過(guò)vue-cli的使用,這個(gè)項(xiàng)目我們通過(guò)vue-cli工具,使用 nuxt-community/koa-template 模板,vue init nuxt-community/koa-template快速構(gòu)建出來(lái)。具體的代碼邏輯,在此不做贅述。

關(guān)于為什么選擇docker來(lái)部署我們的node服務(wù),前面已經(jīng)介紹了,我們基于node的web應(yīng)用涉及到的部署環(huán)境并不復(fù)雜,僅僅需要Node.js作為平臺(tái)即可,由于依賴(lài)的包文件太多,而且比較大,業(yè)界還沒(méi)有特別好用的開(kāi)源node打包工具。做前端的同學(xué)都知道,webpack是一個(gè)功能強(qiáng)大的資源加載構(gòu)建的打包工具,只需要將項(xiàng)目文件打包到一個(gè)dist文件下,打包后的文件體量小,解決了文件之間的依賴(lài)問(wèn)題,提取出公共代碼庫(kù),生產(chǎn)環(huán)境只需要部署dist文件夾即可。然而,Nodejs程序涉及到的依賴(lài)包,和資源卻沒(méi)法進(jìn)行打包,node服務(wù)開(kāi)啟后僅僅是一個(gè)node進(jìn)程而已。那么我們?nèi)绾尾渴餹ode程序呢?既然沒(méi)法打包,只能將其全部文件進(jìn)行部署(雖然可能存在別的問(wèn)題,小生也在研究中,大神可以給點(diǎn)建議),于是小生就希望將其放入docker中去部署,免去生產(chǎn)環(huán)境node版本不一致等問(wèn)題。下面小生就將如何用docker來(lái)部署Node項(xiàng)目的過(guò)程分享給諸位。

實(shí)戰(zhàn)

以下將進(jìn)入戰(zhàn)備狀態(tài),請(qǐng)同志們準(zhǔn)備好大腦和電腦,跟著我左手、右手一個(gè)慢動(dòng)作。

環(huán)境準(zhǔn)備

安裝docker,未安裝的同學(xué),請(qǐng)根據(jù)自己的開(kāi)發(fā)環(huán)境采用不同的安裝方式去安裝,具體操作參考教程,不做贅述。

安裝成功后,可以通過(guò)docker -v查看版本號(hào)(盡量使用最新的穩(wěn)定版本)。

項(xiàng)目準(zhǔn)備

在你的項(xiàng)目根目錄下,添加Dockerfile文件,此文件用來(lái)配置我們自定義一個(gè)鏡像所需要指定的依賴(lài)項(xiàng)、環(huán)境以及執(zhí)行的命令等。內(nèi)容格式如下:

 # 指定我們的基礎(chǔ)鏡像是node,版本是v8.0.0
 FROM node:8.0.0
 # 指定制作我們的鏡像的聯(lián)系人信息(鏡像創(chuàng)建者)
 MAINTAINER EOI
 
 # 將根目錄下的文件都copy到container(運(yùn)行此鏡像的容器)文件系統(tǒng)的app文件夾下
 ADD . /app/
 # cd到app文件夾下
 WORKDIR /app
 
 # 安裝項(xiàng)目依賴(lài)包
 RUN npm install
 RUN npm rebuild node-sass --force
 
 # 配置環(huán)境變量
 ENV HOST 0.0.0.0
 ENV PORT 8000
 
 # 容器對(duì)外暴露的端口號(hào)
 EXPOSE 8000
 
 # 容器啟動(dòng)時(shí)執(zhí)行的命令,類(lèi)似npm run start
 CMD ["npm", "start"]

關(guān)于Dockerfile文件中的關(guān)鍵字,解釋如下:

FROM

語(yǔ)法:FROM [:]
解釋?zhuān)涸O(shè)置要制作的鏡像基于哪個(gè)鏡像,F(xiàn)ROM指令必須是整個(gè)Dockerfile的第一個(gè)指令,如果指定的鏡像不存在默認(rèn)會(huì)自動(dòng)從Docker Hub上下載。

MAINTAINER

語(yǔ)法:MAINTAINER 
解釋?zhuān)篗AINTAINER指令允許你給將要制作的鏡像設(shè)置作者信息。

ADD

語(yǔ)法:ADD  
解釋?zhuān)篈DD指令用于從指定路徑拷貝一個(gè)文件或目錄到容器的指定路徑中,是一個(gè)文件或目錄的路徑,也可以是一個(gè)url,路徑是相對(duì)于該Dockerfile文件所在位置的相對(duì)路徑,是目標(biāo)容器的一個(gè)絕對(duì)路徑。

WORKDIR

 語(yǔ)法:WORKDIR /path/to/workdir
 解釋?zhuān)篧ORKDIR指令用于設(shè)置Dockerfile中的RUN、CMD和ENTRYPOINT指令執(zhí)行命令的工作目錄(默認(rèn)為/目錄),該指令在Dockerfile文件中可以出現(xiàn)多次,如果使用相對(duì)路徑則為相對(duì)于WORKDIR上一次的值,例如WORKDIR /data,WORKDIR logs,RUN pwd最終輸出的當(dāng)前目錄是/data/logs。

RUN

 語(yǔ)法:① RUN    #將會(huì)調(diào)用/bin/sh -c 
      ② RUN ["executable", "param1", "param2"] #將會(huì)調(diào)用exec執(zhí)行,以避免有些時(shí)候shell方式執(zhí)行時(shí)的傳遞參數(shù)問(wèn)題,而且有些基礎(chǔ)鏡像可能不包含/bin/sh
 解釋?zhuān)篟UN指令會(huì)在一個(gè)新的容器中執(zhí)行任何命令,然后把執(zhí)行后的改變提交到當(dāng)前鏡像,提交后的鏡像會(huì)被用于Dockerfile中定義的下一步操作,RUN中定義的命令會(huì)按順序執(zhí)行并提交,這正是Docker廉價(jià)的提交和可以基于鏡像的任何一個(gè)歷史點(diǎn)創(chuàng)建容器的好處,就像版本控制工具一樣。

ENV

 語(yǔ)法:ENV  
 解釋?zhuān)篍NV指令用于設(shè)置環(huán)境變量,在Dockerfile中這些設(shè)置的環(huán)境變量也會(huì)影響到RUN指令,當(dāng)運(yùn)行生成的鏡像時(shí)這些環(huán)境變量依然有效,如果需要在運(yùn)行時(shí)更改這些環(huán)境變量可以在運(yùn)行docker run時(shí)添加–env =參數(shù)來(lái)修改。
 注意:最好不要定義那些可能和系統(tǒng)預(yù)定義的環(huán)境變量沖突的名字,否則可能會(huì)產(chǎn)生意想不到的結(jié)果。

EXPOSE

語(yǔ)法:EXPOSE  [ ...]
解釋?zhuān)篍XPOSE指令用來(lái)告訴Docker這個(gè)容器在運(yùn)行時(shí)會(huì)監(jiān)聽(tīng)哪些端口,Docker在連接不同的容器(使用–link參數(shù))時(shí)使用這些信息。

CMD

語(yǔ)法: ① CMD ["executable", "param1", "param2"]    #將會(huì)調(diào)用exec執(zhí)行,首選方式
      ② CMD ["param1", "param2"]        #當(dāng)使用ENTRYPOINT指令時(shí),為該指令傳遞默認(rèn)參數(shù)
      ③ CMD  [ | ]        #將會(huì)調(diào)用/bin/sh -c執(zhí)行
解釋?zhuān)篊MD指令中指定的命令會(huì)在鏡像運(yùn)行時(shí)執(zhí)行,在Dockerfile中只能存在一個(gè),如果使用了多個(gè)CMD指令,則只有最后一個(gè)CMD指令有效。當(dāng)出現(xiàn)ENTRYPOINT指令時(shí),CMD中定義的內(nèi)容會(huì)作為ENTRYPOINT指令的默認(rèn)參數(shù),也就是說(shuō)可以使用CMD指令給ENTRYPOINT傳遞參數(shù)。
注意:RUN和CMD都是執(zhí)行命令,他們的差異在于RUN中定義的命令會(huì)在執(zhí)行docker build命令創(chuàng)建鏡像時(shí)執(zhí)行,而CMD中定義的命令會(huì)在執(zhí)行docker run命令運(yùn)行鏡像時(shí)執(zhí)行,另外使用第一種語(yǔ)法也就是調(diào)用exec執(zhí)行時(shí),命令必須為絕對(duì)路徑。

其中還有其他的一些關(guān)鍵字:USER、ENTRYPOINT、VOLUME、ONBUILD等,如果你有興趣可以自行研究。

在項(xiàng)目根目錄下添加.dockerignore文件,此文件的作用類(lèi)似.gitignore文件,可以忽略掉添加進(jìn)鏡像中的文件,寫(xiě)法、格式和.gitignore一樣,一行代表一個(gè)忽略。本項(xiàng)目添加的忽略如下:

  .DS_Store
  npm-debug.log*
  selenium-debug.log
  .nuxt/
  /package-lock.json
  *.tar
  *.md

  # Editor directories and files
  .idea
  *.suo
  *.ntvs*
  *.njsproj
  *.sln

構(gòu)建鏡像

查看目前本地docker的鏡像

> docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
  

cd 到項(xiàng)目根目錄下,執(zhí)行以下命令

> docker build -t deploy:1.0 .

    Sending build context to Docker daemon  1.436GB
  .... 此處省略1000個(gè)字符。
  Successfully built d8f0875e967b
  Successfully tagged deploy:1.0

deploy是鏡像名,1.0是鏡像的版本號(hào),到此你已經(jīng)成功構(gòu)建了一個(gè)新的鏡像,你可以通過(guò)docker images,查看你的鏡像。

> docker images
 REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
 deploy              1.0                 d8f0875e967b        3 minutes ago        2.11GB

啟動(dòng)鏡像,測(cè)試是否成功。

> docker run -d -p 9000:8000 deploy:1.0
8aec5ee037bb253901d2c2e02c7be546580546c493576139f3789fb660f3401d

> docker ps -a
CONTAINER ID    IMAGE        COMMAND          CREATED           STATUS         PORTS                  NAMES
8aec5ee037bb    deploy:1.0   "npm start"     57 seconds ago    Up 56 seconds  0.0.0.0:9000->8000/tcp amazing_bassi

docker run -d -p 9000:8000 deploy:1.0-d表示后臺(tái)運(yùn)行,-p 9000:8000表示指定本地的9000端口隱射到容器內(nèi)的8000端口。 deploy:1.0為我們要運(yùn)行的鏡像。通過(guò)docker ps -a查看docker的進(jìn)程(容器的運(yùn)行本身就是一種特殊的進(jìn)程)運(yùn)行情況,發(fā)現(xiàn)我們的容器已經(jīng)在運(yùn)行。本地可以訪問(wèn)localhost:9000。

通過(guò)docker logs可以查看我們?nèi)萜鲀?nèi)應(yīng)用進(jìn)程的運(yùn)行日志。docker logs

> docker logs 8aec5ee037bb
  npm info it worked if it ends with ok
  npm info using npm@5.0.0
  npm info using node@v8.0.0
  npm info lifecycle newlook-deploy@1.0.0~prestart: newlook-deploy@1.0.0
  npm info lifecycle newlook-deploy@1.0.0~start: newlook-deploy@1.0.0
  
  > newlook-deploy@1.0.0 start /app
  > node ./server/index.js
  
  Server listening on 0.0.0.0:8000
   DONE  Compiled successfully in 9310ms06:55:56
  
  > Open http://0.0.0.0:8000
 docker stop 可以停止容器運(yùn)行

 docker start 可以啟動(dòng)容器運(yùn)行

 docker restart 可以重啟容器

 docker rm  -f可以強(qiáng)制刪除在運(yùn)行的容器

上傳鏡像(這里用上傳到公共倉(cāng)庫(kù)來(lái)演示)

沒(méi)注冊(cè)DockerHub的同學(xué),請(qǐng)注冊(cè)DockerHub

登錄docker

> docker login
Username: XXX
Password: XXX
Login Succeeded

docker tag /上傳之前必須給鏡像打上tag,namespace可以指定為你的docker Id

> docker tag deploy:1.0 lzqs/deploy:1.0

docker push /將鏡像上傳至docker的公共倉(cāng)庫(kù)

> docker push lzqs/deploy:1.0

上傳成功后,docker logout 退出,登錄 https://hub.docker.com/ 查看上傳的鏡像。

下載鏡像

通過(guò)docker pull /下載我們的鏡像。

> docker pull lzqs/deploy:1.0

生產(chǎn)部署

前面說(shuō)了,我們可以將上傳到倉(cāng)庫(kù)的鏡像下載下來(lái)部署,但是如果鏡像比較大或者部署環(huán)境壓根無(wú)法聯(lián)網(wǎng),你是不是要跪了。所以我們采取另一種方法,將開(kāi)發(fā)好的鏡像直接打包保存到安裝盤(pán)里面,到客戶生產(chǎn)環(huán)境再將鏡像包上傳并加載到服務(wù)器的docker中即可。

在開(kāi)發(fā)環(huán)境打包,docker save / .tar

> docker save lzqs/deploy:1.0 > deploy.tar

這里ls會(huì)發(fā)現(xiàn)目錄下生成了deploy.tar的文件。部署時(shí)將此文件copy到生產(chǎn)環(huán)境服務(wù)器上。

確保生產(chǎn)服務(wù)器上已經(jīng)安裝了docker,若沒(méi)裝,請(qǐng)參考相關(guān)文檔,若不裝,對(duì)不起小生也無(wú)力了,然后在服務(wù)器上加載上傳的鏡像包deploy.tar。

 > docker load < deploy.tar

  007ab444b234: Loading layer [==================================================>] 129.3 MB/129.3 MB
  4902b007e6a7: Loading layer [==================================================>] 45.45 MB/45.45 MB
  bb07d0c1008d: Loading layer [==================================================>] 126.8 MB/126.8 MB
  ecf5c2e2468e: Loading layer [==================================================>] 326.6 MB/326.6 MB
  7b3b4fef39c1: Loading layer [==================================================>] 352.3 kB/352.3 kB
  677f02386f07: Loading layer [==================================================>] 137.2 kB/137.2 kB
  7333bb4665b8: Loading layer [==================================================>] 55.66 MB/55.66 MB
  e292e64ffb88: Loading layer [==================================================>] 3.757 MB/3.757 MB
  ee76d0e6f6d9: Loading layer [==================================================>] 1.436 GB/1.436 GB
  33dca533c6e5: Loading layer [==================================================>] 331.8 kB/331.8 kB
  24630015679d: Loading layer [==================================================>] 35.18 MB/35.18 MB
  Loaded image: lzqs/deploy:1.0

加載成功后,docker images即可看到加載的鏡像

> docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
lzqs/deploy         1.0                 d8f0875e967b        About an hour ago   2.115 GB

運(yùn)行lzqs/deploy鏡像,成功后,在外部訪問(wèn)服務(wù)器的9000端口, <服務(wù)器的IP>:9000

> docker run -d -p 9000:8000 lzqs/deploy
1d0db9a5d0c8826171e501b0e86afd444fca8144b1105e63dae8d621bdda7a77

> docker ps -a
CONTAINER ID  IMAGE           COMMAND      CREATED              STATUS             PORTS                    NAMES
1d0db9a5d0c8  lzqs/deploy:1.0 "npm start"  About a minute ago   Up About a minute  0.0.0.0:9000->8000/tcp goofy_curran

docker exec -it /bin/bash 可以進(jìn)入容器中執(zhí)行,方便我們查看內(nèi)部文件和調(diào)試

> docker exec -it 1d0db9a5d0c8 /bin/bash

root@1d0db9a5d0c8:/app#

戰(zhàn)功,訪問(wèn)部署的docker應(yīng)用,<服務(wù)器的IP>:9000,效果如下圖:

小結(jié)

七月流火,程序員的好日子要到了,當(dāng)然也是大家的好日子快到了,適宜的溫度應(yīng)該更加高產(chǎn)。關(guān)于docker的研究還在進(jìn)行中,為了前端更好的發(fā)展,讓我們繼續(xù)燥起來(lái)吧,畢竟沒(méi)有什么是一段JS解決不了的。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/27006.html

相關(guān)文章

  • Docker部署基于NodejsWeb應(yīng)用-實(shí)戰(zhàn)

    摘要:采用虛擬化的技術(shù)來(lái)虛擬化出應(yīng)用程序的運(yùn)行環(huán)境。安裝成功后,可以通過(guò)查看版本號(hào)盡量使用最新的穩(wěn)定版本。是鏡像名,是鏡像的版本號(hào),到此你已經(jīng)成功構(gòu)建了一個(gè)新的鏡像,你可以通過(guò),查看你的鏡像。部署時(shí)將此文件到生產(chǎn)環(huán)境服務(wù)器上。 Docker docker是一個(gè)開(kāi)源的應(yīng)用容器引擎,可以為我們提供安全、可移植、可重復(fù)的自動(dòng)化部署的方式。docker采用虛擬化的技術(shù)來(lái)虛擬化出應(yīng)用程序的運(yùn)行環(huán)境。此...

    marek 評(píng)論0 收藏0
  • 網(wǎng)站部署

    摘要:就鹿晗宣布戀情導(dǎo)致微博宕機(jī)事件淺談大型網(wǎng)站高可用性架構(gòu)中午吃飯刷著刷著微博發(fā)現(xiàn)微博突然掛了。用戶在使用瀏覽器訪問(wèn)一個(gè)網(wǎng)站時(shí)需要先通過(guò)協(xié)議向服務(wù)器發(fā)送請(qǐng)求,之后服務(wù)器返回文件與響應(yīng)信息。 webpack:從入門(mén)到真實(shí)項(xiàng)目配置 自從出現(xiàn)模塊化以后,大家可以將原本一坨代碼分離到個(gè)個(gè)模塊中,但是由此引發(fā)了一個(gè)問(wèn)題。每個(gè) JS 文件都需要從服務(wù)器去拿,由此會(huì)導(dǎo)致加載速度變慢。Webpack 最主...

    endless_road 評(píng)論0 收藏0
  • 使用 Docker 部署 NodeJS + MongoDB 項(xiàng)目

    摘要:最近在學(xué)習(xí),并用重新部署了項(xiàng)目,使用后確實(shí)大幅度地降低了部署難度。如果,內(nèi)存,硬盤(pán)不夠,只能加物理設(shè)備,但這個(gè)是有上限的。虛擬化時(shí)代為了解決物理設(shè)備的諸多問(wèn)題,出現(xiàn)了虛擬機(jī)。全手動(dòng)部署編寫(xiě)文件。一鍵啟動(dòng),確保已安裝。 最近在學(xué)習(xí) Docker,并用 Docker 重新部署了cdfang-spider項(xiàng)目,使用 docker 后確實(shí)大幅度地降低了部署難度。如果你也想用 Docker 來(lái)部...

    warmcheng 評(píng)論0 收藏0
  • 使用 Docker 部署 NodeJS + MongoDB 項(xiàng)目

    摘要:最近在學(xué)習(xí),并用重新部署了項(xiàng)目,使用后確實(shí)大幅度地降低了部署難度。如果,內(nèi)存,硬盤(pán)不夠,只能加物理設(shè)備,但這個(gè)是有上限的。虛擬化時(shí)代為了解決物理設(shè)備的諸多問(wèn)題,出現(xiàn)了虛擬機(jī)。全手動(dòng)部署編寫(xiě)文件。一鍵啟動(dòng),確保已安裝。 最近在學(xué)習(xí) Docker,并用 Docker 重新部署了cdfang-spider項(xiàng)目,使用 docker 后確實(shí)大幅度地降低了部署難度。如果你也想用 Docker 來(lái)部...

    IamDLY 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

mikasa

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<