Типичный пример Docker с Nginx и SSL

Опубликовано admin -

Docker Nginx SSLВ нашем случае, для быстрого развертывания web-сервера понадобится следующее:

  1. Docker
  2. Nginx
  3. Certbot

Директория проекта: cerbottest:

mkdir cerbottest

Далее создадим файл docker-compose:

services:
    web1:
        image: nginx
        ports:
          - "8081:80"
          - "443:443"
        volumes:
          - ./nginx/default.conf:/etc/nginx/conf.d/default.conf:ro
          - ./nginx/web.conf:/etc/nginx/conf.d/web.conf:ro
          - ./volume1/www:/var/www
          - ./nginx/cert.pem:/etc/cert.pem
          - ./nginx/key.pem:/etc/key.pem
    web2:
        image: httpd
        ports:
          - 8082:80
    php:
        image: php:8.2-fpm
        ports:
          - 9001:9001
        volumes:
          #- /mnt:/var/www
           - ./volume1/www:/var/www
    certbot:
        ports:
          - "6000:80"
        env_file:
          - .env
        # и снова мониторуем директорию nginx
        volumes:
          - ./nginx/:/etc/nginx/
        build:
          context: ./certbot
          dockerfile: Dockerfile
          # задаем переменные среды
          args:
            DOMAIN_EMAIL: ${DOMAIN_EMAIL}
            DOMAIN_URL: ${DOMAIN_URL}
configs:
  app_config:
    external: true
  nginx_config:
    external: true

 

Также отдельную директорию certbot с файлами Dockerfile и  create-certificate.sh:

Dockerfile:

# Dockerfile
FROM ubuntu:22.04

EXPOSE 6000 80

# читаем переменные среды из .env
ARG DOMAIN_EMAIL
ARG DOMAIN_URL

# устанавливаем переменные среды в переменные
ENV DOMAIN_EMAIL=$DOMAIN_EMAIL
ENV DOMAIN_URL=$DOMAIN_URL

WORKDIR /certbot
COPY . /certbot
WORKDIR /certbot

RUN apt-get update
RUN apt-get -y install certbot

# запускаем скрипт генерации
CMD ["sh", "create-certificate.sh"]

create-certificate.sh:

#!/bin/bash
# create-certificate.sh

# чистим папку, где могут находиться старые сертификаты
rm -rf /etc/letsencrypt/live/certfolder*

# выдаем себе сертификат (обратите внимание на переменные среды)
certbot certonly --standalone --email $DOMAIN_EMAIL -d $DOMAIN_URL --cert-name=certfolder --key-type rsa --agree-tos

# удаляем старые сертификаты из примонтированной
# через Docker Compose папки Nginx
rm -rf /etc/nginx/cert.pem
rm -rf /etc/nginx/key.pem

# копируем сертификаты из образа certbot в папку Nginx
cp /etc/letsencrypt/live/certfolder*/fullchain.pem /etc/nginx/cert.pem
cp /etc/letsencrypt/live/certfolder*/privkey.pem /etc/nginx/key.pem

В качестве монтируемого тома также понадобится следующие папки:

Docker Nginx SSL

Файл index.php для PHP-FPM:

<?php

function getUserIP()
{
    // Get real visitor IP behind CloudFlare network
    if (isset($_SERVER["HTTP_CF_CONNECTING_IP"])) {
              $_SERVER['REMOTE_ADDR'] = $_SERVER["HTTP_CF_CONNECTING_IP"];
              $_SERVER['HTTP_CLIENT_IP'] = $_SERVER["HTTP_CF_CONNECTING_IP"];
    }
    $client  = @$_SERVER['HTTP_CLIENT_IP'];
    $forward = @$_SERVER['HTTP_X_FORWARDED_FOR'];
    $remote  = $_SERVER['REMOTE_ADDR'];
    if(filter_var($client, FILTER_VALIDATE_IP))
    {
        $ip = $client;
    }
    elseif(filter_var($forward, FILTER_VALIDATE_IP))
    {
        $ip = $forward;
    }
    else
    {
        $ip = $remote;
    }
    return $ip;
}


