我在Docker Hub,云,Swarm,Swarm模式,docker部署,docker-compose Deploy,......之间感到非常困惑。
生产网站最简单的docker部署实践是什么,它适合单个物理服务器的功能?
该网站有一个全面的docker-compose.yml,它启动了大约12项服务,涵盖各种Web服务器,webpack构建器和数据库。环境变量用于控制开发或生产。
命令行工具用于将Webpack包上传到S3存储桶,并将源映射上传到Sentry。 bundle hash用作发布ID,它存储在一个环境变量中(即HTML用<script src="https://s3.site.com/c578f7cbbf76c117ca56/bundle.js">
编写,其中hash c57...
被写入docker-compose.yml
指向的每个服务指向的环境变量文件中。 {1}})。
我不需要多台服务器,也不需要全面的故障转移策略。我只是想在部署代码更新时避免停机。我是一名开发人员,所以我不需要CI或CD。
我理解不推荐使用docker-machine。 Docker Hub单独处理图像,所以我理解我需要处理“堆栈”概念或一组相关服务的东西。我知道Docker Cloud的stack.yml文件不支持build
或env_file
个密钥,所以我的docker-compose.yml不能直接使用
(在我的docker-compose.yml
中我出现了以下几种模式:
build:
context: .
dockerfile: platforms/frontend/server/Dockerfile
并在Dockerfile中,例如:
COPY platforms/frontend/server /app/platforms/frontend/server
如果没有构建上下文和Dockerfile位置的分离,compose文件似乎不会转换为堆栈文件。
此外,我认为Docker Cloud / Swarm用于管理多个故障转移服务器和循环路由等等?我认为我不需要这些。
最后我开始意识到docker-compose deploy
存在......这是我追求的工具/策略吗?
答案 0 :(得分:3)
让我先纠正一些事情,然后在这种情况下我会进入预期的Docker策略,你说你不需要CI / CD&#34;我认为表示您自己手动将更新部署到服务器。这个工作流程不是我对团队的建议,而是对于&#34; solo dev&#34;它很棒很容易。
&#34;我理解不推荐使用docker-machine。&#34;
不正确。它获得constant updates,包括上个月的版本。它不是为部署/管理许多服务器而设计的,但如果您真的只需要一台服务器用于单个管理员,那么它非常适合远程创建实例,安装docker以及设置TLS证书以通过远程访问docker CLI:docker-machine env <nodename>
最后我开始意识到docker-compose deploy存在
那不是命令。也许你在Swarm中想到docker stack deploy
?我也不建议使用docker-compose作为服务器。它没有生产工具和功能。查看我的AMA post on all the reasons to use a single node Swarm。
请注意,docker-组合开发人员的CLI工具,CI / CD与docker-compose.yml文件不同,我将稍后讨论。
此外,我认为Docker Cloud / Swarm用于管理多个故障转移服务器和循环路由等等?我认为我不需要这些。
Docker Cloud is shutting down in May 2018,所以我不会用它来部署堆栈,但如果你不需要节点高可用性,那么Swarm在单个节点中很棒。
好的,所以从本地开发人员到这个prod服务器的工作流程是:
在本地手动构建您的映像并推送到Docker Hub(或其他注册表)或我首选的GitHub / Bitbucket中的商店代码,并在每次提交时将Docker Hub构建的映像到特定分支(让&# 39; s说master
)。
您的docker-compose文件也是一个堆栈文件。 compose documentation has specific sections for&#34; build&#34; (对于CI / CD服务器或本地机器工作流程)和&#34;部署&#34; (Swarm上的功能)。您应该在本地或通过Docker Hub或自定义CI服务器构建,而不是在Swarm本身。生产工具通常不用于图像构建。
构建服务器后(使用docker-machine),您可以使用本地docker CLI通过docker-machine env <name>
管理远程docker引擎。您将创建一个带有docker swarm init
的单节点Swarm,并且它会接受撰写文件(也就是堆栈文件)。这些文件与旧Docker Cloud堆栈类似,但格式不同。
现在您可以docker stack deploy -c compose.yml <stackname>
使用您设置的envvars,数据量等来启动您的服务。
对于更新,如果您使用17.12或更高版本的docker(最新18.03甚至更好),您可以获得零停机时间,设置update-order: start-first
,并确保所有服务都定义了健康检查,因此docker真正知道当他们准备好连接时。
您可以使用覆盖yaml文件和docker-compose config
将许多撰写文件分层到单个堆栈部署中。
对于服务更新,您只需更新撰写文件并重新执行docker stack deploy
,然后就会检测到更改。
确保每次都使用唯一的图像标记,以便Docker知道要部署哪个特定的SHA。不要继续使用<imagename>:latest
期望它确切地知道是哪个图像。
我希望这会有所帮助,并在评论中提出更多问题,我可以根据需要更新此答案。