Публикация контейнера
Чтобы my-frontend:0.0.1 был доступен на my-domain.com, а my-api:0.0.1 — на api.my-domain.com, подготовьте VPS или выделенный сервер и направьте на него my-domain.com и api.my-domain.com.
Убедитесь, что на сервере установлен Docker.
Загрузка образов на сервер
Сохраните и экспортируйте образы контейнеров командой:
docker save my-frontend:0.0.1 | gzip > /tmp/my-frontend-0.0.1.tar.gz
docker save my-api:0.0.1 | gzip > /tmp/my-api-0.0.1.tar.gzЕсли SSH для VPS настроен, загрузите образы командой scp:
scp /tmp/my-frontend-0.0.1.tar.gz /tmp/my-api-0.0.1.tar.gz [email protected]:~Подключитесь к VPS по SSH:
Загрузите образы контейнеров:
cat ~/my-frontend-0.0.1.tar.gz | docker load
cat ~/api-0.0.1.tar.gz | docker loadЗапуск образов
Перед запуском загруженных образов создайте на сервере сеть Docker:
docker network create my-domainЗапустите образы следующими командами:
docker run -d --network my-domain --name my-frontend my-frontend:0.0.1
docker run -d --network my-domain --name my-api my-api:0.0.1Используются следующие команды и параметры:
run: создаёт и запускает новый контейнер из образа.-d: запускает в фоне и выводит ID нового контейнера.--network: задаёт сетевой режим контейнера.--name: задаёт имя контейнера.my-frontend|my-api: имя контейнера.my-frontend:0.0.1|my-api:0.0.1: образ для создания контейнера.
Настройка Nginx
Способ установки Nginx зависит от ОС сервера.
В Ubuntu установите Nginx следующей командой:
sudo apt install -y nginxКаталог конфигурации Nginx обычно находится в /etc/nginx.
Создайте конфигурацию Nginx для my-domain.com в /etc/nginx/sites-enabled/my-domain.com.
server {
listen 80;
server_name my-domain.com;
location / {
proxy_pass http://ip_of_frontend_container:80;
}
}Получите IP-адрес контейнера интерфейса одной из команд:
docker network inspecy my-domain
docker container inspect my-frontendСоздайте конфигурацию api.my-domain.com в /etc/nginx/sites-enabled/api.my-domain.com.
server {
listen 80;
server_name api.my-domain.com;
## To allow versioning
## We can add a location /v1/ to the next version of our api and keep the old container running
## note that the last / is important
location /v0/ {
proxy_pass http://ip_of_api_container:80/;
}
}Получите IP-адрес контейнера API одной из команд:
docker network inspecy my-domain
docker container inspect my-apiПерезагрузите конфигурацию Nginx:
sudo nginx -s reloadТеперь интерфейс доступен через http://my-domain.com, а серверная часть — через http://api.my-domain.com/v0.
Включение HTTPS с Certbot
Как и для Nginx, способ установки Certbot зависит от ОС.
В Ubuntu используйте команду:
sudo apt install -y certbotПлагин Nginx для Certbot преобразует конфигурацию HTTP в HTTPS с созданным SSL-сертификатом.
Запустите его командой:
certbot --nginx --email [email protected] --agree-tos -d your-domain.com
certbot --nginx --email [email protected] --agree-tos -d api.your-domain.comПосле создания SSL-сертификата обновим конфигурации Nginx.
Обновите /etc/nginx/sites-enabled/my-domain.com следующим образом:
server {
listen 80;
listen 443 ssl;
server_name my-domain.com;
ssl_certificate /etc/letsencrypt/live/my-domain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/my-domain.com/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
if ($scheme != https) {
return 301 https://$host$request_uri;
}
location / {
proxy_pass http://ip_of_your_container:80;
}
}А /etc/nginx/sites-enabled/api.my-domain.com — следующим образом:
server {
listen 80;
listen 443 ssl;
server_name api.my-domain.com;
ssl_certificate /etc/letsencrypt/live/api.my-domain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/api.my-domain.com/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
if ($scheme != https) {
return 301 https://$host$request_uri;
}
location /v0/ {
proxy_pass http://ip_of_your_container:80/;
}
}Добавлены настройки SSL и перенаправление на HTTPS, если схема ещё не HTTPS.
Перезагрузите конфигурацию Nginx:
sudo nginx -s reloadТеперь интерфейс доступен безопасно по HTTPS через https://my-domain.com, а серверная часть — через https://api.my-domain.com/v0.