我最近在亚马逊ec2上部署了我的第一个网站,这是一个使用node后端的react网站。这两个服务都是用docker容器化的,沿着一个mongo db服务。我的问题是,部署后进行更改的最佳方法是什么?我假设它会在我的本地机器上工作,推送更改,然后拉入虚拟机,但我不确定如何正确更新Docker映像,或者这是否正确。现在,我正在使用服务并使用nano更新我的代码,显然这需要改变。
我的第二个问题是,当我做这样的更新时,我会删除我的docker镜像,然后在更新代码后重新生成它们。然而,在我的设备上积累了更多的空间,因为在我的ec2上这样做了大约5次之后,我得到了一个错误,设备的存储空间不足。所以我不确定我的方法是否是错误的,或者是否有一个缓存,或者当我重新生成图像时,某个地方的一些其他文件没有被自动删除。
非常感谢您的耐心,因为这是我的第一次部署和第一次在这里发布。谢谢你的时间
我尝试使用git pull来更新我的代码,但我仍然认为id必须重新生成我的docker镜像。我对git也是新手,这对我没有帮助。
2条答案
按热度按时间4xrmg8kj1#
我猜您对安装在EC2示例上的Linux有一些偏好,并且每次想要部署新版本时都在此示例上运行
docker build
。如果是这样的话,你可能会产生很多你从来没有清理过的中间图像。他们可能会占用很多空间。
要解决你眼前的问题,请仔细阅读
docker prune
。你需要仔细阅读它,了解它是如何工作的,它是做什么的。我故意没有在这里发布任何确切的命令,因为如果你不知道自己在做什么,很容易用它们杀死你的服务器数据。构建Docker镜像应该在CI/CD管道(GitHub Actions,GitLab,AWS CodePipeline等)上完成,或者至少在您用于开发的笔记本电脑上完成。
一旦你或你的流水线构建了Docker镜像,你就可以把它放在Docker仓库(Docker Hub,AWS ECR,Artifactory等)上。当部署代码的时候,你让你的docker主机从仓库中拉取代码。
使用自我管理的EC2示例来托管Docker容器有它的用途,但对于您的任务来说,这可能是一种过度。AWS为Docker容器提供托管托管服务,称为ECS。它的成本与具有相同配置的普通EC2相同,但您不必管理EC2示例,AWS将为您完成。
35g0bw712#
你的第一段实际上描述了更新部署的Docker镜像的标准方法:
1.在本地构建和测试你的代码,可能没有Docker。
docker build
一个新的图像出来。docker push
它到注册表(可能是Docker Hub,在AWS上下文中可能是ECR)。1.在远程系统上,
docker pull
更新的映像。docker stop
和docker rm
是旧容器,docker run
是新容器和新镜像。1.可选
docker rmi
旧图像。您通常会设置一个持续集成系统来构建和测试映像并将其推送到存储库,因此您只需将更改提交到源代码控制并等待CI系统运行。
一个好的做法是确保为每个构建使用唯一的Docker标签。时间戳或源代码控制提交ID在这里都很好用。这有几个优点,最明显的是,只需重新部署旧的映像标记,就可以很容易地回滚到以前的映像。如果你(最终)使用Kubernetes,这几乎是必需的;如果你正在使用Docker Compose,那么你可以使用一个环境变量来配置标签,并运行一个命令来进行更新。
您几乎不应该使用
docker exec
来修改容器中的代码,除非您试图在本地分离容器的文件内容。vim
,emacs
,git
,hg
,.只有开发人员使用的东西可能根本不应该包含在你的图像中。避免使用绑定挂载来替换镜像的代码(对于Node,不要将node_modules
目录存储在Docker卷中),即使您正在本地使用Docker进行集成测试。这个推送和运行新映像的序列实际上会导致旧映像留在远程系统上,您可以通过
docker images
看到它们。docker rmi
可以删除单个图像。