• [ GEEKHERO:2021 ]
  • Категории
  • Files 42

Воистину гений

СТАТЬЯ ИЛИ СОН?
Готовим образ Docker для статики + nginx + SSL | GEEKHERO
root 11 июля 2022 г. 18:05 | обновлен 18 июля 2022 г. 9:55

Готовим образ Docker для статики + nginx + SSL

Иконка категории
В категории "Linux"

Все статьи связаны непосредственно с ОС Linux: разработка сайтов, поддержка серверов, утилиты и лайфхаки при работе с данной ОС.

Метки: linux, ssl, service, web, docker, site


Предисловие

Имеется статический веб-сайт, никакой динамики, максимум js. Необходимо создать из него Docker-образ, затем загрузить его на Production-сервер и подключить SSL.

Готовим образ

  1. Переходим в каталог с файлом index.html и остальными файлами/каталогами сайта.
  2. Создаем файл Dockerfile (без расширения) и заполняем его следующими данными:
    FROM nginx
    COPY ./ /usr/share/nginx/html/

    Здесь From nginx - будет загружен image nginx с репозитория Docker Hub и будет использоваться по умолчанию он
    Copy “./” - копируем содержимое текущей папки с сохранением дерева каталогов в каталог /usr/share/nginx/html/ .

  3. В терминале переходим в текущий каталог с сайтом и вводим следующее для сборки image:

    docker build -t myproject .

    Не забываем поставить в конце точку. “myproject” - название вашего проекта

  4. Для запуска данного image в контейнере, необходимо прописать следующее:
    docker run -it -p 80:80 myproject

  5. Теперь мы хотим загрузить наш образ (image) в свой репозиторий на Docker Hub, необходимо навесить тег на наш образ:
     

    docker tag myproject legeminus/myprojectrepo

    Тут tag <myproject> - название нашего имеющегося образа Docker. legeminus - ваш юзернейм на DockerHub, myprojectrepo - название тега (репозитория), в моем случае это endlessnights

  6. Пушим (загружаем) на DockerHub свой репозиторий:
    docker push legeminus/myprojectrepo



    Собираем Образ Docker для amd64/linux из под Apple M1 (arm)

    Зачем это нужно. Docker для Apple Silicion готовить образ для ARM, а облачные vps обычно на Linux, поэтому нам нужно изменять целевую платформу, на которой будет запускаться контейнер с данным образом.
    Сразу же пушим в Docker Hub, так как локально данный образ не запустится, так как подготовлен для платформы Linux/AMD64
     

    docker buildx create --use
    docker buildx build --platform linux/amd64,linux/arm64 --push -t legeminus/en2 .

    где legeminis/en2 - тег.
    Точка в конце обязательна!

  7. Готовим конфигурации для Nginx. Создаем файл конфигурации самого проекта:

    server {
        listen       80;
        server_name  endocker.endlessnights.ru;
    
        location / {
            root   /data/www;
            index  index.html;
        }
    }
  8. Также создаем шаблонный файл конфигурации nginx.conf и в конце файла прикладываем ссылку на файл конфигурации проекта:
    user  nginx;
    worker_processes  1;
    error_log  /var/log/nginx/error.log warn;
    pid        /var/run/nginx.pid;
    events {
        worker_connections  1024;
    }
    http {
        include       /etc/nginx/mime.types;
        default_type  application/octet-stream;
        log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                          '$status $body_bytes_sent "$http_referer" '
                          '"$http_user_agent" "$http_x_forwarded_for"';
        access_log  /var/log/nginx/access.log  main;
        sendfile        on;
        #tcp_nopush     on;
        keepalive_timeout  65;
        #gzip  on;
        include /etc/nginx/conf.d/ensite.conf;
    }
  9. Правим файл Dockerfile:
    FROM nginx
    COPY ./ /data/www/
    COPY ensite.conf /etc/nginx/conf.d/ensite.conf
    COPY nginx.conf /etc/nginx/nginx.conf
    
  10. Пересобираем наш проект с помощью Buildx и сразу пушим (Push) его на Docker Hub:
    docker buildx build --platform linux/amd64,linux/arm64 --push -t legeminus/en3
  11. После успешной сборки заходим на наш облачный сервер и загружаем наш образ для его дальнейшего запуска (Я использую TMUX, так как это учебная практика, но на деле можно воспользоваться Systemd.
    docker pull legeminus/en3
    docker run -p 800:80 legeminus/en3

    На данном облачном сервере уже имеется другой экземпляр работающего nginx, на котором "крутятся" другие сервисы/сайты не на рельсах Docker, поэтому мы будем проксировать nginx внутри Docker-контейнера через nginx, который работает в самой ОС Linux как служба, поэтому внешний порт 800, а внутри контейнера 80 порт.

  12. Создаем конфигурацию "внешнего" nginx для нашего проекта, в моем случае endocker (без расширения):

    server {
        listen 80;
        server_name endocker.endlessnights.ru;
        location / {
            proxy_pass http://127.0.01:800;
    }
  13. Создаем символическую ссылку:
    sudo ln -s /etc/nginx/sites-available/endocker /etc/nginx/sites-enabled/
  14. Также, проверяем, что файл конфигурации nginx корректен и перезапускаем nginx:
    sudo nginx -t
    
    sudo service nginx restart
  15. Наконец запускаем certbot:
    certbot
    
    >Saving debug log to /var/log/letsencrypt/letsencrypt.log
    >Plugins selected: Authenticator nginx, Installer nginx
    
    Which names would you like to activate HTTPS for?
    Выбираем наше доменное имя, которое указывали во "внешнем" конфигурационном файле nginx нашего проекта
    Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    1: No redirect - Make no further changes to the webserver configuration.
    2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for
    new sites, or if you're confident your site works on HTTPS. You can undo this
    change by editing your web server's configuration.
    

    Здесь выбираем цифру 2, чтобы все запросы на http редиректились на https.

  16. Итоговый результат файл конфигурации nginx endocker.nginx:

    server_name endocker.endlessnights.ru;
        location / {
            proxy_pass http://127.0.01:800;
        }
    
        listen 443 ssl; # managed by Certbot
        ssl_certificate /etc/letsencrypt/live/endocker.endlessnights.ru/fullchain.pem; # managed by Certbot
        ssl_certificate_key /etc/letsencrypt/live/endocker.endlessnights.ru/privkey.pem; # managed by Certbot
        include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
        ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
    
    }server {
        if ($host = endocker.endlessnights.ru) {
            return 301 https://$host$request_uri;
        } # managed by Certbot
    
    
        listen 80;
        server_name endocker.endlessnights.ru;
        return 404; # managed by Certbot

     

Поделиться записью


Похожие записи:

Card image cap
MikroTik 3G 4G LTE: Мобильный роутер – из LTE в PPP

В данной статье хотелось бы затронуть мобильную тематику в популярной RouterOS, а именно подключение 3G/4G(LTE) модемов к роутерам компании MikroTik

Продолжить Чтение...
Card image cap
Запуск Django сайта на nginx + Gunicorn + SSL

Развернутая инструкция по настройке nginx, Gunicorn и SSL для вашего Django проекта в продакшене.

Продолжить Чтение...
Card image cap
Собираем кластер на ESXI

Кратчайшая минималистичная инструкция по сборке кластера на ESXI и немного про резервирование

Продолжить Чтение...
Категории
Обучение и подготовка (3)
Linux (15)
Телекоммуникации (12)
Программирование (2)
Обзоры на технику (1)
Виртуализация (1)
Web-разработка (5)
Администрирование Windows (0)

Последние записи
Быстро подключаемся к серверам по SSH из терминала
28 Фев 2023
Flask в Docker+Kuberenetes
28 Авг 2022
Готовим образ Docker для Flask приложения
26 Авг 2022

Популярные метки
Copyright 2019-2021  
Обратная связь