本文首發(fā)于Gevin的博客
最近docker發(fā)布了Mac版本和Windows版本,使開發(fā)者用起來(lái)更方便簡(jiǎn)單了。Docker本來(lái)就是虛擬化技術(shù)陆蟆,基于Docker來(lái)構(gòu)建開發(fā)環(huán)境順理成章寇窑。Gevin這兩天也整理了構(gòu)建開發(fā)環(huán)境的思路,在Mac下試驗(yàn)了一下慕的,整體效果還是滿意的阎肝。今天以django開發(fā)環(huán)境的構(gòu)建為例,把構(gòu)建思路記錄下來(lái)肮街,和大家分享一下风题。
一、基本思路
1. 創(chuàng)建一個(gè)用于開發(fā)Django App的目錄
mkdir django-example && cd django-example
2. 構(gòu)建基本開發(fā)環(huán)境
touch Dockerfile
touch pip.conf requirements.txt
pip.conf
文件填入以下內(nèi)容嫉父,以便一會(huì)用pip安裝Python 模塊時(shí)使用阿里云鏡像加速:
[global]
index-url = http://mirrors.aliyun.com/pypi/simple/
[install]
trusted-host=mirrors.aliyun.com
requirements.txt
文件中填入要安裝的Python 模塊:
django
編寫構(gòu)建開發(fā)環(huán)境的Dockerfile文件沛硅,填入以下內(nèi)容:
# MAINTAINER Gevin <flyhigher139@gmail.com>
# DOCKER-VERSION 1.12.0
#
# Dockerizing Python: Dockerfile for building python applications
FROM python:2.7.12
MAINTAINER Gevin <flyhigher139@gmail.com>
WORKDIR /usr/src/app
# 使用阿里云的pip鏡像
COPY pip.conf /root/.pip/pip.conf
COPY requirements.txt /usr/src/app/requirements.txt
RUN pip install -r /usr/src/app/requirements.txt
EXPOSE 8000
CMD ["bash"]
然后執(zhí)行下面命令構(gòu)建鏡像:
docker build -t gevin/django-example:0.1 .
構(gòu)建成功后,執(zhí)行docker images
命令绕辖,可以查看到當(dāng)前構(gòu)建好的image
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
gevin/django-example 0.1 1855fc3c8062 12 hours ago 698.9 MB
3. 使用構(gòu)建的image拉起開發(fā)環(huán)境
執(zhí)行下面命令摇肌,可以以前臺(tái)形式拉起django-example鏡像的一個(gè)container:
docker run -it --rm -v $(pwd):/usr/src/app gevin/django-example:0.1
上面命令使用了data volume
,把當(dāng)前目錄掛載到container中的工作目錄下仪际,這樣當(dāng)前目錄下的所有文件都會(huì)映射到container的工作目錄下围小,在工作目錄下的所有改動(dòng),也都會(huì)保存到宿主機(jī)的當(dāng)前目錄下树碱。
4. 創(chuàng)建django項(xiàng)目
上一步的命令創(chuàng)建了一個(gè)安裝了django的交互式的container肯适,直接在該container中執(zhí)行創(chuàng)建django項(xiàng)目的命令即可:
root@7c91f460599f:/usr/src/app# django-admin startproject dj_example
上述命令,在container中基于django的命令創(chuàng)建了一個(gè)django項(xiàng)目成榜,由于上一步操作時(shí)把宿主機(jī)的當(dāng)前目錄掛載到container的工作目錄下框舔,因此,剛剛在container中創(chuàng)建的django項(xiàng)目,在宿主機(jī)上也能看到刘绣。
container:
root@7c91f460599f:/usr/src/app# ls
Dockerfile dj_example pip.conf requirements.txt
宿主機(jī):
django-example ls
Dockerfile dj_example pip.conf requirements.txt
5. 啟動(dòng)django項(xiàng)目
docker run -it --rm -p 8000:8000 -v $(pwd):/usr/src/app gevin/django-example:0.1 python dj_example/manage.py runserver 0.0.0.0:8000
二樱溉、Docker-compose與Django環(huán)境的結(jié)合
每次使用上面章節(jié)中介紹的冗長(zhǎng)命令來(lái)使用django環(huán)境非常麻煩,docker-compose
可以簡(jiǎn)化操作额港。
首先在當(dāng)前目錄下創(chuàng)建docker-compose.yml
文件:
? django-example touch docker-compose.yml
然后在該文件中寫入如下內(nèi)容:
version: '2'
services:
django-example:
image: gevin/django-example:0.1
volumes:
- ./dj_example:/usr/src/app
ports:
- 8000:8000
command: python manage.py runserver 0.0.0.0:8000
執(zhí)行下面命令即可拉起django服務(wù):
? django-example docker-compose up
# Starting djangoexample_django-example_1
# Attaching to djangoexample_django-example_1
在瀏覽器中訪問http://localhost:8000
饺窿,即可看到默認(rèn)的django頁(yè)面
注:
上面的docker-compose文件,把
./dj_example
目錄掛載到/usr/src/app
移斩,免去執(zhí)行django命令時(shí)肚医,需要對(duì)應(yīng)到下級(jí)目錄的麻煩,但這樣隱藏了原來(lái)container中的requirements.txt
文件向瓷,需要注意肠套。
基于docker-compose 執(zhí)行django 命令
使用docker-compose 的 run
命令,可以在容器內(nèi)執(zhí)行相應(yīng)操作猖任,如:
對(duì)django服務(wù)的數(shù)據(jù)庫(kù)做migrate
操作:
docker-compose run django-example python manage.py migrate
創(chuàng)建超級(jí)用戶:
docker-compose run django-example python manage.py createsuperuser
# Username (leave blank to use 'root'): gevin
# Email address:
# Password:
# Password (again):
# Superuser created successfully.
創(chuàng)建成功后你稚,訪問http://localhost:8000/admin
,即可使用剛創(chuàng)建的用戶(即gevin)朱躺,登錄數(shù)據(jù)庫(kù)管理頁(yè)面
由于使用了數(shù)據(jù)卷刁赖,保存在sqlite數(shù)據(jù)庫(kù)中的數(shù)據(jù)會(huì)一直有效。
三长搀、簡(jiǎn)化方案
上面方案已經(jīng)成功構(gòu)建了django 環(huán)境宇弛,并應(yīng)用于開發(fā)。上面的方案主要是為了闡述實(shí)現(xiàn)思路源请,在實(shí)際操作起來(lái)至少有兩個(gè)麻煩:(1)需要進(jìn)入容器里面創(chuàng)建django項(xiàng)目枪芒;(2)由于django項(xiàng)目是建立在當(dāng)前目錄的子目錄下,使用docker-compose 時(shí)為了命令簡(jiǎn)單通用谁尸,更換了數(shù)據(jù)卷舅踪。
在實(shí)踐中,利用docker-compose的run
命令良蛮,沒必要進(jìn)入容器創(chuàng)建django項(xiàng)目抽碌;只要把django項(xiàng)目建立在當(dāng)前目錄下,也沒必要更換數(shù)據(jù)卷了背镇。
因此咬展,可以把上面的方案再理一下,按下面步驟構(gòu)建開發(fā)環(huán)境瞒斩,并應(yīng)用到開發(fā)中去。
Outline:
1. <a name="create-dockefile"></a>創(chuàng)建Dockerfile文件
對(duì)Python開發(fā)環(huán)境而言涮总,最好再創(chuàng)建pip.conf和requirements.txt文件胸囱,以便方便安裝項(xiàng)目必須的Python依賴,其他語(yǔ)言的開發(fā)環(huán)境就具體情況而定瀑梗。
以Python為例烹笔,Dockerfile 內(nèi)容如下:
# MAINTAINER Gevin <flyhigher139@gmail.com>
# DOCKER-VERSION 1.12.0
#
# Dockerizing Python: Dockerfile for building python applications
FROM python:2.7.12
MAINTAINER Gevin <flyhigher139@gmail.com>
WORKDIR /usr/src/app
# 使用阿里云的pip鏡像
COPY pip.conf /root/.pip/pip.conf
COPY requirements.txt /usr/src/app/requirements.txt
RUN pip install -r /usr/src/app/requirements.txt
EXPOSE 8000
CMD ["bash"]
2. <a name="build-image"></a> 構(gòu)建鏡像
docker build -t gevin/django-example:0.1 .
3. <a name="create-docker-compose"></a> 創(chuàng)建docker-compose文件
docker-compose文件內(nèi)容如下:
version: '2'
services:
django-example:
image: gevin/django-example:0.1
volumes:
- .:/usr/src/app
ports:
- 8000:8000
command: python manage.py runserver 0.0.0.0:8000
4. <a name="create-project"></a> 創(chuàng)建項(xiàng)目
docker-compose run django-example django-admin startproject dj_project .
果然需要migrate數(shù)據(jù)庫(kù)裳扯,創(chuàng)建超級(jí)用戶等,可以在這里一并創(chuàng)建谤职,也可以在后面的開發(fā)中再創(chuàng)建:
docker-compose run django-example python manage.py migrate
docker-compose run django-example python manage.py createsuperuser
5. <a name="run-project"></a> 拉起項(xiàng)目
docker-compose up
四饰豺、其他
Gevin認(rèn)為,雖然基于docker可以構(gòu)建開發(fā)環(huán)境允蜈,但還是vagrant用起來(lái)更舒服冤吨,docker更加適合做CI,測(cè)試和部署饶套。
實(shí)際工作中如何使用docker漩蟆,就仁者見仁,智者見智了妓蛮。