今天我想从一个 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/
然后是如何把它推送到镜像仓库:
docker push localhost.localdomain:5000/
要在服务或容器中使用这个镜像,需要指定上面的完整路径,即 localhost.localdomain:5000/<image-name>:latest。
swarm 节点将能够访问该镜像,并拉取和运行它。
关于仓库地址的重要说明
网上大多数教程里,仓库地址写的都是 localhost:5000。不幸的是,这样行不通,使用时通常会超时。如果把它改成 localhost.localdomain,就能正常工作了!
我也不清楚为什么会这样,明明 localhost 和 localhost.localdomain 都解析到 127.0.0.1。