使用Docker來部署django+vue項目


一、django項目的部署

(一)django項目的搭建

1、搭建虛擬環境

項目是需要依賴環境的,所以我們需要先創建一個虛擬環境:

C:\Users\Administrator>mkvirtualenv django-vue-demo --no-setuptools
Using real prefix 'e:\\python\\python3.5.2\\progress'
New python executable in C:\Users\Administrator\Envs\django-vue-demo\Scripts\pyt
hon.exe
Installing pip, wheel...done.

注意因為直接mkvirtualenv django-vue-demo會安裝失敗,所以先不要安裝settools,待上面完成后再進行安裝settools工具。

(django-vue-demo) C:\Users\Administrator>pip install setuptools
Collecting setuptools
  Using cached setuptools-45.1.0-py3-none-any.whl (583 kB)
Installing collected packages: setuptools
Successfully installed setuptools-45.1.0

2、創建項目

  • 在虛擬環境中安裝django包
(django-vue-demo) C:\Users\Administrator>pip install django==2.0
Collecting django==2.0
  Using cached Django-2.0-py3-none-any.whl (7.1 MB)
Collecting pytz
  Using cached pytz-2019.3-py2.py3-none-any.whl (509 kB)
Installing collected packages: pytz, django
Successfully installed django-2.0 pytz-2019.3
  • 使用pycharm創建django項目

注意需要填寫以上3處地方,尤其是第2處地方,選擇剛剛新建虛擬環境的python解釋器。

3、數據庫配置

 在這個項目中需要使用到mysql數據庫,所以先將mysql數據庫進行配置:

  • 安裝pymysql
(django-vue-demo) C:\Users\Administrator>pip install pymysql
Collecting pymysql
  Using cached PyMySQL-0.9.3-py2.py3-none-any.whl (47 kB)
Installing collected packages: pymysql
Successfully installed pymysql-0.9.3
  • 在__init__.py文件中導入pymysql

在與settings同級的__init__.py文件中導入pymysql:

import pymysql

pymysql.install_as_MySQLdb()
  • settings.py中配置mysql
# Database
# https://docs.djangoproject.com/en/2.0/ref/settings/#databases

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'demo',
        'USER': 'root',
        'PASSWORD': '',
        'HOST': 'localhost',
        'PORT': '3306',
    }
}

注意的是你需要先在數據庫中創建一個demo的數據庫。

  • 生成數據庫表
python manage.py makemigrations
python manage.py migrate

 4、同源策略配置

 這個配置主要是解決瀏覽器的同源策略,例如前台訪問后台接口會報如下錯誤:

Access to XMLHttpRequest at 'http://127.0.0.1:8000/test/' from origin 'http://localhost:8080' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

為了解決這個問題,我們在后台可以進行一些配置來解決這個問題,詳情查看我的這篇博客:https://www.cnblogs.com/shenjianping/p/11718925.html

5、寫一個測試API

def test(request):
    result = {
        "meta":{
            "code":2001,
            "message":"請求失敗"
        },
        "data":[]
    }
    try:
        UserSet = models.UserInfo.objects.values('id','username','password','position','age')
        result["meta"]["code"]=2000
        result["meta"]["message"]="請求成功"
        result["data"]=list(UserSet)
        print(UserSet)
    except Exception as e:
        pass
    return HttpResponse(json.dumps(result))

(二)部署

1、創建網絡

因為在一台服務器上部署,所以建一個bridge網絡:

[root@centos-7 backend]# docker network create django_web
73b739d646ab56d2913594724d08c08ee6125e4e84211b894d5f24d67c6cab85

2、部署mysql服務

因為web應用依賴於mysql數據服務,所以先啟動mysql服務:

  • 拉取mysql鏡像
[root@centos-7 backend]# docker pull mysql
  • 啟動mysql服務
[root@centos-7 ~]# docker run -d -p 3307:3306 --network django_web --name django_mysql \
-v $PWD/db:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:latest
  • 創建數據庫

我們需要進入mysql中創建自己的數據庫:

[root@centos-7 ~]# docker exec -it 44b1 /bin/sh  #進入容器
# mysql -uroot -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8

mysql> create DATABASE demo DEFAULT CHARSET utf8 COLLATE utf8_general_ci; #創建數據庫
Query OK, 1 row affected, 2 warnings (0.01 sec)

 3、部署web服務

  • 服務器上文件目錄
