最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Django Docker容器化部署之Django-Docker本地部署

 更新時間:2019年10月09日 09:00:06   作者:杜賽  
這篇文章主要介紹了Django Docker容器化部署之Django-Docker本地部署,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

本章將在本地搭建一個容器化的 Django 項目,感受 Docker 的運作方式。

前期準(zhǔn)備

開發(fā)環(huán)境

雖然有基于 Windows 的 Docker 版本,但各方面兼容做得都不太好(安裝也麻煩些),因此建議讀者在學(xué)習(xí)前,自行安裝好 Linux 或 Mac 系統(tǒng)。當(dāng)然你愿意折騰的話,在 Windows 上搞也行。

別擔(dān)心,以后開發(fā) Django 項目仍然可以在 Windows 下進(jìn)行,僅僅是開發(fā)時不使用 Docker 而已。

軟件安裝

  • Docker:學(xué)習(xí) Docker 當(dāng)然要安裝 Docker 軟件了(免費的社區(qū)版),安裝方法見官方文檔。
  • Docker-compose:這是 Docker 官方推出的用于編排、運行多個容器的工具,安裝方法見官方文檔。本教程大部分內(nèi)容都與它有關(guān)。
  • Python3:教程部署的是 Django 項目,那 Python3 是當(dāng)然要有的了(包括 python 的包管理工具 pip)。

準(zhǔn)備就緒后就繼續(xù)下一步吧。

創(chuàng)建 Django 項目

打開 Linux/Mac 的終端,安裝 Django 庫:

$ pip install django==2.2

在一個你喜歡得位置(比如/home/)創(chuàng)建新的 Django 項目:

$ django-admin startproject django_app

進(jìn)入項目根目錄:

$ cd django_app

教程后面的內(nèi)容全部都在此目錄中操作了。為方便閱讀,命令提示符 $ 代表目前在項目根目錄 django_app/,mysql $ 則代表目前在目錄 django_app/mysql/ 中,請讀者操作時稍加留意當(dāng)前的工作目錄。

然后遷移數(shù)據(jù):

$ python manage.py migrate

Operations to perform:
 Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
 Applying contenttypes.0001_initial... OK
 ...
 Applying sessions.0001_initial... OK

準(zhǔn)備工作就搞定了。

用Docker構(gòu)建項目

初識Docker

Docker 的整個生命周期由三部分組成:鏡像(image)+ 容器(container)+ 倉庫(repository)。

容器是由鏡像實例化而來,這有點像面向?qū)ο蟮母拍睿虹R像就是類,容器是類實例化之后的對象。

鏡像是一個只讀的模板,它包括了運行容器所需的數(shù)據(jù)。鏡像可以包含一個完整的 Linux 操作環(huán)境,里面僅安裝了 Python 或者其他用戶需要的程序。

容器是由鏡像創(chuàng)建出來的實例,類似虛擬機(jī),里面可以運行特定的應(yīng)用,并且容器與容器是相互隔離的。

倉庫概念與 Git 和 Github 類似,如果你用過它們就非常容易理解。Docker 使用的默認(rèn)倉庫是由官方維護(hù)的 Docker hub 公共倉庫,從中上傳、拉取的操作類似 Git。

目前需要了解的就這么多,下面通過實踐來理解。

Hello-world

為了確認(rèn) Docker 已經(jīng)正確安裝了,運行以下指令:

$ docker run hello-world

Unable to find image 'hello-world:latest' locally
...
latest: Pulling from library/hello-world
1b930d010525: Pull complete 
...

Hello from Docker!
This message shows that your installation appears to be working correctly.
...

一切正常的話,終端將打印出如上圖所示的歡迎語句。docker run hello-world 指令的含義是:用名稱為 hello-world 的鏡像構(gòu)建一個容器并運行。如果本地上沒有這個 hello-world 的鏡像, Docker 會自動從倉庫搜索并下載同名的鏡像。

