您好,登錄后才能下訂單哦!
這篇文章主要介紹Django Docker容器化部署之Django-Docker本地部署的示例分析,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
前期準備
開發環境
雖然有基于 Windows 的 Docker 版本,但各方面兼容做得都不太好(安裝也麻煩些),因此建議讀者在學習前,自行安裝好 Linux 或 Mac 系統。當然你愿意折騰的話,在 Windows 上搞也行。
別擔心,以后開發 Django 項目仍然可以在 Windows 下進行,僅僅是開發時不使用 Docker 而已。
軟件安裝
Docker:學習 Docker 當然要安裝 Docker 軟件了(免費的社區版),安裝方法見官方文檔。
Docker-compose:這是 Docker 官方推出的用于編排、運行多個容器的工具,安裝方法見官方文檔。本教程大部分內容都與它有關。
Python3:教程部署的是 Django 項目,那 Python3 是當然要有的了(包括 python 的包管理工具 pip)。
準備就緒后就繼續下一步吧。
創建 Django 項目
打開 Linux/Mac 的終端,安裝 Django 庫:
$ pip install django==2.2
在一個你喜歡得位置(比如/home/)創建新的 Django 項目:
$ django-admin startproject django_app
進入項目根目錄:
$ cd django_app
教程后面的內容全部都在此目錄中操作了。為方便閱讀,命令提示符 $ 代表目前在項目根目錄 django_app/,mysql $ 則代表目前在目錄 django_app/mysql/ 中,請讀者操作時稍加留意當前的工作目錄。
然后遷移數據:
$ 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
準備工作就搞定了。
用Docker構建項目
初識Docker
Docker 的整個生命周期由三部分組成:鏡像(image)+ 容器(container)+ 倉庫(repository)。
容器是由鏡像實例化而來,這有點像面向對象的概念:鏡像就是類,容器是類實例化之后的對象。
鏡像是一個只讀的模板,它包括了運行容器所需的數據。鏡像可以包含一個完整的 Linux 操作環境,里面僅安裝了 Python 或者其他用戶需要的程序。
容器是由鏡像創建出來的實例,類似虛擬機,里面可以運行特定的應用,并且容器與容器是相互隔離的。
倉庫概念與 Git 和 Github 類似,如果你用過它們就非常容易理解。Docker 使用的默認倉庫是由官方維護的 Docker hub 公共倉庫,從中上傳、拉取的操作類似 Git。
目前需要了解的就這么多,下面通過實踐來理解。
Hello-world
為了確認 Docker 已經正確安裝了,運行以下指令:
$ 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 的鏡像構建一個容器并運行。如果本地上沒有這個 hello-world 的鏡像, Docker 會自動從倉庫搜索并下載同名的鏡像。
我們可以用 docker images 查看本地已有的鏡像:
$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE hello-world latest fce289e99eb9 9 months ago 1.84kB
表列分別為鏡像名、版本、ID 號、創建時間、大小。
還可以查看本地已有的容器:
$ docker ps -a CONTAINER ID IMAGE .. CREATED .. 38cb03a96dca hello-world .. 2 minutes ago ..
除此之外還有一些非常有用的基礎指令:
docker rmi [images ID] # 刪除此 ID 的鏡像 docker container stop [container ID] # 停止此 ID 的容器 docker container start [container ID] # 啟動此 ID 的容器 docker container rm [container ID] # 刪除此 ID 的容器
由于測試時會頻繁生成鏡像,因此你肯定會用上面的指令查看、刪除無用的鏡像和容器。
牛刀小試完畢,接下來正式構建 Django 容器。
Dockerfile
Docker 允許通過文本格式的配置文件來構建鏡像,默認名稱為 Dockerfile。因此在項目根目錄新建文件 Dockerfile,寫入:
# 從倉庫拉取 帶有 python 3.7 的 Linux 環境 FROM python:3.7 # 設置 python 環境變量 ENV PYTHONUNBUFFERED 1 # 創建 code 文件夾并將其設置為工作目錄 RUN mkdir /code WORKDIR /code # 更新 pip RUN pip install pip -U # 將 requirements.txt 復制到容器的 code 目錄 ADD requirements.txt /code/ # 安裝庫 RUN pip install -r requirements.txt # 將當前目錄復制到容器的 code 目錄 ADD . /code/
理解這些 Docker 指令的關鍵在于,一定要牢記容器里的環境和外界(宿主機)是隔離的,它兩是完全不一樣的。換句話說,要搞清楚哪些操作是針對宿主機、哪些操作是針對容器。
FROM python:3.7 指令從倉庫拉取一個包含 python 3.7 的 Linux 操作系統環境(Linux 版本為 Debian)。
RUN 和 WORKDIR 指令都是針對容器的,功能是在容器里創建目錄、并將其設置為工作目錄。注意宿主機是沒有這個目錄的。
ADD 指令出現了兩次。ADD requirements.txt /code/ 意思是將宿主機當前目錄(即 Dockerfile 所在目錄)的 requirements.txt 文件復制到容器的 /code 目錄中。ADD . /code/ 意思是把當前目錄所有內容復制到容器 /code/ 目錄,注意中間那個點。
目前項目依賴的唯一庫就是 Django,所以在項目根目錄創建 requirements.txt 并寫入:
django==2.2
前面不是已經安裝過 Django 了嗎,為什么這里還要安裝?原因是前面是在宿主機安裝的,容器里是沒有 Django 的!
所以目前的文件結構如下:
django_app - Dockerfile - requirements.txt - manage.py - django_app - db.sqlite3
配置文件就寫好了,接下來看看 Docker-compose 怎么用。
Docker-compose
在線上環境中,通常不會將項目的所有組件放到同一個容器中;更好的做法是把每個獨立的功能裝進單獨的容器,這樣方便復用。比如將 Django 代碼放到容器A,將 Mysql 數據庫放到容器B,以此類推。
因此同一個服務器上有可能會運行著多個容器,如果每次都靠一條條指令去啟動,未免也太繁瑣了。 Docker-compose 就是解決這個問題的,它用來編排多個容器,將啟動容器的命令統一寫到 docker-compose.yml 文件中,以后每次啟動這一組容器時,只需要 docker-compose up 就可以了。因此教程也會用 docker-compose 來管理容器。
首先確認 docker-compose 是否安裝成功:
$ docker-compose -v docker-compose version 1.24.1, build 4667896b
確認無誤后,在項目根目錄創建 docker-compose.yml 并寫入:
version: "3" services: app: restart: always build: . # '點'代表當前目錄 command: "python3 manage.py runserver 0.0.0.0:8000" volumes: - .:/code ports: - "8000:8000"
讓我們來分解一下其中的各項含義。
version 代表 docker-compose.yml 的版本,目前最新版為 3,不需要改動它。
接著定義了一個名叫 app 的容器。后面的內容都是 app 容器的相關配置:
restart :除正常工作外,容器會在任何時候重啟,比如遭遇 bug、進程崩潰、docker 重啟等情況。
build :指定一個包含 Dockerfile 的路徑,并通過此 Dockerfile 來構建容器鏡像。注意那個 "." ,代表當前目錄。
command :容器運行時需要執行的命令。這里就是我們很熟悉的運行開發服務器了。
volumes :卷,這是個很重要的概念。前面說過容器是和宿主機完全隔離的,但是有些時候又需要將其連通;比如我們開發的 Django 項目代碼常常會更新,并且更新時還依賴如 Git 之類的程序,在容器里操作就顯得不太方便。所以就有卷,它定義了宿主機和容器之間的映射:"." 表示宿主機的當前目錄,":" 為分隔符,"/code" 表示容器中的目錄。即宿主機當前目錄和容器的 /code 目錄是連通的,宿主機當前目錄的 Django 代碼更新時,容器中的 /code 目錄中的代碼也相應的更新了。這有點兒像是在容器上打了一個洞,某種程度上也是實用性和隔離性的一種妥協。
嚴格意義上講,這里用到的 .:/code 并不是卷,而是叫掛載,它兩是有區別的,只不過 docker-compose 允許將掛載寫到卷的配置中。后面章節會講到。
ports :定義了宿主機和容器的端口映射。容器的隔離不止環境,甚至連端口都隔離起來了。但 web 應用不通過端口跟外界通信當然不行,因此這里定義將宿主機的 8000 端口映射到容器的 8000 端口,即訪問宿主機的 8000 端口就是訪問到了容器的 8000 端口,但要確保端口沒有被其他程序占用。
配置就寫好了。現在項目的目錄結構如下:
django_app - docker-compose.yml - Dockerfile - requirements.txt - manage.py - django_app - db.sqlite3
測試
輸入指令 docker-compose up 啟動容器服務:
$ 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 按照配置文件的要求,成功構建了鏡像及容器,并啟動了容器。
打開瀏覽器,輸入本地 IP 端口 127.0.0.1:8000 :
看到 Django 的小火箭,項目成功運行起來啦。按 Ctrl + C 即可停止開發服務器運行。
停止服務器后實際上容器還存在,只是停止運行了而已。輸入:
$ docker-compose down
就可以刪除容器。
如果想在后臺運行容器,則輸入:
$ docker-compose up -d
另外,如果你需要重新構建鏡像,則輸入命令:
$ docker-compose build
啟動和停止已有的容器:
$ docker-compose start $ docker-compose stop
很簡單吧。
下載太慢?
由于眾所周知的原因,國內的網絡環境非常復雜。在構建鏡像時經常需要從國外的遠程倉庫拉取資源,巋然不動的下載速度真的頭疼。
解決方法就是將資源拉取鏈接修改為國內的鏡像源,比如清華的鏡像源。
修改 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/
重新構建鏡像,下載速度就飛一樣快了。
以上是“Django Docker容器化部署之Django-Docker本地部署的示例分析”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。