今天我想从一个 Node.js 项目生成 Docker 镜像,然后把它部署到我本地的测试 swarm 上。

不幸的是,如果在本地构建 Docker 镜像,这个镜像只会存储在创建它的那个节点上,只有该节点能访问,swarm 里的其他节点是访问不到的。

解决办法是把镜像推送到 Docker 镜像仓库,这样 swarm 里所有节点都可以从那里拉取镜像。

创建镜像仓库

要在 swarm 中创建一个镜像仓库服务,运行:

docker service create —name registry —publish 5000:5000 registry:latest

这会创建 registry 服务并在 swarm 中运行它,swarm 里的所有节点都可以访问它。

把镜像推送到镜像仓库

要把镜像推送到镜像仓库,需要做两件事——先打标签,再推送镜像。

下面是一个一步完成构建和打标签的例子:

docker build . -t localhost.localdomain:5000/:latest

然后是如何把它推送到镜像仓库:

docker push localhost.localdomain:5000/:latest在服务/容器等中使用镜像

要在服务或容器中使用这个镜像,需要指定上面的完整路径,即 localhost.localdomain:5000/<image-name>:latest。

swarm 节点将能够访问该镜像,并拉取和运行它。

关于仓库地址的重要说明

网上大多数教程里,仓库地址写的都是 localhost:5000。不幸的是,这样行不通,使用时通常会超时。如果把它改成 localhost.localdomain,就能正常工作了!

我也不清楚为什么会这样,明明 localhost 和 localhost.localdomain 都解析到 127.0.0.1。