我們可以用 docker images 查看本地已有的鏡像:

$ docker images

REPOSITORY   TAG    IMAGE ID      CREATED      SIZE
hello-world   latest   fce289e99eb9    9 months ago   1.84kB

表列分別為鏡像名、版本、ID 號、創(chuàng)建時間、大小。

還可以查看本地已有的容器:

$ docker ps -a

CONTAINER ID  IMAGE    ..  CREATED     ..
38cb03a96dca  hello-world ..  2 minutes ago  ..

除此之外還有一些非常有用的基礎(chǔ)指令:

docker rmi [images ID] # 刪除此 ID 的鏡像
docker container stop [container ID] # 停止此 ID 的容器
docker container start [container ID] # 啟動此 ID 的容器
docker container rm [container ID] # 刪除此 ID 的容器

由于測試時會頻繁生成鏡像,因此你肯定會用上面的指令查看、刪除無用的鏡像和容器。

牛刀小試完畢,接下來正式構(gòu)建 Django 容器。

Dockerfile

Docker 允許通過文本格式的配置文件來構(gòu)建鏡像,默認(rèn)名稱為 Dockerfile。因此在項目根目錄新建文件 Dockerfile,寫入:

# 從倉庫拉取 帶有 python 3.7 的 Linux 環(huán)境
FROM python:3.7

# 設(shè)置 python 環(huán)境變量
ENV PYTHONUNBUFFERED 1

# 創(chuàng)建 code 文件夾并將其設(shè)置為工作目錄
RUN mkdir /code
WORKDIR /code
# 更新 pip
RUN pip install pip -U
# 將 requirements.txt 復(fù)制到容器的 code 目錄
ADD requirements.txt /code/
# 安裝庫
RUN pip install -r requirements.txt
# 將當(dāng)前目錄復(fù)制到容器的 code 目錄
ADD . /code/

理解這些 Docker 指令的關(guān)鍵在于,一定要牢記容器里的環(huán)境和外界(宿主機(jī))是隔離的,它兩是完全不一樣的。換句話說,要搞清楚哪些操作是針對宿主機(jī)、哪些操作是針對容器。

FROM python:3.7 指令從倉庫拉取一個包含 python 3.7 的 Linux 操作系統(tǒng)環(huán)境(Linux 版本為 Debian)。

RUN 和 WORKDIR 指令都是針對容器的,功能是在容器里創(chuàng)建目錄、并將其設(shè)置為工作目錄。注意宿主機(jī)是沒有這個目錄的。

ADD 指令出現(xiàn)了兩次。ADD requirements.txt /code/ 意思是將宿主機(jī)當(dāng)前目錄(即 Dockerfile 所在目錄)的 requirements.txt 文件復(fù)制到容器的 /code 目錄中。ADD . /code/ 意思是把當(dāng)前目錄所有內(nèi)容復(fù)制到容器 /code/ 目錄,注意中間那個點。

目前項目依賴的唯一庫就是 Django,所以在項目根目錄創(chuàng)建 requirements.txt 并寫入:

django==2.2

前面不是已經(jīng)安裝過 Django 了嗎,為什么這里還要安裝?原因是前面是在宿主機(jī)安裝的,容器里是沒有 Django 的!

所以目前的文件結(jié)構(gòu)如下:

django_app
 - Dockerfile
 - requirements.txt
 - manage.py
 - django_app
 - db.sqlite3

配置文件就寫好了,接下來看看 Docker-compose 怎么用。

Docker-compose

在線上環(huán)境中,通常不會將項目的所有組件放到同一個容器中;更好的做法是把每個獨立的功能裝進(jìn)單獨的容器,這樣方便復(fù)用。比如將 Django 代碼放到容器A,將 Mysql 數(shù)據(jù)庫放到容器B,以此類推。

