如何使用预构建的本地映像在 Docker Swarm 中创建服务

How to create service in Docker Swarm using prebuilt local image

我在 Docker Swarm 中创建了 3 个节点,1 个作为管理员,另外 2 个作为工作人员,如下所示

现在,当我尝试使用本地映像创建服务(在管理器节点上)时 app1:latest 我收到错误消息(如下所述)。

$ sudo docker service create --name app1 -p 5001:5000 app1:latest                                                                                                                         
image app1:latest could not be accessed on a registry to record
its digest. Each node will access app1:latest independently,
possibly leading to different nodes running different
versions of the image.

i6s8hyzzuxx35enl2j0xd3ef9
overall progress: 0 out of 1 tasks 
1/1: No such image: app1:latest 

另一方面,如果我使用来自 Docker Hub 的 public 图像(例如 nginx 图像),那么我可以轻松创建服务。

如何使用预构建的本地镜像来创建服务?

下面是用于构建映像的 Dockerfileapp.py 文件 app1:latest

Docker文件

FROM ubuntu:18.04

RUN apt-get update \
    && apt-get install -y apt-utils \
    python3.6 \
    python3-pip

WORKDIR /app
COPY . /app

RUN pip3 install -r requirements.txt

ENTRYPOINT ["python3"]
CMD ["app.py"]

app.py

from flask import Flask
from flask import jsonify

app = Flask(__name__)

@app.route('/')
def index():
    return jsonify('App #1')


if __name__ == '__main__':
    app.run(host='0.0.0.0', debug=True)

我已经关注了一些关于 Docker Swarm 的文章和视频教程,但他们都使用来自 Docker Hub 的 public 图像来创建服务

除非您将映像“推送”到 docker 注册表(docker 集线器或 a private one),否则您构建的映像仅存在于您的本地计算机上(并且不可访问群节点)。

因此,您要么需要推送到 docker 集线器,要么 运行 您自己的注册表。在后一种情况下,请确保可以从 swarm 节点访问注册表主机。