По вашему запросу ничего не найдено :(
Убедитесь, что запрос написан правильно, или посмотрите другие наши статьи:
img
Что это вообще такое? Docker Compose является инструментом для определения и запуска контейнерных приложений. С Compose вы получаете возможность настраивать службы используя файл YAML. С помощью одной команды Compose вы создаете и запускаете все службы в соответствии с вашей конфигурацией. Установка начинается с создания каталога проекта: $ mkdir composetest $ cd composetest Создайте файл под названием app.py и вставьте в него следующие данные: import time import redis from flask import Flask app = Flask(__name__) cache = redis.Redis(host='redis', port=6379) def get_hit_count(): retries = 5 while True: try: return cache.incr('hits') except redis.exceptions.ConnectionError as exc: if retries == 0: raise exc retries -= 1 time.sleep(0.5) @app.route('/') def hello(): count = get_hit_count() return 'Hello World! I have been seen {} times. '.format(count) В нашем случае название хоста - redis, который использует порт 6379. Создайте файл под названием needs.txt в каталоге вашего проекта и вставьте его в: flask Redis Теперь следует написать код для файла Dockerfile, содержащий все необходимые переменные для среды разработки. В каталоге вашего проекта создайте файл с именем Dockerfile (файл будет определять среду приложения) и вставьте следующее содержимое: FROM python:3.7-alpine WORKDIR /code ENV FLASK_APP app.py ENV FLASK_RUN_HOST 0.0.0.0 RUN apk add --no-cache gcc musl-dev linux-headers COPY requirements.txt requirements.txt RUN pip install -r requirements.txt COPY . . CMD ["flask", "run"] Определение сервисов осуществляется при создании файла с именем docker-compose.yml в каталоге вашего проекта со следующей информацией: version: '3' services: web: build: . ports: - "5000:5000" redis: image: "redis:alpine" На основании содержания файла происходит запуск двух сервисов: Web и Redis, а в дальнейшем вы можете вносить в этот файл различные БД и иную важную информацию. C помощью команды Compose создайте ваше приложение, после чего из каталога проекта запустите приложение, запустив docker-compose. Вот так: $ docker-compose up Creating network "composetest_default" with the default driver Creating composetest_web_1 ... Creating composetest_redis_1 ... Creating composetest_web_1 Creating composetest_redis_1 ... done Attaching to composetest_web_1, composetest_redis_1 web_1 | * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit) redis_1 | 1:C 17 Aug 22:11:10.480 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo redis_1 | 1:C 17 Aug 22:11:10.480 # Redis version=4.0.1, bits=64, commit=00000000, modified=0, pid=1, just started redis_1 | 1:C 17 Aug 22:11:10.480 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf web_1 | * Restarting with stat redis_1 | 1:M 17 Aug 22:11:10.483 * Running mode=standalone, port=6379. redis_1 | 1:M 17 Aug 22:11:10.483 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128. web_1 | * Debugger is active! redis_1 | 1:M 17 Aug 22:11:10.483 # Server initialized redis_1 | 1:M 17 Aug 22:11:10.483 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled. web_1 | * Debugger PIN: 330-787-903 redis_1 | 1:M 17 Aug 22:11:10.483 * Ready to accept connections Compose извлекает образ Redis, создавая образ для вашего приложения и запускает выбранные службы. В этом случае код копируется в образ во время сборки. Как вам такое? Теперь попробуйте ввести http://localhost:5000/ в браузере, чтобы чекнуть запущенное приложение. Если вы используете Docker для Linux, Docker Desktop для Mac или Docker Desktop для Windows, то теперь веб-приложение должно "смотреть" на порт 5000 на хосте Docker. Введите в своем веб-браузере адрес http://localhost:5000, чтобы увидеть сообщение Hello World. Если не сработает, вы также можете попробовать зайти на http://127.0.0.1:5000. Если вы используете Docker Machine на Mac или Windows, используйте ip MACHINE_VM docker-machine для получения IP-адреса вашего хоста Docker. Затем откройте http://MACHINE_VM_IP:5000 в браузере. Вы должны увидеть сообщение в своем браузере: Hello World! I have been seen 1 times. Переключитесь на другое окно терминала и введите docker image ls, чтобы вывести список локальных образов/контейнеров. Вывод на этом этапе должен показывать redis и web. $ docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE composetest_web latest e2c21aa48cc1 4 minutes ago 93.8MB python 3.4-alpine 84e6077c7ab6 7 days ago 82.5MB redis alpine 9d8fa9aa0e5b 3 weeks ago 27.5MB Важно: Вы можете просматривать запущенные контейнеры с помощью Docker Inspect Tag или ID Запустите docker-compose из каталога вашего проекта во втором терминале, либо нажмите CTRL + C в исходном терминале, где приложение уже запущено и отредактируйте файл Compose. Отредактируйте docker-compose.yml в каталоге вашего проекта для внесения той или иной правки в веб-службе version: '3' services: web: build: . ports: - "5000:5000" volumes: - .:/code environment: FLASK_ENV: development redis: image: "redis:alpine" Новый ключ редактирует каталог проекта на хосте внутри контейнера, что позволяет изменять код без необходимости перестраивать весь образ. Ключ среды устанавливает переменную FLASK_ENV, которая сообщает о запуске в режиме разработки и перезагрузке кода при изменении. Важно: этот режим должен использоваться только при разработке. В каталоге проекта введите docker-compose up, чтобы создать приложение с обновленным файлом Compose, и запустите его. $ docker-compose up Creating network "composetest_default" with the default driver Creating composetest_web_1 ... Creating composetest_redis_1 ... Creating composetest_web_1 Creating composetest_redis_1 ... done Attaching to composetest_web_1, composetest_redis_1 web_1 | * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit) … Поскольку код приложения теперь добавляется в контейнер с помощью тома, вы можете вносить изменения в его код и мгновенно просматривать изменения без необходимости перестраивать образ. Измените сообщение в app.py и сохраните его: Hello from Docker!: return 'Hello from Docker! I have been seen {} times. '.format(count) Обновите результат в вашем браузере (нажмите F5 или Ctrl + F5) . Приветствие должно быть обновлено, а счетчик должен увеличиваться. Вы можете поэкспериментировать с другими командами. Если вы хотите запускать свои службы в фоновом режиме, вы можете сделать следующее: docker-compose up and use docker-compose ps to see what is currently running: $ docker-compose up -d Starting composetest_redis_1... Starting composetest_web_1... $ docker-compose ps Name Command State Ports ------------------------------------------------------------------- composetest_redis_1 /usr/local/bin/run Up composetest_web_1 /bin/sh -c python app.py Up 5000->5000/tcp Команда docker-compose run позволяет вам применять одноразовые команды к вашим сервисов. Например, чтобы увидеть, какие переменные среды доступны для веб-службы: $ docker-compose run web env Выполните команду docker-compose –help, чтобы увидеть весь список доступных команд. Если вы запустили Compose с помощью docker-compose up -d, то нужно будет остановить ваши службы после работы с ними, для этого поможет команда ниже:$ docker-compose stop Если хотите полностью уничтожить контейнер, используйте команду down.
img
Сегодня хотим рассказать про любопытный параметр, который связан с настройкой RTP – потоков в IP – АТС Asterisk. Если Вас не устраивает сброс вызова после 5 минут удержания (режим hold) или сброс через 30 секунд при полном отсутствии RTP/RTCP – у нас есть решение. Настройку осуществим с помощью графического интерфейса FreePBX 13. Решение проблемы Поведение, о котором мы рассказали выше, происходит из – за двух параметров: RTP Timeout и RTP Hold Timeout. По умолчанию, первый равен 30, а второй равен 300 (в секундах). Первый параметр полезен: например, если у вас есть телефонный аппарат, который подключен за NAT, и во время конференции он «отвалится» (пропадет интернет соединение, потеря питания и так далее), то через 30 секунд его сессия будет терминирована автоматически. Второй параметр отвечает за терминирование вызова, который поставлен на удержание. Предположим, что «забывчивый» оператор поставил клиента на удержание на одной из линий и забыл про него. Телефон клиента не дал корректный сигнал отбоя и сессия подвисла. Это занимает соответствующие DSP/CPU ресурсы сервера, и имеет эффект накопления, по итогам которого, могут начаться перебои в связи. Данные параметры можно легко «подкрутить». Переходим в раздел Settings → Asterisk SIP Settings. Во вкладке Chan SIP Settings находим сегмент настроек под названием MEDIA & RTP Settings и правим указанные ниже на скриншоте параметры, согласно своим требованиям:
img
Перед тем как начать чтение этой статьи, советуем ознакомиться с материалом про расчет пути по алгоритму Bellman - ford. Алгоритм диффузного обновления (Diffusing Update Algorithm -DUAL) - один из двух обсуждаемых здесь алгоритмов, изначально предназначенных для реализации в распределенной сети. Он уникален тем, что также удаляет информацию о достижимости и топологии, содержащуюся в конечном автомате алгоритма. Другие обсуждаемые здесь алгоритмы оставляют удаление информации на усмотрение реализации протокола, а не рассматривают этот аспект работы алгоритма внутри самого алгоритма. К 1993 году Bellman-Ford и Dijkstra были реализованы как распределенные алгоритмы в нескольких протоколах маршрутизации. Опыт, полученный в результате этих ранних реализаций и развертываний, привел ко "второй волне" исследований и размышлений о проблеме маршрутизации в сетях с коммутацией пакетов, что привело к появлению вектора пути и DUAL. Поскольку DUAL разработан как распределенный алгоритм, лучше всего описать его работу в сети. Для этой цели используются рисунки 8 и 9. Чтобы объяснить DUAL, в этом примере будет прослеживаться поток A, изучающего три пункта назначения, а затем обрабатываются изменения в состоянии доступности для этих же пунктов назначения. В первом примере будет рассмотрен случай, когда есть альтернативный путь, но нет downstream neighbor, второй рассмотрит случай, когда есть альтернативный путь и downstream neighbor. На рисунке 8 изучение D с точки зрения A: A узнает два пути к D: Через H стоимостью 3. Через C стоимостью 4. A не узнает путь через B, потому что B использует A в качестве своего преемника: A - лучший путь B для достижения D. Поскольку B использует путь через A для достижения D (пункта назначения), он не будет анонсировать маршрут, который он знает о D (через C) к A. B выполнит split horizon своего объявления D на A, чтобы предотвратить образование возможных петель пересылки. A сравнивает доступные пути и выбирает кратчайший путь без петель: Путь через H помечен как преемник. Возможное расстояние устанавливается равным стоимости кратчайшего пути, равной 3. A проверяет оставшиеся пути, чтобы определить, являются ли какие-либо из них downstream neighbors: Стоимость C составляет 3. A знает это, потому что C объявляет маршрут к D со своей локальной метрикой, равной 3. A сохраняет локальную метрику C в своей таблице топологии. Следовательно, A знает локальную стоимость в C и локальную стоимость в A. 3 (стоимость в C) = 3 (стоимость в A), поэтому этот маршрут может быть петлей, следовательно, C не удовлетворяет условию выполнимости. C не помечен как downstream neighbors. Downstream neighbors в DUAL называются возможными преемниками. Предположим, что канал [A, H] не работает. DUAL не полагается на периодические обновления, поэтому A не может просто ждать другого обновления с достоверной информацией. Скорее A должен активно следовать альтернативному пути. Таким образом, это диффузный процесс обнаружения альтернативного пути. Если канал [A, H] не работает, учитывая только D: A проверяет свою локальную таблицу на предмет возможных преемников (Downstream neighbors). Возможных преемников нет, поэтому A должен найти альтернативный путь без петель к D (если он существует). A отправляет запрос каждому соседу, чтобы определить, есть ли какой-либо альтернативный путь без петель к D. В C: Преемником C является E (не A, от которого он получил запрос). Стоимость E ниже, чем стоимость A для D. Следовательно, путь C не является петлей. C отвечает со своей текущей метрикой 3 на A. В B: А - нынешний преемник Б. Посредством запроса B теперь обнаруживает, что его лучший путь к D потерпел неудачу, и он также должен найти альтернативный путь. Обработка B здесь не расписывается, а предоставляется выполнить самостоятельно. B отвечает A, что у него нет альтернативного пути (отвечает бесконечной метрикой). A получает эти ответы: Путь через C - единственный доступный, его стоимость 4. A отмечает путь через C как его преемника. Других путей к D нет. Следовательно, нет подходящего преемника (downstream neighbor). На рисунке 9 пункт назначения (D) был перемещен с H на E. Это будет использоваться во втором примере. В этом примере есть возможный преемник (downstream neighbor). Изучение D с точки зрения A: A узнает два пути к D: Через H стоимостью 4. Через C стоимостью 3. A не узнает никакого пути через B: У B есть два пути к D. Через C и A стоимостью 4. В этом случае B использует как A, так и C. B выполнит split horizon свого объявления D на A, потому что A помечен как преемник. A сравнивает доступные пути и выбирает кратчайший путь без петель: Путь через C отмечен как преемник. Возможное расстояние устанавливается равным стоимости кратчайшего пути, равной 3. A проверяет оставшиеся пути, чтобы определить, являются ли какие-либо из них downstream neighbors: Стоимость H составляет 2. 2 (стоимость в H) = 3 (стоимость в A), поэтому этот маршрут не может быть петлей. Следовательно, H удовлетворяет условию выполнимости. H отмечен как возможный преемник (downstream neighbors). Если канал [A, C] не работает, просто рассматривая A: A проверит свою таблицу локальной топологии на предмет возможного преемника. Возможный преемник существует через H. A переключает свою локальную таблицу на H как лучший путь. Распространяющееся обновление не запускалось, поэтому пути не были проверены или пересчитано. Следовательно, допустимое расстояние изменить нельзя. Он остается на 3. A отправляет обновление своим соседям, отмечая, что его стоимость достижения D изменилась с 3 до 4. Как вы можете видеть, обработка, когда существует возможный преемник, намного быстрее и проще, чем без него. В сетях, где был развернут протокол маршрутизации с использованием DUAL (в частности, EIGRP), одной из основных целей проектирования будет ограничение объема любых запросов, генерируемых в случае отсутствия возможного преемника. Область запроса является основным определяющим фактором того, как быстро завершается двойной алгоритм и, следовательно, как быстро сходится сеть. На рисунке 10 показан базовый законченный автомат DUAL. Вещи, входящие в route gets worse (ухудшение маршрута), могут представлять собой: Отказ подключенного канала или соседа Получение обновления для маршрута с более высокой метрикой Получение запроса от текущего преемника Получение нового маршрута от соседа Обнаружен новый сосед, а также маршруты, по которым он может добраться Получение всех запросов, отправленных соседям, когда маршрут ухудшается
ВЕСЕННИЕ СКИДКИ
40%
50%
60%
До конца акции: 30 дней 24 : 59 : 59