因此同一個服務(wù)器上有可能會運行著多個容器,如果每次都靠一條條指令去啟動,未免也太繁瑣了。 Docker-compose 就是解決這個問題的,它用來編排多個容器,將啟動容器的命令統(tǒng)一寫到 docker-compose.yml 文件中,以后每次啟動這一組容器時,只需要 docker-compose up 就可以了。因此教程也會用 docker-compose 來管理容器。

首先確認(rèn) docker-compose 是否安裝成功:

$ docker-compose -v
docker-compose version 1.24.1, build 4667896b

確認(rèn)無誤后,在項目根目錄創(chuàng)建 docker-compose.yml 并寫入:

version: "3"
services:
 app:
  restart: always
  build: . # '點'代表當(dāng)前目錄
  command: "python3 manage.py runserver 0.0.0.0:8000"
  volumes:
   - .:/code
  ports:
   - "8000:8000"

讓我們來分解一下其中的各項含義。

version 代表 docker-compose.yml 的版本,目前最新版為 3,不需要改動它。

接著定義了一個名叫 app 的容器。后面的內(nèi)容都是 app 容器的相關(guān)配置:

  • restart :除正常工作外,容器會在任何時候重啟,比如遭遇 bug、進(jìn)程崩潰、docker 重啟等情況。
  • build :指定一個包含 Dockerfile 的路徑,并通過此 Dockerfile 來構(gòu)建容器鏡像。注意那個 "." ,代表當(dāng)前目錄。
  • command :容器運行時需要執(zhí)行的命令。這里就是我們很熟悉的運行開發(fā)服務(wù)器了。
  • volumes :卷,這是個很重要的概念。前面說過容器是和宿主機(jī)完全隔離的,但是有些時候又需要將其連通;比如我們開發(fā)的 Django 項目代碼常常會更新,并且更新時還依賴如 Git 之類的程序,在容器里操作就顯得不太方便。所以就有卷,它定義了宿主機(jī)和容器之間的映射:"." 表示宿主機(jī)的當(dāng)前目錄,":" 為分隔符,"/code" 表示容器中的目錄。即宿主機(jī)當(dāng)前目錄和容器的 /code 目錄是連通的,宿主機(jī)當(dāng)前目錄的 Django 代碼更新時,容器中的 /code 目錄中的代碼也相應(yīng)的更新了。這有點兒像是在容器上打了一個洞,某種程度上也是實用性和隔離性的一種妥協(xié)。

嚴(yán)格意義上講,這里用到的 .:/code 并不是卷,而是叫掛載,它兩是有區(qū)別的,只不過 docker-compose 允許將掛載寫到卷的配置中。后面章節(jié)會講到。

ports :定義了宿主機(jī)和容器的端口映射。容器的隔離不止環(huán)境,甚至連端口都隔離起來了。但 web 應(yīng)用不通過端口跟外界通信當(dāng)然不行,因此這里定義將宿主機(jī)的 8000 端口映射到容器的 8000 端口,即訪問宿主機(jī)的 8000 端口就是訪問到了容器的 8000 端口,但要確保端口沒有被其他程序占用。

配置就寫好了?,F(xiàn)在項目的目錄結(jié)構(gòu)如下:

django_app
 - docker-compose.yml
 - Dockerfile
 - requirements.txt
 - manage.py
 - django_app
 - db.sqlite3

測試

輸入指令 docker-compose up 啟動容器服務(wù):

$ docker-compose up

Creating network "django_app_default" with the default driver
Building app
Step 1/8 : FROM python:3.7
3.7: Pulling from library/python
4a56a430b2ba: Pull complete
...
6933d3d46042: Pull complete
Digest: sha256:0f0e991a97426db345ca7ec59fa911c8ed27ced27c88ae9966b452bcc6438c2f
Status: Downloaded newer image for python:3.7
 ---> 02d2bb146b3b
Step 1/8 : FROM python:3.7
 ---> 02d2bb146b3b
