https:///django-docker-postgresql/
在本教程中,我們將使用Docker和PostgreSQL創建一個新的Django項目。Django提供內置的SQLite支持,但即使是本地開發,最好使用像PostgreSQL這樣的“真實”數據庫,它與生產中的內容相匹配。
它可以在本地使用類似的工具運行PostgreSQL Postgres.app然而,許多開發者今天的優先選擇是使用泊塢窗,創建獨立的操作系統的工具。最簡單的思考方式是作為一個包含Django項目所需內容的大型虛擬環境:依賴項,數據庫,緩存服務以及所需的任何其他工具。
使用Docker的一個重要原因是它完全消除了本地開發設置的任何問題。您只需運行整個項目的Docker鏡像,而不必擔心在項目中安裝或運行本地數據庫的軟件包。最重要的是,這可以在小組中共享,使團隊開發更加簡單。
安裝Docker
第一步是為本地計算機安裝桌面Docker應用程序:
Docker的初始下載可能需要一些時間才能下載。這是一個很大的檔案。此時請隨意伸展雙腿!
Docker完成安裝后,我們可以確認正在運行的版本。它至少應該是18版。
Docker Compose是一個額外的工具,自動包含在Docker的Mac和Windows下載中。但是,如果您使用的是Linux,則需要手動添加它。您可以sudo pip install docker-compose 在Docker安裝完成后運行該命令來執行此操作。
Django項目
我們將使用留言板應用從Django的初學者。它使用可在管理員中更新的SQLite為基本留言板應用程序提供代碼。
在桌面上創建一個新目錄并將repo克隆到其中。
$ cd ~/Desktop
$ git clone https://github.com/wsvincent/djangoforbeginners.git
$ cd djangoforbeginners
$ cd ch4-message-board-app
然后安裝指定的軟件包Pipenv 并啟動一個新shell。
$ pipenv install
$ pipenv shell
migrate 在這些更改后確保我們的數據庫。
(mb) $ python manage.py migrate
如果您現在使用該python manage.py runserver 命令,則可以在http:// localhost:8000上看到我們的應用程序的工作版本。

