docker--django

Docker Develop Django Project
原文地址:Django Development With Docker Compose and Machine

以下為譯文
Docker 是一個(gè)開源的應(yīng)用容器引擎茬底,讓開發(fā)者可以打包他們的應(yīng)用以及依賴包到一個(gè)可移植的容器中,然后發(fā)布到任何流行的 Linux 機(jī)器上,也可以實(shí)現(xiàn)虛擬化。自2013年發(fā)布以來,無論是從 Github 上的代碼活躍度念赶,還是 Redhat 在 RHEL6.5 中集成對(duì) Docker 的支持, 就連 Google 的 Compute Engine 也支持 Docker 在其之上運(yùn)行。火熱程度可見一斑宾袜!
本篇文章詳細(xì)介紹了如何通過 Docker Machine 「系統(tǒng)配置」和 Docker Compose 「多容器應(yīng)用組裝」 提供堆棧完成 Postgres, Redis 和 Django 項(xiàng)目相結(jié)合的開發(fā)。
而在最后驾窟,該堆棧將包括如下每個(gè)服務(wù)的單獨(dú)的容器:
一個(gè) Web/ Django 的容器
一個(gè) Nginx 的容器
一個(gè) Postgres 的容器
一個(gè) Redis 的容器
一個(gè) Data 容器


本地設(shè)置
使用 Docker「v1.6.1」版本我們將使用到 Docker Compose 「v1.2.0」編排一個(gè)多容器組成的應(yīng)用程序庆猫,使用 Docker Machine「v0.2.0」創(chuàng)建本地和云的 Docker 主機(jī)。按照指示绅络,分別安裝 Docker Compose 和 Machine阅悍,然后測(cè)試安裝結(jié)果:
$ docker-machine --version docker-machine version 0.2.0 (8b9eaf2) $ docker-compose --version docker-compose 1.2.0

接下來好渠,根據(jù)以下項(xiàng)目結(jié)構(gòu)從realpython/dockerizing-django
克隆一份項(xiàng)目或自己創(chuàng)建項(xiàng)目:
├── docker-compose.yml ├── nginx │ ├── Dockerfile │ └── sites-enabled │ └── django_project ├── production.yml └── web │ ├── Dockerfile │ ├── docker_django │ │ ├── init.py │ │ ├── apps │ │ │ ├── init.py │ │ │ └── todo │ │ │ ├── init.py │ │ │ ├── admin.py │ │ │ ├── models.py │ │ │ ├── templates │ │ │ │ ├── _base.html │ │ │ │ └── home.html │ │ │ ├── tests.py │ │ │ ├── urls.py │ │ │ └── views.py │ │ ├── settings.py │ │ ├── urls.py │ └── wsgi.py │ ├── manage.py │ ├── requirements.txt │ └── static │ │ └── main.css</code>

現(xiàn)在我們準(zhǔn)備容器運(yùn)行……
Docker Machine
開啟 Docker Machine,只需運(yùn)行:

$ docker-machine create -d virtualbox dev
;INFO[0000] Creating CA: /Users/michael/.docker/machine/certs/ca.pemINFO[0000] 
Creating client certificate: /Users/michael/.docker/machine/certs/cert.pemINFO[0001]
 Downloading boot2docker.iso to /Users/michael/.docker/machine/cache/boot2docker.iso...
INFO[0035] Creating SSH key...
INFO[0035] Creating VirtualBox VM...
INFO[0043] Starting VirtualBox VM...
INFO[0044] Waiting for VM to start...
INFO[0094] "dev" has been created and is now the active machine.
INFO[0094] To point your Docker client at it, run this in your shell: eval "$(docker-machine env dev)"

這個(gè) create 命令設(shè)置一個(gè)新的 Machine「開發(fā)環(huán)境」节视。實(shí)際上拳锚,它是下載 Boot2Docker 并開始運(yùn)行 VM。現(xiàn)在只要在開發(fā)環(huán)境下指定 Docker:

$ eval "$(docker-machine env dev)"

運(yùn)行以下命令來查看當(dāng)前正在運(yùn)行的機(jī)器:

$ docker-machine ls 
NAME ACTIVE DRIVER STATE URL dev * virtualbox Running tcp://192.168.99.100:2376

接下來寻行,我們會(huì)讓 Django霍掺,Postgres 和 Redis 的容器運(yùn)行起來。
Docker Compose
讓我們看一看 docker-compose.yml 文件:

web: 
    restart: always 
    build: ./web 
    expose: - "8000" 
    links:
        - postgres:postgres
        - redis:redis 
    volumes:
         - /usr/src/app/static 
    env_file: .env 
    command: /usr/local/bin/gunicorn docker_django.wsgi:application -w 2 -b :8000 nginx: 
    restart: always 
    build: ./nginx/ 
    ports:
        - "80:80" 
    volumes: 
        - /www/static 
    volumes_from: 
        - web 
    links: - web:web 
    postgres: 
        restart: always 
        image: postgres:latest 
        volumes_from:
            - data 
        ports: - "5432:5432" 
    redis:
        restart: always 
        image: redis:latest 
        ports:
            - "6379:6379" 
    data: 
        restart: always 
        image: postgres:latest 
        volumes: 
            - /var/lib/postgresql 
        command: true

在這里拌蜘,我們定義了五個(gè)服務(wù): Web杆烁、Nginx、Postgres简卧、Redis 和 Data兔魂。
Web 服務(wù)通過 「Web」 目錄下的 Dockerfile 來進(jìn)行構(gòu)建,這里也設(shè)置了 Python 環(huán)境設(shè)置举娩,Django 應(yīng)用默認(rèn)8000端口析校。這個(gè)端口之后轉(zhuǎn)發(fā)到主機(jī)環(huán)境的80端口上–例如,Docker Machine铜涉。Web 服務(wù)還在容器 Restore.env 文件中增加了環(huán)境變量智玻。
Nginx 服務(wù)用于反向代理,作用于 Django 或靜態(tài)文件目錄。
Postgres 服務(wù)是從 Docker Hub 的官方 PostgreSQL鏡像 安裝芙代,安裝 Postgres 后運(yùn)行在默認(rèn)的服務(wù)器的5432端口吊奢。
Redis 使用官方 Redis鏡像 安裝,默認(rèn) Redis 服務(wù)是運(yùn)行在6379端口纹烹。
最后页滚,注意有一個(gè)單獨(dú)的容器來存儲(chǔ)數(shù)據(jù)庫(kù)數(shù)據(jù),即為 Data铺呵。這有助于確保即使 Postgres 容器完全摧毀數(shù)據(jù)仍然存在裹驰。

現(xiàn)在,運(yùn)行容器陪蜻,構(gòu)建鏡像邦马,然后開始服務(wù):

$ docker-compose build 
$ docker-compose up -d

這時(shí)可以有時(shí)間喝一杯咖啡或走走路,因?yàn)槟愕谝淮芜\(yùn)行它將需要一段時(shí)間宴卖,隨后就可以從 Docker 緩存中建立運(yùn)行更快的了滋将。
一旦服務(wù)運(yùn)行,我們就需要?jiǎng)?chuàng)建數(shù)據(jù)庫(kù)遷移:

$ docker-compose run web /usr/local/bin/python manage.py migrate

獲得 Docker Machine 的相關(guān) IP症昏, – docker-machine ip –随闽,然后在您的瀏覽器中輸入IP:



出現(xiàn)上圖后刷新,您應(yīng)該能看到頁(yè)面更新肝谭。從本質(zhì)上講掘宪,我們使用 Redis INCR 來遞增每個(gè)處理請(qǐng)求蛾扇,查看web/docker_django/apps/todo/views.py
代碼以獲得更多信息。
同樣魏滚,這創(chuàng)造了五項(xiàng)服務(wù)镀首,都在不同的容器中運(yùn)行:

$ docker-compose ps 
Name Command State Ports----------------------------------------------------------------------------------------------
dockerizingdjango_data_1 /docker-entrypoint.sh true Up 5432/tcpdockerizingdjango_nginx_1 /usr/sbin/nginx Up 0.0.0.0:80->80/tcpdockerizingdjango_postgres_1 /docker-entrypoint.sh postgres Up 0.0.0.0:5432->5432/tcpdockerizingdjango_redis_1 /entrypoint.sh redis-server Up 0.0.0.0:6379->6379/tcpdockerizingdjango_web_1 /usr/local/bin/gunicorn do ... Up 8000/tcp

要查看哪些環(huán)境變量可用于 Web 服務(wù),運(yùn)行:

$ docker-compose run web env

要查看日志鼠次,運(yùn)行:

$ docker-compose logs

您也可以進(jìn)入 Postgres Shell - - 因?yàn)槲覀円呀?jīng)通過 docker-compose.yml 文件設(shè)置在數(shù)據(jù)庫(kù)中通過添加用戶/角色更哄,端口轉(zhuǎn)發(fā)到主機(jī)環(huán)境中:

$ psql -h 192.168.99.100 -p 5432 -U postgres --password

準(zhǔn)備部署?先停止運(yùn)行 docker-compose stop
腥寇,然后讓我們的應(yīng)用程序在云中運(yùn)行成翩!
部署
與我們?cè)诒镜剡\(yùn)行應(yīng)用程序一樣,我們現(xiàn)在可以 push 到與 Docker Machine 環(huán)境完全相同的云托管服務(wù)提供商∩庖郏現(xiàn)在讓我們部署到Digital Ocean 中麻敌。
您注冊(cè) Digital Ocean 之后,產(chǎn)生個(gè)人訪問令牌 「Personal Access Token」掂摔,然后運(yùn)行以下命令:

$ docker-machine create \ -d digitalocean \ --digitalocean-access-token=ADD_YOUR_TOKEN_HERE \Production 

這將需要幾分鐘時(shí)間來提供 droplet , 并設(shè)置一個(gè)新的 Docker Machine 產(chǎn)品環(huán)境:
INFO[0000] Creating SSH key... INFO[0001] Creating Digital Ocean droplet... INFO[0133] "production" has been created and is now the active machine. INFO[0133] To point your Docker client at it, run this in your shell: eval "$(docker-machine env production)"

現(xiàn)在我們有兩臺(tái)機(jī)器運(yùn)行术羔,一是在本地,一個(gè)在 Digital Ocean:

$ docker-machine lsNAME ACTIVE DRIVER STATE URLdev * virtualbox Running tcp://192.168.99.100:2376production digitalocean Running tcp://104.131.107.8:2376

設(shè)置 production 為激活機(jī)器并加載 Docker 環(huán)境到 shell:

$ docker-machine active production $ eval "$(docker-machine env production)"

最后棒呛,讓我們?cè)谠粕显俅螛?gòu)建 Django 的應(yīng)用程序聂示。這時(shí)候我們就需要使用一個(gè)稍微不同的 Docker Compose 文件域携,不需要安裝在容器里簇秒。為什么呢?因?yàn)槿萜鞅旧矸浅_m合本地開發(fā)秀鞭,這樣我們可以更新「Web」目錄的本地代碼趋观,并且更改代碼立刻對(duì)容器產(chǎn)生影響。在生產(chǎn)中锋边,很明顯沒有這個(gè)必要皱坛。

$ docker-compose build $ docker-compose up -d -f production.yml $ docker-compose run web /usr/local/bin/python manage.py migrate

獲取與 Digital Ocean 帳戶相關(guān)聯(lián)的 IP 地址,并在瀏覽器中查看它豆巨。如果一切順利剩辟,你應(yīng)該可以看到你的應(yīng)用程序在運(yùn)行。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末往扔,一起剝皮案震驚了整個(gè)濱河市贩猎,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌萍膛,老刑警劉巖吭服,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異蝗罗,居然都是意外死亡艇棕,警方通過查閱死者的電腦和手機(jī)蝌戒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來沼琉,“玉大人北苟,你說我怎么就攤上這事〈虮瘢” “怎么了粹淋?”我有些...
    開封第一講書人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)瑟慈。 經(jīng)常有香客問我桃移,道長(zhǎng),這世上最難降的妖魔是什么葛碧? 我笑而不...
    開封第一講書人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任借杰,我火速辦了婚禮,結(jié)果婚禮上进泼,老公的妹妹穿的比我還像新娘蔗衡。我一直安慰自己,他們只是感情好乳绕,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開白布绞惦。 她就那樣靜靜地躺著,像睡著了一般洋措。 火紅的嫁衣襯著肌膚如雪济蝉。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,144評(píng)論 1 285
  • 那天菠发,我揣著相機(jī)與錄音王滤,去河邊找鬼。 笑死滓鸠,一個(gè)胖子當(dāng)著我的面吹牛雁乡,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播糜俗,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼踱稍,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了悠抹?” 一聲冷哼從身側(cè)響起珠月,我...
    開封第一講書人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎锌钮,沒想到半個(gè)月后桥温,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡梁丘,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年侵浸,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了旺韭。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡掏觉,死狀恐怖区端,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情澳腹,我是刑警寧澤织盼,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站酱塔,受9級(jí)特大地震影響沥邻,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜羊娃,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一唐全、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蕊玷,春花似錦邮利、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至贸诚,卻和暖如春方庭,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背赦颇。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工二鳄, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留赴涵,地道東北人媒怯。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像髓窜,于是被迫代替她去往敵國(guó)和親扇苞。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

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

  • Docker 是一個(gè)開源的應(yīng)用容器引擎,讓開發(fā)者可以打包他們的應(yīng)用以及依賴包到一個(gè)可移植的容器中程拭,然后發(fā)布到任何流...
    OneAPM閱讀 5,497評(píng)論 2 18
  • # Python 資源大全中文版 我想很多程序員應(yīng)該記得 GitHub 上有一個(gè) Awesome - XXX 系列...
    aimaile閱讀 26,444評(píng)論 6 428
  • 環(huán)境管理管理Python版本和環(huán)境的工具定踱。p–非常簡(jiǎn)單的交互式python版本管理工具。pyenv–簡(jiǎn)單的Pyth...
    MrHamster閱讀 3,783評(píng)論 1 61
  • 《好好學(xué)習(xí)》P89-129頁(yè) 成甲老師苦口婆心地講了提升學(xué)習(xí)能力的三個(gè)技巧(上次講的是三個(gè)底層方法):記錄;定期回...
    曦悅章閱讀 249評(píng)論 0 0