歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> 如何使用Docker組件開發Django項目?

如何使用Docker組件開發Django項目?

日期:2017/2/27 15:47:31   编辑:Linux教程

Docker 是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然後發布到任何流行的 Linux 機器上,也可以實現虛擬化。自2013年發布以來,無論是從 Github 上的代碼活躍度,還是 Redhat 在 RHEL6.5 中集成對 Docker 的支持, 就連 Google 的 Compute Engine 也支持 Docker 在其之上運行。火熱程度可見一斑!

本篇文章詳細介紹了如何通過 Docker Machine 「系統配置」和 Docker Compose 「多容器應用組裝」 提供堆棧完成 Postgres, Redis 和 Django 項目相結合的開發。

而在最後,該堆棧將包括如下每個服務的單獨的容器:

  • 一個 Web/ Django 的容器
  • 一個 Nginx 的容器
  • 一個 Postgres 的容器
  • 一個 Redis 的容器
  • 一個 Data 容器

用Docker組件開發Django項目

本地設置

使用 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 的容器運行起來。

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。

  • 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:

用Docker組件開發Django項目

出現上圖後刷新,您應該能看到頁面更新。從本質上講,我們使用 Redis INCR 來遞增每個處理請求,查看 web/docker_django/apps/todo/views.py 代碼以獲得更多信息。

同樣,這創造了五項服務,都在不同的容器中運行:

$ 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

要查看日志,運行:

$ docker-compose logs

您也可以進入 Postgres Shell - - 因為我們已經通過 docker-compose.yml 文件設置在數據庫中通過添加用戶/角色,端口轉發到主機環境中:

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

准備部署?先停止運行 docker-compose stop,然後讓我們的應用程序在雲中運行!

部署

與我們在本地運行應用程序一樣,我們現在可以 push 到與 Docker Machine 環境完全相同的雲托管服務提供商。現在讓我們部署到 Digital Ocean 中。

您注冊 Digital Ocean 之後,產生個人訪問令牌 「Personal Access Token」,然後運行以下命令:

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

這將需要幾分鐘時間來提供 droplet , 並設置一個新的 Docker Machine 產品環境:

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)"

現在我們有兩台機器運行,一是在本地,一個在 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

設置 production 為激活機器並加載 Docker 環境到 shell:

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

最後,讓我們在雲上再次構建 Django 的應用程序。這時候我們就需要使用一個稍微不同的 Docker Compose 文件,不需要安裝在容器裡。為什麼呢?因為容器本身非常適合本地開發,這樣我們可以更新「Web」目錄的本地代碼,並且更改代碼立刻對容器產生影響。在生 產中,很明顯沒有這個必要。

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

獲取與 Digital Ocean 帳戶相關聯的 IP 地址,並在浏覽器中查看它。如果一切順利,你應該可以看到你的應用程序在運行。

Copyright © Linux教程網 All Rights Reserved