Docker(再次)
希望Docker在這一點上完成安裝。要確認安裝是否成功,請退出本地服務器,Control+c 然后docker run hello-world 在命令行上鍵入。您應該看到這樣的回復:
$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
d1725b59e92d: Pull complete
Digest: sha256:0add3ace90ecb4adbf7777e9aacf18357296e799f81cabc9fde470971e499788
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image whi
ch runs the executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client,
which sent it to your terminal.
To try something more ambitious, you can run an Ubuntu container
with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub./
For more examples and ideas, visit:
https://docs./get-started/
圖像和容器
Docker中有兩個重要的概念:圖像和容器。
- 圖像:項目中所有軟件包的說明列表
- 容器:圖像的運行時實例
換句話說,圖像描述了將要發生的事情,而容器是實際運行的。
要配置Docker鏡像和容器,我們使用兩個文件:Dockerfile 和docker-compose.yml 。
它Dockerfile 包含圖像的說明列表,也就是說,在容器的環境中實際發生了什么。
創建一個新Dockerfile 文件。
然后在文本編輯器中添加以下代碼。
# Pull base image
FROM python:3.7-slim
# Set environment varibles
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1
# Set work directory
WORKDIR /code
# Install dependencies
RUN pip install pipenv
COPY ./Pipfile /code/Pipfile
RUN pipenv install --system --skip-lock
# Copy project
COPY . /code/
在頂部,我們使用Python 3.7 的官方Docker鏡像。接下來我們創建兩個環境變量。PYTHONUNBUFFERED 確保我們的控制臺輸出看起來很熟悉,并且不被Docker緩沖,這是我們不想要的。PYTHONDONTWRITEBYTECODE意味著Python不會嘗試編寫.pyc 我們也不想要的文件。
下一行設置WORKDIR 為/code 。這意味著/code 將來工作目錄位于運行任何命令,就像manage.py 我們可以使用WORKDIR 而不需要記住我們的代碼實際定位在Docker上的確切位置。
然后我們安裝我們的依賴項,確保我們有最新版本pip ,安裝pipenv ,將本地復制Pipfile 到Docker,然后運行它來安裝我們的依賴項。該RUN 命令允許我們在Docker中運行命令,就像在命令行上一樣。
我們無法運行Docker容器,直到它有一個圖像,所以讓我們通過第一次構建圖像??來做到這一點。
如果成功,你會看到很多輸出!
接下來我們需要一個新docker-compose.yml 文件。這告訴Docker 如何運行我們的Docker容器。
(mb) $ touch docker-compose.yml
然后輸入以下代碼。
version: '3.7'
services:
db:
image: postgres:10.1-alpine
volumes:
- postgres_data:/var/lib/postgresql/data/
web:
build: .
command: python /code/manage.py runserver 0.0.0.0:8000
volumes:
- .:/code
ports:
- 8000:8000
depends_on:
- db
volumes:
postgres_data:
在最上面我們使用最新版本的Compose,它是“3.6”。
在db 數據庫,我們要為Postgres的10.1泊塢窗圖像,并使用volumes 告訴撰寫其中容器應設在我們的碼頭工人容器。
因為web 我們正在指定Web服務的運行方式。First Compose需要從當前目錄構建映像并啟動服務器0.0.0.0:8000 。我們volumes 用來告訴Compose將代碼存儲在我們的Docker容器中/code/ 。該ports 配置讓我們自己的8000端口映射到端口8000的泊塢窗容器。這是默認的Django端口。最后depends_on 說我們應該db 在運行我們的Web服務之前先啟動它。
最后一部分volumes 是因為Compose有一條規則,您必須在頂級volumes 鍵中列出命名卷。
Docker已經完成了!
更新到PostgreSQL
我們需要更新我們的留言板應用程序以使用PostgreSQL而不是SQLite。首先安裝psycopg2 我們的數據庫綁定到PostgreSQL。
(mb) $ pipenv install psycopg2-binary
然后更新settings.py 文件以指定我們將使用PostgreSQL而不是SQLite。
# settings.py
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'postgres',
'USER': 'postgres',
'HOST': 'db', # set in docker-compose.yml
'PORT': 5432 # default postgres port
}
}
我們應該migrate 在Docker上使用我們的數據庫。
(mb) $ docker-compose run web python /code/manage.py migrate --noinput
此外,由于留言板應用程序需要使用管理員,因此在Docker上創建超級用戶。運行以下命令后填寫提示。
(mb) $ docker-compose run web python /code/manage.py createsuperuser
運行Docker
我們終于準備好運行Docker了!第一次執行該命令可能需要一段時間,因為Docker必須下載所有必需的內容。但它會緩存這些信息,因此未來的加速會更快。
鍵入以下命令:
(mb) $ docker-compose up -d --build
我們可以通過導航到http://127.0.0.1:8000/來確認它的工作原理,您將看到與以前相同的主頁。

現在轉到http://127.0.0.1:8000/admin并登錄。您可以添加新帖子,然后在主頁上顯示它們,就像Django for Beginners中所述。
完成后,不要忘記關閉Docker容器。
(mb) $ docker-compose down
快速復審
以下是我們在本文中介紹的術語和概念的簡短版本:
- 圖像:項目的“定義”
- 容器:您的項目實際運行的內容(圖像的一個實例)
- Dockerfile:定義圖像的外觀
- docker-compose.yml:一個YAML文件,它接受Dockerfile并添加有關Docker容器在生產中的行為方式的其他說明
我們使用Dockerfile告訴Docker如何構建我們的圖像。然后我們在容器中運行我們的實際項目。該泊塢窗,compose.yml文件為我們的碼頭工人容器應該如何表現在生產的附加信息。
推薦資源
有關Docker本身的更多解釋,我寫了一個單獨的Docker初學者指南。如果你想深入了解Docker我自己使用的一個很棒的資源,現在推薦給其他人,那就是潛入Docker視頻課程。
|