在Linux系統中Docker是一個應用開發平台,可以把應用在Docker上打包,然後在Linux Docker上運行調試。而且目前Docker是Linux最火熱的軟件發布器之一了。本文就來介紹一下Linux系統使用Docker開發Django項目教程。
通過 Docker Machine 「系統配置」和 Docker Compose 「多容器應用組裝」 提供堆棧可以完成 Postgres, Redis 和 Django 項目相結合的開發。
而在最後,該堆棧將包括如下每個服務的單獨的容器:
一個 Web/ Django 的容器
一個 Nginx 的容器
一個 Postgres 的容器
一個 Redis 的容器
一個 Data 容器
本地設置
使用 Docker「v1.6.1」版本我們將使用到 Docker Compose 「v1.2.0」編排一個多容器組成的應用程序,使用 Docker Machine「v0.2.0」創建本地和雲的 Docker 主機。 按照指示,分別安裝 Docker Compose 和 Machine,然後測試安裝結果:
$ docker-machine --version
docker-machine version 0.2.0 (8b9eaf2)
$ docker-compose --version
docker-compose 1.2.0
接下來,根據以下項目結構從realpython/dockerizing-django克隆一份項目或自己創建項目:
├── 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》
現在我們准備容器運行……
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 命令設置一個新的 Machine「開發環境」。實際上,它是下載 Boot2Docker 並開始運行 VM。現在只要在開發環境下指定 Docker:
$ eval “$(docker-machine env dev)”
運行以下命令來查看當前正在運行的機器:
$ docker-machine ls
NAME ACTIVE DRIVER STATE URL
dev * virtualbox Running tcp://192.168.99.100:2376
接下來,我們會讓 Django,Postgres 和 Redis 的容器運行起來。 上一頁1234下一頁共4頁
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
在這裡,我們定義了五個服務: Web、Nginx、Postgres、Redis 和 Data。 上一頁12 34下一頁共4頁
Web 服務通過 「Web」 目錄下的 Dockerfile 來進行構建,這裡也設置了 Python 環境設置,Django 應用默認8000端口。這個端口之後轉發到主機環境的80端口上–例如,Docker Machine。Web 服務還在容器 Restore.env 文件中增加了環境變量。
Nginx 服務用於反向代理,作用於 Django 或靜態文件目錄。
Postgres 服務是從 Docker Hub 的官方 PostgreSQL鏡像 安裝,安裝 Postgres 後運行在默認的服務器的5432端口。
Redis 使用官方 Redis鏡像 安裝,默認 Redis 服務是運行在6379端口。
最後,注意有一個單獨的容器來存儲數據庫數據,即為 Data。這有助於確保即使 Postgres 容器完全摧毀數據仍然存在。
現在,運行容器,構建鏡像,然後開始服務:
$ docker-compose build
$ docker-compose up -d
這時可以有時間喝一杯咖啡或走走路,因為你第一次運行它將需要一段時間,隨後就可以從 Docker 緩存中建立運行更快的了。
一旦服務運行,我們就需要創建數據庫遷移:
$ docker-compose run web /usr/local/bin/python manage.py migrate
獲得 Docker Machine 的相關 IP, – docker-machine ip –,然後在您的浏覽器中輸入IP:
出現上圖後刷新,您應該能看到頁面更新。從本質上講,我們使用 Redis INCR 來遞增每個處理請求,查看web/docker_django/apps/todo/views.py 代碼以獲得更多信息。 上一頁123 4下一頁共4頁
同樣,這創造了五項服務,都在不同的容器中運行:
$ 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
要查看哪些環境變量可用於 Web 服務,運行:
$ docker-compose run web env