$user_ip = getUserIP();
echo '<div style="clear:both;"><h2>Mysql</h2></div>';
echo '<br/>';

echo $user_ip; // Output IP address [Ex: 177.87.193.134]
?>

 В директории nginx создайте два файла web.conf и default.conf

web.conf:

server {

    listen 80;
    #server_name ;
    root /var/www/public_html;
    #error_log /var/log/nginx/error.log;
    #access_log /var/www/app/log/nginx/access.log;
    client_max_body_size 100m;
    # мы уже примонтировали сертификаты в Docker Compose
    # делаем переадресацию с HTTP на HTTPS
    location / {
        return 301 https://$host$request_uri;
    }

    # URL certbot'a, где он будет слушать входящие
        # подключения во время выдачи SSL
        location /.well-known {
                # адрес certbot'a в Docker Compose на Linux
                proxy_pass http://172.17.0.1:6000;
        }

}
~   

default.conf

server {

    #listen 80;
    listen       443 ssl http2;
    #server_name ;
    
    root /var/www/public_html;
    error_log /var/www/log/nginx/error.log;
    access_log /var/www/log/nginx/access.log;
    client_max_body_size 100m;
    # мы уже примонтировали сертификаты в Docker Compose
    ssl_certificate     /etc/cert.pem;
    ssl_certificate_key /etc/key.pem;

    
     location / {
        # try to serve file directly, fallback to index.php
        try_files $uri /index.php$is_args$args;
    }

     #location / {
      #  index index.php index.html;
    #}
    
    # URL certbot'a, где он будет слушать входящие
	# подключения во время выдачи SSL
	location /.well-known {
		# адрес certbot'a в Docker Compose на Linux
		proxy_pass http://172.17.0.1:6000;
	}

   location ~ \.php$ {
        include fastcgi_params;
        fastcgi_pass php:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
    }
}

Так же обязательно создайте в директории nginx файла cert.perm и key.pem с любым текстом. 

Файл .env в корне:

# .env
DOMAIN_URL=site.ru
DOMAIN_EMAIL=mail@rambler.ru

Запускаем nginx:

docker compose up web1 --build -d

Затем certbot:

docker compose up certbot --build

При запуске certbot должно появится следующее:

certbot

Это говорит что все успешно, зайдите на ваш домен, должно получится нечто следующее:

Docker Nginx SSL

 

 

 

 

Взаимосвязанные материалы

# 1 . Типичный пример Docker с Nginx и SSL ( ),
Типичный пример быстрой настройки Docker и Nginx c доступом по https. читать...
# 2 . Docker Swarm и Nginx, PHP. Вебсервер в кластере Docker Swarm. Часть 4. Traefik и SSL Let's Encrypt: TLS ( ),

Небольшая статья - продолжение предыдущих трёх статей:

читать...
# 3 . Docker Swarm и Nginx, PHP. Вебсервер в кластере Docker Swarm. Часть 3. Traefik. ( ),
Продолжаем настройку кластера Swarm. В этой статье мы попробуем добавить Traefik к уже существующему стэку Docker Swarm. читать...
# 4 . Docker Swarm и Nginx, PHP. Вебсервер в кластере Docker Swarm. Часть 2. Mysql. ( ),
Docker Swarm и Nginx, PHP. Вебсервер в кластере Docker Swarm. Часть 2. Mysql. В этой статье мы попробуем добавить сервер mysql к уже существующему стэку Docker Swarm. читать...
# 5 . Docker Swarm и Nginx, PHP. Вебсервер в кластере Docker Swarm. Часть 1. ( ),
С помощью Docker можно быстро развернуть рабочее web приложение с различными настройками и версиями. Docker Swarm выступает инструментом «оркестрации» контейнеров Docker, который позволяет управлять контейнерами как единое целое. читать...
На разработку сайта! Скидки до 20%!