如何構(gòu)建基于docker的開發(fā)環(huán)境

本文首發(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)肮街,和大家分享一下风题。

如何構(gòu)建基于docker的開發(fā)環(huán)境

一、基本思路

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. 創(chuàng)建Dockerfile文件
  2. 構(gòu)建鏡像
  3. 創(chuàng)建docker-compose文件
  4. 創(chuàng)建項(xiàng)目
  5. 拉起項(xiàng)目

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漩蟆,就仁者見仁,智者見智了妓蛮。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末怠李,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子蛤克,更是在濱河造成了極大的恐慌捺癞,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,013評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件构挤,死亡現(xiàn)場(chǎng)離奇詭異髓介,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)儿倒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,205評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門版保,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人夫否,你說(shuō)我怎么就攤上這事彻犁。” “怎么了凰慈?”我有些...
    開封第一講書人閱讀 152,370評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵汞幢,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我微谓,道長(zhǎng)森篷,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,168評(píng)論 1 278
  • 正文 為了忘掉前任豺型,我火速辦了婚禮仲智,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘姻氨。我一直安慰自己钓辆,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,153評(píng)論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著前联,像睡著了一般功戚。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上似嗤,一...
    開封第一講書人閱讀 48,954評(píng)論 1 283
  • 那天啸臀,我揣著相機(jī)與錄音,去河邊找鬼烁落。 笑死乘粒,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的顽馋。 我是一名探鬼主播谓厘,決...
    沈念sama閱讀 38,271評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼寸谜!你這毒婦竟也來(lái)了竟稳?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,916評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤熊痴,失蹤者是張志新(化名)和其女友劉穎他爸,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體果善,經(jīng)...
    沈念sama閱讀 43,382評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡诊笤,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,877評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了巾陕。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片讨跟。...
    茶點(diǎn)故事閱讀 37,989評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖鄙煤,靈堂內(nèi)的尸體忽然破棺而出晾匠,到底是詐尸還是另有隱情,我是刑警寧澤梯刚,帶...
    沈念sama閱讀 33,624評(píng)論 4 322
  • 正文 年R本政府宣布凉馆,位于F島的核電站,受9級(jí)特大地震影響亡资,放射性物質(zhì)發(fā)生泄漏澜共。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,209評(píng)論 3 307
  • 文/蒙蒙 一锥腻、第九天 我趴在偏房一處隱蔽的房頂上張望嗦董。 院中可真熱鬧,春花似錦瘦黑、人聲如沸展懈。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,199評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)存崖。三九已至,卻和暖如春睡毒,著一層夾襖步出監(jiān)牢的瞬間来惧,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,418評(píng)論 1 260
  • 我被黑心中介騙來(lái)泰國(guó)打工演顾, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留供搀,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,401評(píng)論 2 352
  • 正文 我出身青樓钠至,卻偏偏與公主長(zhǎng)得像葛虐,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子棉钧,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,700評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容