Docker SWARM不起作用。

4
我正在Mac上按照https://docs.docker.com/get-started/part3/的教程学习如何使用swarm节点设置Docker服务。然而,当我访问http://localhost时,会出现Empty reply from server的错误提示。我已经确认端口80正在运行Docker进程,并且Docker容器也在运行。在Mac终端中输入“docker stack deploy -c docker-compose.yml getstartedlab”命令可以创建getstartedlab_webnet网络和getstartedlab_web服务。
Mac-Machine:docker user1$ lsof -i tcp:80
COMMAND    PID USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
com.docke 7592 user1   44u  IPv4 0xfc021b13bc914389      0t0  TCP *:http (LISTEN)

Mac-Machine:docker user1$ curl http://localhost
curl: (52) Empty reply from server


Mac-Machine:docker user1$ docker service ls
ID            NAME               MODE        REPLICAS  IMAGE
w4dghr7jcpca  getstartedlab_web  replicated  5/5       dockhub-user1/get-started:part1


Mac-Machine:docker user1$ docker service ps w4dghr7jcpca
ID            NAME                 IMAGE                        NODE  DESIRED STATE  CURRENT STATE               ERROR  PORTS
4oykrq8ge8yl  getstartedlab_web.1  dockhub-user1/get-started:part1  moby  Running        Running about a minute ago         
ba1n3m1pis2f  getstartedlab_web.2  dockhub-user1/get-started:part1  moby  Running        Running about a minute ago         
kmy8n4tm0n44  getstartedlab_web.3  dockhub-user1/get-started:part1  moby  Running        Running about a minute ago         
cyeyozw6u8x7  getstartedlab_web.4  dockhub-user1/get-started:part1  moby  Running        Running about a minute ago         
0evm9skw7p44  getstartedlab_web.5  dockhub-user1/get-started:part1  moby  Running        Running about a minute ago         


Mac-Machine:docker user1$ docker container ls
CONTAINER ID        IMAGE                                                                                           COMMAND             CREATED             STATUS              PORTS               NAMES
5223c52b2014        dockhub-user1/get-started@sha256:2d3934a04a4aecc453652678489b2d96ce8d3dc5457aa8afdaeb71dbeff236ff   "python app.py"     2 minutes ago       Up About a minute   80/tcp              getstartedlab_web.1.4oykrq8ge8ylw3ilbufxdp4t0
910b7b7521b3        dockhub-user1/get-started@sha256:2d3934a04a4aecc453652678489b2d96ce8d3dc5457aa8afdaeb71dbeff236ff   "python app.py"     2 minutes ago       Up About a minute   80/tcp              getstartedlab_web.4.cyeyozw6u8x7j1zy1k82dugrn
d3ebd24cfe9a        dockhub-user1/get-started@sha256:2d3934a04a4aecc453652678489b2d96ce8d3dc5457aa8afdaeb71dbeff236ff   "python app.py"     2 minutes ago       Up 2 minutes        80/tcp              getstartedlab_web.5.0evm9skw7p44npujg6nbhckmy
ba29ffbdf2ce        dockhub-user1/get-started@sha256:2d3934a04a4aecc453652678489b2d96ce8d3dc5457aa8afdaeb71dbeff236ff   "python app.py"     2 minutes ago       Up About a minute   80/tcp              getstartedlab_web.2.ba1n3m1pis2flttytx87nucvb
6d8af1744b75        dockhub-user1/get-started@sha256:2d3934a04a4aecc453652678489b2d96ce8d3dc5457aa8afdaeb71dbeff236ff   "python app.py"     2 minutes ago       Up About a minute   80/tcp              getstartedlab_web.3.kmy8n4tm0n44jgb1tc34qgeww

这里是docker-compose.yml文件。
version: "3"
services:
  web:
    # replace username/repo:tag with your name and image details
    image: dockhub-user1/get-started:part1
    deploy:
      replicas: 5
      resources:
        limits:
          cpus: "0.1"
          memory: 50M
      restart_policy:
        condition: on-failure
    ports:
      - "80:80"
    networks:
      - webnet
networks:
  webnet:

以下是用于创建图像 dockhub-user1/get-started:part1 的 Docker 文件。

# Use an official Python runtime as a parent image
FROM python:2.7-slim

# Set the working directory to /app
WORKDIR /app

# Copy the current directory contents into the container at /app
ADD . /app

# Install any needed packages specified in requirements.txt
RUN pip install -r requirements.txt

# Make port 80 available to the world outside this container
EXPOSE 80

# Define environment variable
ENV NAME World

# Run app.py when the container launches
CMD ["python", "app.py"]

这是 app.py 文件

from flask import Flask
from redis import Redis, RedisError
import os
import socket

# Connect to Redis
redis = Redis(host="redis", db=0, socket_connect_timeout=2, socket_timeout=2)

app = Flask(__name__)

@app.route("/")
def hello():
    try:
        visits = redis.incr("counter")
    except RedisError:
        visits = "<i>cannot connect to Redis, counter disabled</i>"

    html = "<h3>Hello {name}!</h3>" \
           "<b>Hostname:</b> {hostname}<br/>" \
           "<b>Visits:</b> {visits}"
    return html.format(name=os.getenv("NAME", "world"), hostname=socket.gethostname(), visits=visits)

if __name__ == "__main__":
    app.run(host='0.0.0.0', port=80)

请发布app.py的代码。 - Tarun Lalwani
@TarunLalwani 应用程序文件 app.py 已添加。 - user1187968
你的 Dockerfile 似乎不完整,CMD 行在哪里?它应该启动 app.py。 - Roman Mik
Moby节点和本地主机是同一个东西吗?它们是否在同一台机器上? - Roman Mik
你能否尝试将它映射到主机端口8080而不是80,看看是否有帮助? - Tarun Lalwani
@RomanMik 我已经更新了app.py。另外,它们正在同一台机器上运行。 - user1187968
1个回答

0
经过整个下午的调试,我发现问题是由Kubernetes引起的。停止Docker Desktop中的Kubernetes解决了这个问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接