当前位置: 首页 > 科技观察

如何使用Docker组件开发Django项目?

时间:2023-03-15 19:49:48 科技观察

Directory[-]LocalSetupDockerMachineDockerComposeDeploymentDocker是一个开源的应用容器引擎,允许开发者将他们的应用和依赖包打包到一个可移植的容器中,然后发布到任何流行的Linux机器上,虚拟化也是可能的.自2013年发布以来,无论是从Github上的代码活动,还是Redhat在RHEL6.5中集成Docker支持,甚至谷歌的ComputeEngine也支持Docker在其上运行。热度可见一斑!本文详细介绍了如何通过DockerMachine“系统配置”和DockerCompose“多容器应用组装”提供栈,完成Postgres、Redis、Django项目组合的开发。在***,堆栈将为以下每个服务包含单独的容器:Web/Django容器Nginx容器Postgres容器Redis容器数据容器使用Docker“v1.6.1”进行本地设置我们将使用DockerCompose“v1.2.0”编排多容器应用程序,并使用DockerMachine“v0.2.0”创建本地和云Docker主机。按照提示分别安装DockerCompose和Machine,然后测试安装结果:$docker-machine--versiondocker-machineversion0.2.0(8b9eaf2)$docker-compose--versiondocker-compose1.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│││├──模板││││├──_base.html│││└──home.html│││├──tests.py│││├──urls.py││└──views.py││├──settings.py││├──urls.py│└──wsgi.py│├──管理.py|-dvirtualboxdev;INFO[0000]正在创建CA:/Users/michael/.docker/machine/certs/ca.pemINFO[0000]正在创建客户端证书:/Users/michael/.docker/machine/certs/cert.pemINFO[0001]正在下载boot2docker.isoto/用户/迈克尔/.docker/机器/缓存/boot2docker.iso...INFO[0035]正在创建SSH密钥...INFO[0035]正在创建VirtualBoxVM...INFO[0043]正在启动VirtualBoxVM...INFO[0044]正在等待VM启动...INFO[0094]“dev”已创建并且现在是活动机器。INFO[0094]TopointyourDockerclienttatit,runthisinyourshell:eval"$(docker-machineenvdev)"这个创建命令设置了一个新的Machine“开发环境”实际上,它下载了Boot2Docker并开始运行VM。现在只要在开发环境中指定Docker即可:$eval"$(docker-machineenvdev)"运行如下命令查看当前运行的机器:$docker-machinesNAMEACTIVEDRIVERSTATEURLdev*virtualboxRunningtcp://192.168.99.100:2376接下来我们让Django、Postgres和Redis容器启动并运行。DockerCompose让我们看一下docker-compose.yml文件:web:restart:alwaysbuild:./webexpose:-"8000"links:-postgres:postgres-redis:redisvolumes:-/usr/src/app/staticenv_file:.envcommand:/usr/local/bin/gunicorndocker_django.wsgi:application-w2-b:8000nginx:restart:alwaysbuild:./nginx/ports:-"80:80"volumes:-/www/staticvolumes_from:-weblinks:-web:webpostgres:restart:alwaysimage:postgres:latestvolumes_from:-dataports:-"5432:5432"redis:restart:alwaysimage:redis:latestports:-"6379:6379"data:restart:alwaysimage:postgres:latestvolumes:-/var/lib/postgresqlcommand:true在这里,我们定义了五个服务:Web、Nginx、Postgres、Redis和Data。Web服务是通过“Web”目录下的Dockerfile构建的,这里也设置了Python环境设置,Django应用默认8000端口。然后这个端口转发到宿主机环境的80端口——例如,码头工人。Web服务还将环境变量添加到容器Restore.env文件中。Nginx充当Django或静态文件目录的反向代理。Postgres服务是从DockerHub的官方PostgreSQL镜像安装的。安装Postgres后,它运行在默认服务器的5432端口上。Redis使用Redis官方镜像安装,默认的Redis服务运行在6379端口。***,注意这里有一个单独的容器来存放数据库数据,就是Data。这有助于确保即使Postgres容器被完全破坏,数据仍然存在。现在,运行容器,构建镜像,并开始服务:$docker-composebuild$docker-composeup-d是时候喝杯咖啡或出去散散步了,因为第一次运行需要一段时间它,然后您可以从Docker缓存构建和运行现在更快。服务运行后,我们需要创建数据库迁移:$docker-composerunweb/usr/local/bin/pythonmanage.pymigrate获取DockerMachine的相关IP,-docker-machineip-,然后在你的IP中输入浏览器:在上图之后出现Refresh,您应该会看到页面更新。本质上,我们使用RedisINCR来递增每个处理请求,有关更多信息,请参见web/docker_django/apps/todo/views.py代码。#p#同样,这会创建五个服务,所有服务都在单独的容器中运行:$docker-composepsNameCommandStatePorts-----------------------------------------------------------------------------------------dockerizingdjango_data_1/docker-entrypoint.shtrueUp5432/tcpdockerizingdjango_nginx_1/usr/sbin/nginxUp0.0.0.0:80->80/tcpdockerizingdjango_postgres_1/docker-entrypoint.shpostgresUp0.0.0.0:5432->5432/tcpdockerizingdjango_redis_1/entrypoint.shredis-serverUp0.0.0.0:6379->6379/tcpdockerizingdjango_web_1/usr/local/bin/gunicorndo...up8000/tcp查看有哪些环境变量可供Web服务使用,运行:$docker-composerunwebenv要查看日志,运行:$docker-composelogs你也可以进入PostgresShell--因为我们已经通过docker-compose.yml文件在数据库中设置,端口转发到主机通过添加用户/角色在环境中:$psql-h192.168.99.100-p5432-Upostgres--password准备好部署了吗?我们先运行docker-composestop,让我们的应用运行在云端!部署就像我们在本地运行应用程序一样,我们现在可以推送到与DockerMachine环境完全相同的云托管提供商。现在让我们部署到DigitalOcean。注册DigitalOcean后,生成一个个人访问令牌,然后运行以下命令:$docker-machinecreate\-ddigitalocean\--digitalocean-access-token=ADD_YOUR_TOKEN_HERE\Production供应droplet需要几分钟时间,并设置一个新的DockerMachine生产环境:INFO[0000]CreatingSSHkey...INFO[0001]CreatingDigitalOceandroplet...INFO[0133]"production"hasbeencreatedandisnowtheactivemachine.INFO[0133]TopointyourDockerclientatit,runthisinyourshell:eval"$(docker-machineenvproduction)"现在我们有两台机器在运行,一台在本地,一台在DigitalOcean中:$docker-machinesNAMEACTIVEDRIVERSTATEURLdev*virtualboxRunningtcp://192.168.99.100:2376productiondigitaloceanRunningtcp://104.131.107.8:2376将生产设置为加载为活动机器和Dockershell环境:$docker-machineactiveproduction$eval"$(docker-machineenvproduction)"***让我们再次在云上构建Django的应用程序。这时候我们需要使用一个稍微不同的DockerCompose文件,它不需要安装在容器中。为什么?因为容器本身就非常适合本地开发,我们可以在“web”目录下更新本地代码,代码的改动对容器有立竿见影的影响。在生产中,这显然是没有必要的。$docker-composebuild$docker-composeup-d-fproduction.yml$docker-composerunweb/usr/local/bin/pythonmanage.pymigrate获取与您的DigitalOcean帐户关联的IP地址并在浏览器中查看。如果一切顺利,您应该会看到您的应用程序正在运行。