Di recente ho cambiato server virtuale e ho dovuto configurare tutto da capo. Preferisco che il sito sia accessibile tramite https e che i certificati letsencrypt vengano ottenuti e rinnovati automaticamente. Questo può essere realizzato utilizzando due immagini docker nginx-proxy e nginx-proxy-companion.
Questa guida spiega come configurare un sito su docker, con un proxy che ottiene automaticamente Certificati SSL. Si utilizza un server virtuale CentOS 7.
Presumo che il server sia già acquistato, configurato, l'accesso avvenga tramite chiave, fail2ban sia installato, ecc.
Per prima cosa è necessario installare docker.
- Prima di tutto, installare le dipendenze
$ sudo yum install -y yum-utils device-mapper-persistent-data lvm2 - Collegare il repository
$ sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo - Poi installare la community edition di docker
$ sudo yum install docker-ce docker-ce-cli containerd.io - Aggiungere docker all'avvio automatico e avviarlo
$ sudo systemctl enable docker $ sudo systemctl start docker - Aggiungere l'utente al gruppo docker, per avere la possibilità di eseguire docker senza sudo
$ usermod -aG docker user
Il passo successivo è installare docker-compose. Lo strumento può essere installato in vari modi, ma preferisco installarlo tramite il gestore pip e virtualenv, per non appesantire il sistema con pacchetti superflui.
- Installare pip
$ sudo yum install python-pip - Installare virtualenv
$ pip install virtualenv - Dopo, è necessario creare una cartella per il progetto e inizializzarla. La cartella contenente tutto il necessario per gestire i pacchetti si chiamerà ve.
$ mkdir docker $ cd docker $ virtualenv ve - Per iniziare a utilizzare l'ambiente virtuale, è necessario eseguire il seguente comando nella cartella del progetto.
$ source ve/bin/activate - Si può installare docker-compose.
pip install docker-composeAffinché i container possano vedersi a vicenda, creiamo una rete. Di default viene utilizzato il driver bridge.
$ docker network create networkPoi è necessario configurare docker-compose, il proxy sarà nella cartella proxy, il sito di prova nella cartella test. Per esempio utilizzo il nome di dominio example.com
$ mkdir proxy $ mkdir test $ touch proxy/docker-compose.yml $ touch test/docker-compose.ymlContenuto proxy/docker-compose.yml
version: '3' reti: predefinito: esterno: nome: rete servizi: nginx-proxy: container_name: nginx-proxy image: jwilder/nginx-proxy ports: - 80:80 - 443:443 volumes: - certs:/etc/nginx/certs - vhost.d:/etc/nginx/vhost.d - html:/usr/share/nginx/html - /var/run/docker.sock:/tmp/docker.sock:ro nginx-proxy-letsencrypt: container_name: nginx-proxy-letsencrypt image: jrcs/letsencrypt-nginx-proxy-companion volumes: - certs:/etc/nginx/certs - vhost.d:/etc/nginx/vhost.d - html:/usr/share/nginx/html - /var/run/docker.sock:/var/run/docker.sock:ro environment: - NGINX_PROXY_CONTAINER=nginx-proxy volumes: certs: vhost.d: html:Variabile d'ambiente NGINX_PROXY_CONTAINER è necessaria affinché il contenitore letsencrypt possa vedere il contenitore proxy. Le cartelle /etc/nginx/certs, /etc/nginx/vhost.d e /usr/share/nginx/html devono essere condivise da entrambi i contenitori. Per il corretto funzionamento del contenitore letsencrypt, l'applicazione deve essere accessibile sia sulla porta 80 che sulla porta 443.
Contenuto test/docker-compose.yml
version: '3' reti: predefinito: esterno: nome: rete servizi: nginx: container_name: nginx image: nginx:latest environment: - VIRTUAL_HOST=example.com - LETSENCRYPT_HOST=example.com - LETSENCRYPT_EMAIL=admin@example.comQui le variabili d'ambiente sono necessarie affinché il proxy gestisca correttamente le richieste al server e richieda un certificato sul nome di dominio corretto.
Rimane solo da avviare docker-compose
$ cd proxy $ docker-compose up -d $ cd ../test $ docker-compose up -d
Fonte: habr.com
