Redis не запускается как служба внутри контейнера докера - PullRequest
0 голосов
/ 05 июля 2018

Я довольно новичок в докере, поэтому я последовал их официальному руководству и попробовал «ярлык», применимый к моим рабочим проектам. У меня есть следующий 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 с помощью команды requirements.py. Кто-нибудь испытывал нечто подобное? Вы можете помочь мне с этим?

Ответы [ 4 ]

0 голосов
/ 21 марта 2019

В моем случае это не сработало, потому что по какой-то причине я пропустил networks: - webnet из docker-compose.yml. Насколько я понимаю, это говорит службе об использовании той же сети, что и другие, и именно так 'host = redis' в коде python правильно разрешается на сервере redis.

0 голосов
/ 06 июля 2018

Это работает для меня, я выполнил то же самое с очень небольшим количеством изменений в файле docker-compose, таких как добавление образа my_image в личный реестр и режим развертывания как глобальный для 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, needs.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.

Надеюсь, это поможет вам, Дайте мне знать, если вам нужна помощь.

0 голосов
/ 06 июля 2018

Спасибо за вашу помощь Пратис и Брет Фишер. Оказывается, решение проще: мне просто нужно «придерживаться» учебника по 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

0 голосов
/ 06 июля 2018

Ваша композиция выглядит правильно, а служба / изображение приложения фляги не имеет ничего общего с изображением redis, запускающимся как успешная служба.

  1. Что говорят docker stack ps flask_with_redis и docker service logs flask_with_redis_redis?

  2. Я рекомендую посмотреть docker events во время развертывания стека и посмотреть, что он пытается сделать со службой redis.

...