首页 > 解决方案 > Redis 不会作为 docker 容器内的服务启动

问题描述

我对 docker 很陌生,所以我按照他们的官方教程并尝试了适用于我的工作项目的“快捷方式”。我有以下 docker-compose.yml:

version: "3"
services:
  web:
    # replace username/repo:tag with your name and image details
    image: my_image
    deploy:
      replicas: 5
      restart_policy:
        condition: on-failure
      resources:
        limits:
          cpus: "0.1"
          memory: 50M
    ports:
      - "4000:80"
    networks:
      - webnet
  redis:
    image: redis
    ports:
      - "6379:6379"
    volumes:
      - "/home/docker/data:/data"
    command: redis-server --appendonly yes
    networks:
      - webnet
networks:
  webnet:

my_image 是一个简单的烧瓶应用程序,它启动 Flask 和 Redis,然后打印访问次数:

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)

在此处查看Dockerfile

当我像这样开始一个群时:

sudo docker swarm init --advertise-addr <ip>
sudo docker stack deploy -c docker-compose.yml flask_with_redis

图像开始正常,my_image我可以看到它在 127.0.0.1:4000 上运行,但 Redis 永远不会启动。我怀疑我的 有问题docker-compose.yml,尤其是redis服务,因为my_image运行良好。此外,Redis 和 Flask 肯定是my_image通过 running添加到的requirements.py。有没有人经历过类似的事情?你能帮我吗?

标签: dockerredisdocker-swarm

解决方案


感谢您的帮助 Prathis 和 Bret Fisher。事实证明,解决方案更简单:我只需要“坚持”Docker 教程,然后离开

placement:
   constraints: [node.role == manager]

所以完整的(工作的) docker-compile.yml 看起来像这样:

version: "3"
services:
  web:
    # replace username/repo:tag with your name and image details
    image: my_image
    deploy:
      replicas: 5
      restart_policy:
        condition: on-failure
      resources:
        limits:
          cpus: "0.1"
          memory: 50M
    ports:
      - "4000:80"
    networks:
      - webnet
  redis:
    image: redis:latest
    deploy:
      placement:
        constraints: [node.role == manager]
    ports:
      - "6379:6379"
    command: redis-server --appendonly yes
    networks:
      - webnet
networks:
  webnet:

这个容器运行 Redis 很好


推荐阅读