Redis不能作为服务在Docker容器中启动

时间:2018-07-05 17:21:30

标签: docker redis docker-swarm

我对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应用程序,它可以启动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 here

当我像这样开始蜂群时:

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运行良好。 还可以通过运行my_image将Redis和Flask绝对添加到requirements.py中。 有人经历过类似的事情吗?你能帮我吗?

4 个答案:

答案 0 :(得分:0)

您的撰写看起来很正确,并且flask应用程序服务/图像与作为成功服务启动的redis图像无关。

  1. docker stack ps flask_with_redisdocker service logs flask_with_redis_redis说什么?

  2. 我建议在部署堆栈时观察docker events,并查看它对redis服务的作用。

答案 1 :(得分:0)

它为我工作,我对docker-compose文件进行了很少的更改,例如将my_image图像添加到私有注册表中,并且在我执行swarm模式时将redis的全局部署模式作为redis来执行( 1个管理员2个工作节点)。请找到以下步骤。

使用以下命令创建本地注册表。

docker service create registry --name registry --publish published=5003,target=5000 registry:2

如下所述更新图像并构建标签。还要将部署模式更新为全局以供Redis使用。

注意:如果您正在docker swarm上运行,请确保已在所有节点上创建路径/ home / docker / data。

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

在存在所有工件(Dockerfile,docker-compose.yml,requirements.txt app.py)的位置执行以下命令。

运行以下命令来生成图像。

docker-compose up -d

运行以下命令删除容器。

docker-compose down

运行以下命令将创建的my_image映像推送到私有注册表。

docker-compose push

运行以下命令以使用相同的撰写文件创建堆栈。

docker stack deploy --compose-file docker-compose.yml redisapp

供您参考的屏幕截图。

Deployed services in the docker swarm

Able to access from my local machine, docker swarm exit in the azure cloud.

希望它对您有帮助,如果您需要任何帮助,请告诉我。

答案 2 :(得分:0)

感谢您的帮助,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

答案 3 :(得分:0)

我的情况下,它不起作用,因为出于某种原因,我从networks: - webnet中省略了docker-compose.yml。我的理解是,这告诉服务使用与其他服务相同的网络,这就是将python代码中的“ host = redis”正确解析为redis服务器的方法。