Я не понимаю, как можно добиться развертывания без простоев с помощью Docker.
Допустим, у меня работает контейнер PHP MyWebApp обслуживаемый Nginx Контейнер на том же сервере. Затем я изменяю некоторый код, так как контейнеры Docker являются неизменяемыми, я должен собрать / развернуть MyWebApp Контейнер снова с изменениями кода. За время, необходимое для этого MyWebApp вниз на счет …
Ранее я использовал Ansible или аналогичный для развертывания моего кода, а затем вставил символическую ссылку на новый каталог выпуска в веб-каталог … нулевое время простоя!
Можно ли достичь нулевого времени простоя развертывания с помощью Docker и приложения с одним сервером?
Вы могли бы сделать какой-то сине-зеленое развертывание с вашими контейнерами, используя nginx upstreams
«S:
upstream containers {
server 127.0.0.1:9990; # blue
server 127.0.0.1:9991; # green
}
location ~ \.php$ {
fastcgi_pass containers;
...
}
Затем при развертывании ваших контейнеров вам придется переключаться между отображениями портов:
# assuming php-fpm runs on port 9000 inside the container
# current state: green container running, need to deploy blue
# get last app version
docker pull my_app
# remove previous container (was already stopped)
docker rm blue
# start new container
docker run -p 9990:9000 --name blue my_app
# at this point both containers are running and serve traffic
docker stop green
# nginx will detect failure on green and stop trying to send traffic to it
Чтобы развернуть зеленый, измените имя цвета и сопоставление портов.
Вы можете возиться с параметры входа вышестоящего сервера сделать переключение быстрее или использовать haproxy
в вашем стеке и вручную (или автоматически через сокет управления) управлять бэкэндами.
Если что-то пойдет не так, просто docker start the_previous_color
а также docker stop the_latest_color
,
Поскольку вы используете Ansible, вы можете использовать его для организации этого процесса и даже добавить тесты дыма в смесь, чтобы автоматически происходил откат, если что-то пойдет не так.
Других решений пока нет …