我对Docker Hub、Cloud、Swarm、Swarm Mode、docker deploy、docker-compose Deploy等概念感到非常困惑。
对于一个只需要单台物理服务器的生产网站来说,最简单的Docker部署实践是什么?
该网站有一个全面的docker-compose.yml文件,启动了一些包括各种Web服务器、Webpack构建器和数据库在内的12个服务。使用环境变量控制开发或生产环境。
使用命令行工具将Webpack bundles上传到S3 bucket,并将sourcemaps上传到Sentry。bundle哈希用作发布ID,存储在环境变量中(即HTML写入<script src="https://s3.site.com/c578f7cbbf76c117ca56/bundle.js">
,其中哈希c57...
写入每个服务在docker-compose.yml
中指向的环境变量文件中)。
我不需要超过一台服务器,也不需要全面的故障转移策略。我只想在部署代码更新时避免停机时间。我是一名单独的开发人员,因此不需要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
存在...这是我需要的工具/策略吗?
docker exec
进行迁移,但这并没有解决代码更改的问题,例如在主机上进行git pull
或git checkout
,或者更改环境变量(例如按照文章中所述更新webpack发布哈希)。我知道镜像需要重新构建,因此我想在开发机器上构建它们并将它们推送到Hub、私有注册表或Docker Cloud,然后通过单个命令或在ssh会话中执行的脚本将其拉入生产服务器。对于我的基本用例,我不清楚哪种方法是所有选项中推荐的方法? - Dagradadocker-compose.yml
中的每个服务都指向一个环境文件。当发布前端JavaScript时,.js文件会上传到CDN,并且需要更新env文件中的变量。我不需要停止和启动docker-compose来获取对该文件的更改吗? - Dagradadocker-compose up
才能获取更改。即使使用rebuild
和restart
也无法完成作业。因此,这会导致大约半分钟的停机时间(不是很好)。肯定有更好的方法吧? - Dagrada