更新应用并重新构建 Docker 镜像

zr - 2024-02-04 22:52:41 - 所属文档:Docker 快速入门文档

现在要对我们的应用做一点点小更新: ## 修改源码 1. 修改 `src/static/js/app.js` 文件的第 56 行:将 `No items yet! Add one above!` 修改为 `You have no todo items yet! Add one above!` 2. 输入之前使用过的命令,重新构建镜像 ``` docker build -t todo-app . ``` 3. 使用新版本镜像运行容器 ``` docker run -dp 3000:3000 todo-app ``` 你可能会看到如下错误信息: ``` docker: Error response from daemon: driver failed ...... Bind for 0.0.0.0:3000 failed: port is already allocated. ``` 之所以出现这个问题,是因为本机的 3000 端口已经被我们之前启动的容器占用了。要解决此问题,我们可以删除旧的容器。 ## 删除容器 要删除容器,首先需要将其停止,然后将其删除。有两种方法可以停止并删除容器: ### 使用 CLI 命令删除容器 1. 使用 `docker ps` 命令获取容器的 ID ``` docker ps ``` 2. 使用 `docker stop` 命令停止容器 ``` # 将下方的 <the-container-id> 替换成你想停止的容器 ID docker stop <the-container-id> ``` 3. 容器停止后,可以使用 `docker rm` 命令删除它 ``` # 将下方的 <the-container-id> 替换成你想删除的容器 ID docker rm <the-container-id> ``` > 备注: > 可以通过增加 `-f` 标志来合并上面的第 2、3 步,使用一条命令停止并删除容器。如:`docker rm -f <the-container-id>` ### 使用 Docker Dashboard 删除容器 通过 Docker Dashboard 可以很方便的删除容器,比通过 CLI 命令查找容器 ID 之后再将其删除要容易得多。 1. 打开 Docker Dashboard 之后,将鼠标悬停在应用程序容器上,在右侧会看到一系列可以对容器进行操作的按钮 2. 点击垃圾桶图标删除容器 3. 在弹出的确认窗口中真正删除它 ![Docker Dashboard - removing a container](https://bianxuebianzuo.oss-cn-shenzhen.aliyuncs.com/uploads/photos/1/2021/08/07/JycIY1628305342_Docker_Dashboard_-_removing_a_container1617268738.png) > 备注:在 Docker Dashboard 中我们还看到了另一个非绿色图标显示的容器,这个容器是没有启动成功的,就是上一次执行命令出现报错的时候留下来的,我们也可以用同样的操作删除掉它。 > ![Docker Dashboard - removing another container](https://bianxuebianzuo.oss-cn-shenzhen.aliyuncs.com/uploads/photos/1/2021/08/07/jPMjx1628305342_Docker_Dashboard_-_removing_another_container1617268739.png) ### 再一次使用新版本镜像运行容器 1. 运行新容器 ``` docker run -dp 3000:3000 todo-app ``` 2. 再一次访问 [http://localhost:3000](http://localhost:3000/) 将会看到我们更新之后的效果了 ![Updated application with updated empty text](https://bianxuebianzuo.oss-cn-shenzhen.aliyuncs.com/uploads/photos/1/2021/08/07/0H45P1628305342_Updated_application_with_updated_empty_text1617268739.png) ## 回顾 在本节中,我们修改了源代码,同时重新执行了构建镜像命令。 虽然我们成功构建了新版本镜像,但是你可能已经注意到了两个小问题: * 镜像更新之前添加的所有代办事项,全部都消失了,数据没有被保存起来 * 本次修改只是一个非常简单的文字更新,但是重新构建镜像的过程中,`Dockerfile` 文件列出的每一个步骤都需要重新执行一遍。肯定还有更高效的方式让容器感知代码的变化,而不必重新执行所有步骤。 之后的章节将会解决这两个问题,在开始解决这些问题之前,让我们先快速了解一下如何把我们构建好的镜像分享给其他人使用。 > 原始资料:[Updating our Application](https://docs.docker.com/get-started/03_updating_app/)