...
Step 7/8 : RUN pip install -r requirements.txt
 ---> Running in 62a60a3003fe
Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple
Collecting django==2.2 (from -r requirements.txt (line 1))
 Downloading https://files.pythonhosted.org/packages/54/85/0bef63668fb170888c1a2970ec897d4528d6072f32dee27653381a332642/Django-2.2-py3-none-any.whl (7.4MB)
...
Installing collected packages: sqlparse, pytz, django
Successfully installed django-2.2 pytz-2019.2 sqlparse-0.3.0
...
Step 8/8 : ADD . /code/
 ---> cb23f483ffb6
Successfully built cb23f483ffb6
Successfully tagged django_app_app:latest
WARNING: Image for service app was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`.
Creating django_app_app_1 ... done
Attaching to django_app_app_1
app_1 | Watching for file changes with StatReloader
app_1 | Performing system checks...
app_1 | 
app_1 | System check identified no issues (0 silenced).
app_1 | October 05, 2019 - 15:03:15
app_1 | Django version 2.2, using settings 'django_app.settings'
app_1 | Starting development server at http://0.0.0.0:8000/
app_1 | Quit the server with CONTROL-C.

可以看到 Docker 按照配置文件的要求,成功構(gòu)建了鏡像及容器,并啟動了容器。

打開瀏覽器,輸入本地 IP 端口 127.0.0.1:8000 :

 

看到 Django 的小火箭,項目成功運行起來啦。按 Ctrl + C 即可停止開發(fā)服務(wù)器運行。

停止服務(wù)器后實際上容器還存在,只是停止運行了而已。輸入:

$ docker-compose down

就可以刪除容器。

如果想在后臺運行容器,則輸入:

$ docker-compose up -d

另外,如果你需要重新構(gòu)建鏡像,則輸入命令:

$ docker-compose build

啟動和停止已有的容器:

$ docker-compose start
$ docker-compose stop

很簡單吧。

下載太慢?

由于眾所周知的原因,國內(nèi)的網(wǎng)絡(luò)環(huán)境非常復(fù)雜。在構(gòu)建鏡像時經(jīng)常需要從國外的遠(yuǎn)程倉庫拉取資源,巋然不動的下載速度真的頭疼。

解決方法就是將資源拉取鏈接修改為國內(nèi)的鏡像源,比如清華的鏡像源。

修改 Dockerfile 如下:

FROM python:3.7
ENV PYTHONUNBUFFERED 1

# 添加 Debian 清華鏡像源
RUN echo \
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ buster main contrib non-free\
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ buster-updates main contrib non-free\
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ buster-backports main contrib non-free\
deb https://mirrors.tuna.tsinghua.edu.cn/debian-security buster/updates main contrib non-free\
  > /etc/apt/sources.list

RUN mkdir /code
WORKDIR /code
# 添加 pip 清華鏡像源
RUN pip install pip -U -i https://pypi.tuna.tsinghua.edu.cn/simple
ADD requirements.txt /code/
# 添加 pip 清華鏡像源
RUN pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
ADD . /code/

重新構(gòu)建鏡像,下載速度就飛一樣快了。

教程后面的內(nèi)容都使用了清華源,但為了方便閱讀,把這一部分更換源的代碼省去了,讀者心里明白就好。

總結(jié)

本章初步感受了 Docker 的工作流程,并且很輕松的構(gòu)建了一個容器化的 Django 項目。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • pytorch1.0中torch.nn.Conv2d用法詳解

    pytorch1.0中torch.nn.Conv2d用法詳解

    今天小編就為大家分享一篇pytorch1.0中torch.nn.Conv2d用法詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-01-01
  • python下對hsv顏色空間進(jìn)行量化操作

    python下對hsv顏色空間進(jìn)行量化操作

    這篇文章主要介紹了python下對hsv顏色空間進(jìn)行量化操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-06-06
  • Python的列表和元組詳情

    Python的列表和元組詳情

    這篇文章主要介紹了Python的列表和元組,列表和元組是python組常見的內(nèi)置內(nèi)省,下面文章我們講圍繞Python的列表和元組的相關(guān)資料展開話題,感興趣的小伙伴以參考一下
    2021-10-10
  • python 分割符豎線的具體實現(xiàn)

    python 分割符豎線的具體實現(xiàn)

    豎線作為一種常見的分割符,能夠?qū)⒁恍形谋净驍?shù)據(jù)按照指定規(guī)則分割為多個部分,本文主要介紹了python 分割符豎線的具體實現(xiàn),具有一定的參考價值,感興趣的可以了解一下
    2024-01-01
  • Matlab讀取excel并利用拉依達(dá)準(zhǔn)則篩選數(shù)據(jù)的全過程

    Matlab讀取excel并利用拉依達(dá)準(zhǔn)則篩選數(shù)據(jù)的全過程

    在Excel中錄入好數(shù)據(jù)以后經(jīng)常需要被matlab讀取,具體該如何讀取并進(jìn)行篩選呢?下面這篇文章就來給大家介紹了關(guān)于Matlab讀取excel并利用拉依達(dá)準(zhǔn)則篩選數(shù)據(jù)的相關(guān)資料,需要的朋友可以參考下
    2021-08-08
  • python比較兩個列表是否相等的方法

    python比較兩個列表是否相等的方法

    這篇文章主要介紹了python比較兩個列表是否相等的方法,實例分析了Python中==和is兩種方法的區(qū)別,需要的朋友可以參考下
    2015-07-07
  • Python數(shù)據(jù)可視化Pyecharts庫實現(xiàn)桑葚圖效果

    Python數(shù)據(jù)可視化Pyecharts庫實現(xiàn)桑葚圖效果

    這篇文章主要介紹了Python數(shù)據(jù)可視化如何使用Pyecharts庫來實現(xiàn)桑葚圖效果圖,文中給出實現(xiàn)的示例代碼,有需要的朋友可以借鑒參考想,希望能夠有所幫助
    2021-09-09
  • OpenCV中Canny邊緣檢測的實現(xiàn)

    OpenCV中Canny邊緣檢測的實現(xiàn)

    本文主要介紹了OpenCV中Canny邊緣檢測的實現(xiàn),邊緣檢測一般是識別目標(biāo)圖像中亮度變化明顯的像素點,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • python模塊之re正則表達(dá)式詳解

    python模塊之re正則表達(dá)式詳解

    正則表達(dá)式是一種小型的、高度專業(yè)化的編程語言,并不是python中特有的,是許多編程語言中基礎(chǔ)而又重要的一部分。在python中,主要通過re模塊來實現(xiàn)。這篇文章主要介紹了python模塊之re正則表達(dá)式詳解,需要的朋友可以參考下
    2017-02-02
  • Python入門變量的定義及類型理解

    Python入門變量的定義及類型理解

    本文適合編程語言零基礎(chǔ)的初學(xué)者,有打算轉(zhuǎn)行學(xué)習(xí)python的可以添加關(guān)注,后續(xù)小編將會把自己轉(zhuǎn)行學(xué)pyhton語言以來的所有筆記,和工作中總結(jié)的一些開發(fā)經(jīng)驗分享給大家
    2021-09-09

最新評論

吉隆县| 姜堰市| 德昌县| 商水县| 库尔勒市| 北碚区| 崇文区| 岚皋县| 宁南县| 九台市| 安仁县| 库尔勒市| 济阳县| 高台县| 大悟县| 敦化市| 萨嘎县| 宣恩县| 瓮安县| 额尔古纳市| 光山县| 双鸭山市| 景泰县| 南京市| 新和县| 松溪县| 兴山县| 道孚县| 抚顺县| 连州市| 新乐市| 菏泽市| 化德县| 庄浪县| 隆昌县| 浦东新区| 锡林郭勒盟| 普格县| 长寿区| 平乡县| 平度市|