Docker 是一個(gè)開(kāi)源的應(yīng)用容器引擎证九,讓開(kāi)發(fā)者可以打包他們的應(yīng)用以及依賴包到一個(gè)可移植的容器中键思,然后發(fā)布到任何流行的 Linux 機(jī)器上,也可以實(shí)現(xiàn)虛擬化甫贯。自2013年發(fā)布以來(lái),無(wú)論是從 Github 上的代碼活躍度看蚜,還是 Redhat 在 RHEL6.5 中集成對(duì) Docker 的支持, 就連 Google 的 Compute Engine 也支持 Docker 在其之上運(yùn)行叫搁。火熱程度可見(jiàn)一斑!
本篇文章詳細(xì)介紹了如何通過(guò) Docker Machine 「系統(tǒng)配置」和 Docker Compose 「多容器應(yīng)用組裝」 提供堆棧完成 Postgres, Redis 和 Django 項(xiàng)目相結(jié)合的開(kāi)發(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
接下來(lái)梨撞,根據(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
開(kāi)啟 Docker Machine雹洗,只需運(yùn)行:
$ 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)"
這個(gè) create 命令設(shè)置一個(gè)新的 Machine「開(kāi)發(fā)環(huán)境」。實(shí)際上卧波,它是下載 Boot2Docker 并開(kāi)始運(yùn)行 VM∈敝祝現(xiàn)在只要在開(kāi)發(fā)環(huán)境下指定 Docker:
$ eval "$(docker-machine env dev)"
運(yùn)行以下命令來(lái)查看當(dāng)前正在運(yùn)行的機(jī)器:
$ docker-machine ls
NAME ACTIVE DRIVER STATE URL
dev * virtualbox Running tcp://192.168.99.100:2376
接下來(lái),我們會(huì)讓 Django港粱,Postgres 和 Redis 的容器運(yùn)行起來(lái)螃成。
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ù)通過(guò) 「Web」 目錄下的 Dockerfile 來(lái)進(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ú)的容器來(lái)存儲(chǔ)數(shù)據(jù)庫(kù)數(shù)據(jù)落午,即為 Data。這有助于確保即使 Postgres 容器完全摧毀數(shù)據(jù)仍然存在肚豺。
現(xiàn)在溃斋,運(yùn)行容器,構(gòu)建鏡像吸申,然后開(kāi)始服務(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 來(lái)遞增每個(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/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ù)对妄,運(yùn)行:
$ docker-compose run web env
要查看日志,運(yùn)行:
$ docker-compose logs
您也可以進(jìn)入 Postgres Shell - - 因?yàn)槲覀円呀?jīng)通過(guò) docker-compose.yml 文件設(shè)置在數(shù)據(jù)庫(kù)中通過(guò)添加用戶/角色敢朱,端口轉(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è)人訪問(wèn)令牌 「Personal Access Token」,然后運(yùn)行以下命令:
$ docker-machine create \
-d digitalocean \
--digitalocean-access-token=ADD_YOUR_TOKEN_HERE \
Production
這將需要幾分鐘時(shí)間來(lái)提供 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 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 為激活機(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合本地開(kāi)發(fā),這樣我們可以更新「Web」目錄的本地代碼淹真,并且更改代碼立刻對(duì)容器產(chǎn)生影響抓韩。在生產(chǎn)中纠永,很明顯沒(méi)有這個(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)行英上。
原文地址:Django Development With Docker Compose and Machine
本文系 OneAPM 工程師編譯整理茂装。OneAPM 是應(yīng)用性能管理領(lǐng)域的新興領(lǐng)軍企業(yè)怠蹂,能幫助企業(yè)用戶和開(kāi)發(fā)者輕松實(shí)現(xiàn):緩慢的程序代碼和 SQL 語(yǔ)句的實(shí)時(shí)抓取。想閱讀更多技術(shù)文章少态,請(qǐng)?jiān)L問(wèn) OneAPM 官方博客。