[root@centos-7 web]# ls
backend  Dockerfile  pip.conf
[root@centos-7 web]# cd backend/
[root@centos-7 backend]# ls
backend  db.sqlite3  demo  manage.py  requirements.txt  start.sh  templates

可以看到在web目錄下有backend是項目,還有Dockerfile以及pip.conf文件;然后再backend目錄中有requirements.txt包文件、starts.sh腳本文件。

  • 各文件內容

Dockerfile文件:

FROM    python:3.5.2
RUN mkdir -p  /usr/src/app   #在容器中新建一個文件夾app
COPY pip.conf  /root/.pip/pip.conf  #更改pip源
COPY ./backend/  /usr/src/app/  #將banckend項目下的文件全部拷貝到容器中
RUN chmod +x /usr/src/app/start.sh #賦予腳本文件執行權限
RUN pip install cryptography #安裝數據庫認證相關的包,實際上這可以直接放在requirements.txt文件中
RUN pip install -r /usr/src/app/requirements.txt
WORKDIR /usr/src/app #切換工作目錄,否則找不到腳本文件
CMD ./start.sh

pip.conf

[global]
index-url = http://mirrors.aliyun.com/pypi/simple/
[install]
trusted-host=mirrors.aliyun.com

requirements.txt

這個文件是開發時需要的各種包,你可以進入開發環境的虛擬環境進行導出:

pip freeze > requirements.txt  #導出到當前路徑下

starts.sh

這是Dockerfile文件CMD中的執行命令腳本:

#!/bin/sh
python manage.py makemigrations &
python manage.py migrate &
python manage.py runserver 0.0.0.0:8000

值得注意的是這個腳本與manage.py位於同一級。

  • 項目中settings中的配置

因為之前mysql已經啟動了,項目中配置了mysql的配置,所以settings中對這一塊需要做一些改變:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'demo', #這是在mysql啟動后創建的數據庫
        'USER': 'root',
        'PASSWORD': '123456',
        'HOST': 'django_mysql',  #啟動mysql服務指定的名稱
        'PORT': '3306',
    }
}
  • 生成鏡像
[root@centos-7 web]# docker build -t django_web .
  • 運行該鏡像(默認執行CMD中的腳本命令)
[root@centos-7 web]# docker run  --network django_web --name django_web -p 8001:8000 django_web
  • 容器列表
[root@centos-7 mysql]# docker ps
CONTAINER ID   IMAGE         COMMAND                  CREATED             STATUS              PORTS                      NAMES
d036b07b6c53  django_web  "/bin/sh -c ./start.…"   57 minutes ago      Up 57 minutes       0.0.0.0:8001->8000/tcp       django_web
b1b1d0c62561  mysql:latest  "docker-entrypoint.s…"   2 hours ago         Up 2 hours 33060/tcp, 0.0.0.0:3307->3306/tcp   django_mysql

上面就是目前的容器列表,所以前台訪問后台可以通過本機的8001端口即可。

二、Vue項目部署

(一)項目搭建

  • 創建項目

首先進入你需要進入一個目錄,這個目錄用於你放置項目的地方:

C:\Users\Administrator>i:

I:\djaogo-vue-demo>cd I:\djaogo-vue-demo

然后使用腳手架創建項目:

I:\djaogo-vue-demo>vue create fronted

這個npm提示選擇yes即可,然后會問你是自動創建還是手動(Manually)創建,手動會有更多選項,這里不需要選擇default,可選擇Manually。

會出現如下界面:

這里有很多選項:

(*) Babel  #解決兼容性問題,支持 ES6 的代碼轉譯成瀏覽器能識別的代碼
( ) TypeScript  #是一種給 JavaScript 添加特性的語言擴展,增加了很多功能,微軟開發的
( ) Progressive Web App (PWA) Support  #漸進式的Web應用程序支持
( ) Router  #是 vue-router 路由
( ) Vuex  #是Vue中的狀態管理模式+庫 
( ) CSS Pre-processors  #支持 CSS 預處理器, Sass/Less預處理器
(*) Linter / Formatter  #支持代碼風格檢查和格式化
( ) Unit Testing  #支持單元測試
( ) E2E Testing  #支持 E2E 測試

我們可以選擇以下的選項:

當上面使用space選擇后然后使用enter確認,出現:

 

詢問是否使用history模式,我們選擇Y,出現:

 后面出現的一次按照如下填寫即可:

