本文主要是作為官方Quickstart: Compose and Django的導(dǎo)讀逻谦,如果你當(dāng)下還沒(méi)了解過(guò)Docker颖变,但想知道如何利用Docker來(lái)管理自己本地的開(kāi)發(fā)環(huán)境生均,并統(tǒng)一開(kāi)發(fā)和測(cè)試的環(huán)境,那你可以參考以下內(nèi)容。
需求:
使用Docker搭建Django開(kāi)發(fā)環(huán)境腥刹,即本地只需要有python代碼即可马胧。
預(yù)備知識(shí):
Docker作為容器,和傳統(tǒng)虛擬機(jī)是不一樣的衔峰,如下圖所示佩脊,它是基于Docker Engine的一個(gè)容器蛙粘,且在這一層次上是相互隔離的,而傳統(tǒng)虛擬化則是要虛擬化整個(gè)系統(tǒng)威彰,因此理論上Docker容器可以更有效的利用資源出牧,你可以很容易在本地環(huán)境搭建多服務(wù)的復(fù)雜系統(tǒng)環(huán)境。本篇以一臺(tái)web服務(wù)器及一臺(tái)數(shù)據(jù)庫(kù)服務(wù)器為例歇盼,當(dāng)然也可以搭建更復(fù)雜的舔痕,比如加入一臺(tái)redis機(jī)器等等。
更多Docker介紹可以看開(kāi)源版本的《Docker 從入門到實(shí)踐》豹缀, 內(nèi)容可能已經(jīng)有點(diǎn)老伯复,但是基本上還是作為參考。
更多邢笙,等新啸如,等詳細(xì)的解釋看官方介紹What is a Cantainer
容器是基于一個(gè)鏡像(image)建立的,比如本地有一個(gè)ubuntu的鏡像氮惯,我們可以基于該鏡像去新建多個(gè)容器實(shí)例叮雳,而它們之間可以做到互聯(lián),與本地機(jī)器的文件共享等妇汗。從而可以達(dá)到前文提到的帘不,快速在本地搭建一個(gè)多服務(wù)器的復(fù)雜環(huán)境。
用戶可以很方便地對(duì)容器進(jìn)行啟動(dòng)铛纬、停止厌均、刪除等操作。一個(gè)基本的容器啟動(dòng)例子如下告唆,它在啟動(dòng)一個(gè)容器后棺弊,打印一條Hello world
sudo docker run ubuntu:14.04 /bin/echo 'Hello world'
鏡像被倉(cāng)庫(kù)統(tǒng)一管理,Docker官方有自己的倉(cāng)庫(kù)Docker Hub擒悬,國(guó)內(nèi)可以使用阿里云的鏡像倉(cāng)庫(kù)模她,我用的是阿里的,需要在阿里后臺(tái)生成自己的私有地址懂牧,然后在Docker中配置侈净。從鏡像倉(cāng)庫(kù)獲取鏡像到本地后,就可以基于鏡像新建容器使用了僧凤。
當(dāng)然也可以搭建自己的私有倉(cāng)庫(kù)畜侦,在團(tuán)隊(duì)或公司內(nèi)部使用。
鏡像定制躯保,當(dāng)倉(cāng)庫(kù)中的官方鏡像無(wú)法滿足需求時(shí)旋膳,就需要自定義鏡像,所有的自定義鏡像都可以上傳到倉(cāng)庫(kù)中途事,共享給其他用戶验懊。Docker鏡像的定制主要通過(guò)Dockerfile指令文件實(shí)現(xiàn)擅羞,在指令文件中實(shí)現(xiàn)自己的需求即可孕锄,比如使用COPY命令將本機(jī)文件復(fù)制到容器中等痢畜。
Docker Compose止潮,安裝最新的Docker讯屈,默認(rèn)已經(jīng)包含這個(gè)工具,主要用于定義及啟動(dòng)多容器的場(chǎng)景(當(dāng)前例子基于此工具)痛黎,它需要一個(gè)docker-compose.yml文件來(lái)配置需要啟動(dòng)的容器及相關(guān)配置狸相,然后就可以用下述語(yǔ)句新建及啟動(dòng)配置文件中的多容器
docker-compose up
docker-compose.yml實(shí)例:
version: '2'
services:
db: //數(shù)據(jù)庫(kù)容器
image: postgres
web: //web服務(wù)器容器
build: .
command: python manage.py runserver 0.0.0.0:8000
volumes: //掛載本地機(jī)器文件夾
- .:/code
ports:
- "8000:8000"
depends_on:
- db
搭建Django開(kāi)發(fā)環(huán)境:
Step 1: Define the project components
這個(gè)步驟主要是定義project的內(nèi)容拟赊,這里的“project”指我們要搭建的基于Docker的Django開(kāi)發(fā)環(huán)境痛垛,具體會(huì)包含Docker容器配置文件Dockerfile草慧,Django環(huán)境需要的requirements.txt配置,docker-compose.yml配置
Dockerfile 實(shí)例:
FROM python:2.7 注:基礎(chǔ)鏡像
ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code 注:切換工作上下文
ADD requirements.txt /code/
RUN pip install -r requirements.txt 注:安裝python依賴
ADD . /code/
Step 2:Create a Django project
官方例子是用docker-compose命令運(yùn)行web服務(wù)器(docker-compose.yml配置了web和db兩個(gè)容器)匙头,然后調(diào)用django-admn新建Django項(xiàng)目,由于掛在了本地目錄到容器內(nèi)部仔雷,因此當(dāng)前命令生成的django項(xiàng)目文件能在本地機(jī)器目錄直接訪問(wèn)蹂析。
docker-compose run web django-admin.py startproject composeexample .
注意,此時(shí)的web容器已經(jīng)包含django環(huán)境了碟婆,因?yàn)樵趙eb容器的Dockerfile文件配置了python環(huán)境搭建的命令电抚,如下所示:
RUN pip install -r requirements.txt
對(duì)于實(shí)際工作項(xiàng)目,我們只需在對(duì)應(yīng)的本地機(jī)器目錄(即運(yùn)行docker-compose命令的上下文目錄)準(zhǔn)備好項(xiàng)目代碼即可
$ ls -l
drwxr-xr-x 2 root root composeexample 注:該項(xiàng)目文件可以是實(shí)際工作代碼文件夾
-rw-rw-r-- 1 user user docker-compose.yml
-rw-rw-r-- 1 user user Dockerfile
-rwxr-xr-x 1 root root manage.py
-rw-rw-r-- 1 user user requirements.txt
Step 3:Connect the database
這里主要就是設(shè)置Django框架下的settings.py文件竖共,注意HOST名字使用
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'postgres',
'USER': 'postgres',
'HOST': 'db', //另一個(gè)容器的名字
'PORT': 5432,
}
}
最后就是再次使用docker-compose新建并啟動(dòng)多個(gè)容器
$ docker-compose up