如何使用Docker組件開發(fā)Django項目?
- 本地設(shè)置
- Docker Machine
- Docker Compose
- 部署
Docker 是一個開源的應(yīng)用容器引擎,讓開發(fā)者可以打包他們的應(yīng)用以及依賴包到一個可移植的容器中,然后發(fā)布到任何流行的 Linux 機器上,也可以實現(xiàn)虛擬化。自2013年發(fā)布以來,無論是從 Github 上的代碼活躍度,還是 Redhat 在 RHEL6.5 中集成對 Docker 的支持,就連 Google 的 Compute Engine 也支持 Docker 在其之上運行?;馃岢潭瓤梢娨话?!
本篇文章詳細介紹了如何通過 Docker Machine 「系統(tǒng)配置」和 Docker Compose 「多容器應(yīng)用組裝」 提供堆棧完成 Postgres, Redis 和 Django 項目相結(jié)合的開發(fā)。
而在***,該堆棧將包括如下每個服務(wù)的單獨的容器:
- 一個 Web/ Django 的容器
- 一個 Nginx 的容器
- 一個 Postgres 的容器
- 一個 Redis 的容器
- 一個 Data 容器
本地設(shè)置
使用 Docker「v1.6.1」版本我們將使用到 Docker Compose 「v1.2.0」編排一個多容器組成的應(yīng)用程序,使用 Docker Machine「v0.2.0」創(chuàng)建本地和云的 Docker 主機。 按照指示,分別安裝 Docker Compose 和 Machine,然后測試安裝結(jié)果:
- $ docker-machine --version
- docker-machine version 0.2.0 (8b9eaf2)
- $ docker-compose --version
- docker-compose 1.2.0
接下來,根據(jù)以下項目結(jié)構(gòu)從realpython/dockerizing-django
克隆一份項目或自己創(chuà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)備容器運行……
#p#
Docker Machine
開啟 Docker Machine,只需運行:
- $ docker-machine create -d virtualbox dev;
- INFO[0000] Creating CA: /Users/michael/.docker/machine/certs/ca.pem
- INFO[0000] Creating client certificate: /Users/michael/.docker/machine/certs/cert.pem
- INFO[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)"
這個 create 命令設(shè)置一個新的 Machine「開發(fā)環(huán)境」。實際上,它是下載 Boot2Docker 并開始運行 VM?,F(xiàn)在只要在開發(fā)環(huán)境下指定 Docker:
- $ eval "$(docker-machine env dev)"
運行以下命令來查看當(dāng)前正在運行的機器:
- $ docker-machine ls
- NAME ACTIVE DRIVER STATE URL
- dev * virtualbox Running tcp://192.168.99.100:2376
接下來,我們會讓 Django,Postgres 和 Redis 的容器運行起來。
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
在這里,我們定義了五個服務(wù): Web、Nginx、Postgres、Redis 和 Data。
- Web 服務(wù)通過 「Web」 目錄下的 Dockerfile 來進行構(gòu)建,這里也設(shè)置了 Python 環(huán)境設(shè)置,Django 應(yīng)用默認8000端口。這個端口之后轉(zhuǎn)發(fā)到主機環(huán)境的80端口上–例如,Docker Machine。Web 服務(wù)還在容器 Restore.env 文件中增加了環(huán)境變量。
- Nginx 服務(wù)用于反向代理,作用于 Django 或靜態(tài)文件目錄。
- Postgres 服務(wù)是從 Docker Hub 的官方 PostgreSQL鏡像 安裝,安裝 Postgres 后運行在默認的服務(wù)器的5432端口。
- Redis 使用官方 Redis鏡像 安裝,默認 Redis 服務(wù)是運行在6379端口。
- ***,注意有一個單獨的容器來存儲數(shù)據(jù)庫數(shù)據(jù),即為 Data。這有助于確保即使 Postgres 容器完全摧毀數(shù)據(jù)仍然存在。
現(xiàn)在,運行容器,構(gòu)建鏡像,然后開始服務(wù):
- $ docker-compose build
- $ docker-compose up -d
這時可以有時間喝一杯咖啡或走走路,因為你***次運行它將需要一段時間,隨后就可以從 Docker 緩存中建立運行更快的了。
一旦服務(wù)運行,我們就需要創(chuàng)建數(shù)據(jù)庫遷移:
- $ docker-compose run web /usr/local/bin/python manage.py migrate
獲得 Docker Machine 的相關(guān) IP, – docker-machine ip –,然后在您的瀏覽器中輸入IP:
出現(xiàn)上圖后刷新,您應(yīng)該能看到頁面更新。從本質(zhì)上講,我們使用 Redis INCR 來遞增每個處理請求,查看 web/docker_django/apps/todo/views.py
代碼以獲得更多信息。
#p#
同樣,這創(chuàng)造了五項服務(wù),都在不同的容器中運行:
- $ docker-compose ps
- Name Command State Ports
- ----------------------------------------------------------------------------------------------
- dockerizingdjango_data_1 /docker-entrypoint.sh true Up 5432/tcp
- dockerizingdjango_nginx_1 /usr/sbin/nginx Up 0.0.0.0:80->80/tcp
- dockerizingdjango_postgres_1 /docker-entrypoint.sh postgres Up 0.0.0.0:5432->5432/tcp
- dockerizingdjango_redis_1 /entrypoint.sh redis-server Up 0.0.0.0:6379->6379/tcp
- dockerizingdjango_web_1 /usr/local/bin/gunicorn do ... Up 8000/tcp
要查看哪些環(huán)境變量可用于 Web 服務(wù),運行:
- $ docker-compose run web env
要查看日志,運行:
- $ docker-compose logs
您也可以進入 Postgres Shell - - 因為我們已經(jīng)通過 docker-compose.yml 文件設(shè)置在數(shù)據(jù)庫中通過添加用戶/角色,端口轉(zhuǎn)發(fā)到主機環(huán)境中:
- $ psql -h 192.168.99.100 -p 5432 -U postgres --password
準(zhǔn)備部署?先停止運行 docker-compose stop
,然后讓我們的應(yīng)用程序在云中運行!
部署
與我們在本地運行應(yīng)用程序一樣,我們現(xiàn)在可以 push 到與 Docker Machine 環(huán)境完全相同的云托管服務(wù)提供商?,F(xiàn)在讓我們部署到 Digital Ocean 中。
您注冊 Digital Ocean 之后,產(chǎn)生個人訪問令牌 「Personal Access Token」,然后運行以下命令:
- $ docker-machine create \
- -d digitalocean \
- --digitalocean-access-token=ADD_YOUR_TOKEN_HERE \
- Production
這將需要幾分鐘時間來提供 droplet , 并設(shè)置一個新的 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)在我們有兩臺機器運行,一是在本地,一個在 Digital Ocean:
- $ docker-machine ls
- NAME ACTIVE DRIVER STATE URL
- dev * virtualbox Running tcp://192.168.99.100:2376
- production digitalocean Running tcp://104.131.107.8:2376
設(shè)置 production 為激活機器并加載 Docker 環(huán)境到 shell:
- $ docker-machine active production
- $ eval "$(docker-machine env production)"
***,讓我們在云上再次構(gòu)建 Django 的應(yīng)用程序。這時候我們就需要使用一個稍微不同的 Docker Compose 文件,不需要安裝在容器里。為什么呢?因為容器本身非常適合本地開發(fā),這樣我們可以更新「Web」目錄的本地代碼,并且更改代碼立刻對容器產(chǎn)生影響。在生產(chǎn)中,很明顯沒有這個必要。
- $ 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)用程序在運行。