ESLint + Prettier(檢查與格式化代碼)--》 Lint on save(保存就檢測)--》In dedicated config files(分別使用獨立文件放置)--》保存這個特性到項目

注意選擇npm下載即可:

當這些完成后我們就可以對其添加一些我們自己寫的東西了。 

  • 安裝組件

這里我主要是想讓前后端進行通信,所以需要安裝axios,那么就進行axios的封裝:

I:\djaogo-vue-demo\fronted>cnpm install axios
√ Installed 1 packages
√ Linked 3 latest versions
√ Run 0 scripts
√ All packages installed (4 packages installed from npm registry, used 2s(netwo
rk 2s), speed 62.37kB/s, json 4(14.62kB), tarball 109.44kB)

在項目的src目錄下新建utils文件夾,並在里面新建requests.js文件:

import axios from 'axios'

const request = axios.create(
  {
    baseURL:'http://127.0.0.1:8001',
    timeout:5000
  }
)

export default request
  • 調用接口

另外,再在src目錄下新建api目錄,api目錄下新建test.js文件,可用於測試。

調用后台接口:

import request from '@/utils/request'

export default {

  getList(){
    const req = request({
      method:'get',
      url:'/test/'
    })
    return req
  }
}

在頁面中進行調用接口,並傳遞給子組件進行渲染:

<template>
    <div>
    <Table v-bind:testList="testList" v-loading="tableLoading"></Table>
    </div>
</template>

<script>
  import Table from "../components/Table";
  import testApi from "../api/test"
  export default {
    name: "Main",
    components: { Table },
    data(){
      return {
        testList:[],
        tableLoading:true
      }
    },
    created(){
      this.getData()
    },
    methods:{
      getData(){
        testApi.getList().then(response=>{
          const {data, meta: {code,message}} = response.data;
          if(code===2000){
                this.testList = data;
                this.tableLoading = false
          }
          console.log('data',data,code,message)
        })
      }
    }
  };
</script>

<style scoped>

</style>
Main.vue

子組件:

<template>
    <el-table
            :data="testList"
            style="width: 100%">
        <el-table-column
                prop="username"
                label="姓名"
                width="180">
        </el-table-column>
        <el-table-column
                prop="password"
                label="密碼"
                width="180">
        </el-table-column>
        <el-table-column
                prop="position"
                label="職位">
        </el-table-column>
    </el-table>
</template>

<script>
  export default {
    name: "table",
    data() {
      return {
      }
    },
    props:{
      testList:Array
    }
  };
</script>

<style scoped>

</style>
Table.vue

此時,就可以正常開發,基於此進行下面的部署。

(二)項目部署

1、打包項目 

在根目錄下通過以下命令進行打包:

npm run build

此時會在項目里面有一個dist目錄文件夾。

2、在服務器上新建文件夾

在服務器上新建一個fronted的文件夾,用於存放前台服務的一些文件夾和文件,將dist文件夾的壓縮包上傳,並且創建Dokcerfile和nginx.conf文件

[root@centos-7 fronted]# ls
dist.zip  Dockerfile  nginx.conf

將zip文件解壓縮:

[root@centos-7 fronted]# unzip dist.zip 

編寫Dockerfile文件:

FROM nginx  #基礎鏡像
COPY dist/  /usr/share/nginx/html/  #將dist下的文件拷貝到html目錄下
COPY nginx.conf  /etc/nginx/nginx.conf #用本地的nginx.conf配置文件替換nginx中的配置文件

編寫nginx.conf文件:

worker_processes auto;
 
events {
    worker_connections  1024;
}
 
http {
    include       mime.types;
    default_type  application/octet-stream;
 
    sendfile        on;
    keepalive_timeout  65;
 
    client_max_body_size   20m;
    server {
        listen       80;
        server_name  localhost;
        location / {
           root   /usr/share/nginx/html;
           index  index.html index.htm;
           try_files $uri $uri/ /index.html;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}
  • 創建鏡像
[root@centos-7 fronted]# docker build -t fronted:1.0 .

注意后面的點不要丟了。

  • 運行容器
[root@centos-7 fronted]# docker run -d --name fronted -p 80:80 fronted:1.0 
404153a8e7149113852dcdc7b76e464093bb9a07aa02fa26457e1f53c1e3ae0f

然后既可以訪問本機地址的80端口了。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM