更新Docker镜像

Docker入门(1)中,我们初步尝试了Docker的特性,并将getting-started这个演示用的todo应用做了容器化尝试。接下来,我们会进一步尝试更新它的代码,并构建新的Docker镜像,最终把它推送到Docker镜像仓库中。

更新应用代码

之前,在没有任何todo item时,getting-started会在页面显示“No items yet! Add one above!”。现在,我们尝试修改这行文案内容。

编辑src/static/js/app.js文件

使用编辑器打开src/static/js/app.js文件,并做如下内容调整:

...
 -                <p className="text-center">No items yet! Add one above!</p>
 +                <p className="text-center">You have no todo items yet! Add one above!</p>
 ...

构建新镜像

保存src/static/js/app.js文件后,就可以根据新文件内容来构建新镜像了:

docker build -t getting-started .

本地验证

构建新镜像后,我们可以通过docker run命令在本地验证修改效果。命令如下:

docker run -dp 3000:3000 getting-started

注意事项

在启动新docker镜像的容器时,有可能出现类似如下内容的错误:

docker: Error response from daemon: driver failed programming external connectivity on endpoint laughing_burnell 
(bb242b2ca4d67eba76e79474fb36bb5125708ebdabd7f45c8eaf16caaabde9dd): Bind for 0.0.0.0:3000 failed: port is already allocated.

这个错误的原因是之前启动的旧容器还未停止,它已经占用了3000端口,导致新容器无法启动。要解决这个问题,需要首先把旧容器停掉。

删除旧的容器

如果你使用终端停止旧容器,可以依次执行如下命令:

  1. 通过docker ps命令查找容器ID;
docker ps
  1. 使用docker stop命令来停掉旧容器。根据docker ps获得的容器ID替换下面命令中的
docker stop <the-container-id>
  1. 旧容器停止后,还可以使用docker rm命令来删除它;
docker rm <the-container-id>

你也可以一步实现停止并删除容器,只需要在docker rm命令中增加force即可。例如docker rm -f

如果你使用Docker Desktop停止容器,可以根据下面指令执行:

  1. 打开Docker Desktop的Container面板;
  2. 在需要删除的旧容器条目中,选择Action一栏的垃圾桶图标;
  3. 在弹出的对话框中,选择“Delete forever”即可。

docker_desktop_delete

启动新的容器

再次使用docker run命令,启动新容器:

docker run -dp 3000:3000 getting-started

打开浏览器,访问http://localhost:3000,就能看到更新文案后的页面啦。

todo-list-empty-new

分发Docker镜像

更新Docker镜像后,可以对外分发新镜像。完成该过程,需要使用Docker注册中心(Docker registry)。默认的Docker注册中心就是Docker Hub。

创建镜像仓库

要分发Docker镜像,首先需要创建一个Docker仓库并向其推送镜像文件。以下是具体操作流程:

  1. Docker Hub完成注册或登录;
  2. 点击页面的“Create Repository”按钮;
  3. 仓库名称可以使用getting-started;切记仓库可见性选择Public;
  4. 点击“Create”按钮,完成创建过程。

如果你在页面看到如下图所示内容,则证明Docker仓库已经创建成功,并且可以使用图中命令完成Docker镜像的推送。

repo-create

推送镜像

使用Play with Docker验证