Tag: 面料

如何将Docker添加到Django + Gunicorn + Nginx + Fabric

我使用Django与Gunicorn守护程序和Nginx的代理和静态文件。 我有一个非常简单的结构脚本来“自动化”一些操作: 我们在本地计算机上运行virtualenv 我们只把应用程序推到我们的GitHub仓库 我们SSH到服务器,并运行GitHub仓库中的结构脚本 它从GitHub中拉出,如果需要合并,重新启动Nginx和Gunicorn 这已经有一个问题,例如对于第一次部署,我需要从GitHub手动克隆。 现在,我们正处于一个阶段,我们的应用程序将被发送给我们的客户,以便他们可以托pipe自己的服务器(我们可能需要在不久的将来扩展)。 他们需要Docker容器部署在自己的服务器上。 我将ssh连接到他们的服务器来更新我们的应用程序的部署。 然而,我很难弄清楚什么是最佳的自动化方式,也就是每次使用Fabric的新版本时需要采取的操作顺序。

如何将当前的部署方法迁移到使用Docker的方法?

这将是一个有点问题,所以要预先警告。 简短版本: 我们当前的部署系统使用Fabric和Git来部署Python Web应用程序和支持部件。 该系统运行良好,但经过2个星期的工作来扩展它,我意识到我本质上是试图重新发明Docker轮。 于是我决定考虑重新使用Docker。 但是,我在处理Docker到当前工作stream的方式和方式方面遇到了一些麻烦。 长版: 我目前正在开发一个由Apache,Django后端,Flask前端,ElasticSearch部署和PostgreSQL数据库组成的Web应用程序。 后端和前端通过Apache暴露给外部世界,并通过所述暴露相互通信。 部署使用Fabric和Git。 当Fabricpipe理configuration和pipe理部署环境所涉及的所有任务时,Git用于穿梭变化。 目前的系统对于基本的使用情况已经足够了。 但是,随着我们添加更多的开发者testing不同的分支变得更加棘手。 这是因为每个部署环境(目前有2个,分段服务器和生产服务器)只能服务整个应用程序的一个实例。 另一个难点是确保每个开发人员都有正确的设置来正确运行应用程序。 我花了两个星期的时间来努力改进我们部署的Fabric方面,取得了一些成功。 不幸的是,成功打开了一堆蠕虫,我很快意识到这会导致大量的新增开发,简单地复制Docker已经做的事情。 因此,我决定退后一步,关于如何整合Docker。 尽pipe如此,我还是遇到了一些麻烦。 目标: 保持现在的部署相对简单:目前部署基本上只是导致部署环境获取最新的更改,备份数据库,应用更改,确保应用程序configuration正确,然后重新启动任何必要的服务。 让分支testing变得容易:如果我能告诉testing者等testing分支A,他们只需要浏览到Axyz,分支B可以在Bxyzfind,那将是非常好的。我使用Fabric做的工作pipe理着这一个组件(前端),但是在处理其他组件的Fabric文件时,我意识到事情有可能变成一个可怕的混乱。 允许开发人员在与deployv env相近的环境中进行开发,而不强制他们运行部署env的镜像:部署envs非常适合部署,但并不是每个人都想在他们的开发箱上运行Ubuntu,原因有很多。 Docker在本地复制部署env方面似乎有很大的潜力,但实际上并没有这样做。 问题部分: 我遇到麻烦的地方是决定Fabric,Docker和Git应该做什么。 我应该部署Docker整个映像,包括应用程序还是使用Docker来简单地封装部署环境,然后将应用程序挂载到Docker映像中? 或者我应该尝试在Docker镜像中复制当前进程? 或者我应该想出一些主要利用Docker的新stream程,并减lessFabric和Git的数量? 不幸的是,似乎有很多潜在的方法,我真的不知道哪一个是推荐的,哪一个是不好的主意。 任何人都可以推荐一个部署方法,可以让我实现我的目标,而不会遇到重大问题?

如何为fabric local()命令设置docker-machine env

我试图对docker机器云提供商运行命令,所以我需要采取命令docker-machine env digitalocean的内容,通常如下所示: export DOCKER_TLS_VERIFY="1" export DOCKER_HOST="tcp://1.2.3.4:2376" export DOCKER_CERT_PATH="/Users/danh/.docker/machine/machines/digitalocean" export DOCKER_MACHINE_NAME="digitalocean" # Run this command to configure your shell: # eval "$(docker-machine env digitalocean)" 并使用上面的shell作为前缀,如: print 'outside with:' + local('echo $DOCKER_HOST') with prefix(local('docker-machine env digitalocean', capture=True)): print 'inside with:' + local('echo $DOCKER_HOST') with prefix('DOCKER_HOST="tcp://1.2.3.4:2376"'): print 'inside with (manual):' + local('echo $DOCKER_HOST') 但是,这反而会返回: outside with:tcp://192.168.99.100:2376 inside […]