Jeg skiftede for nylig min virtuelle server og måtte indstille alt fra bunden. Jeg foretrækker, at hjemmesiden er tilgængelig via https, og at Letsencrypt-certifikater automatisk opnås og fornyes. Dette kan opnås ved at bruge to Docker-billeder: nginx-proxy og nginx-proxy-companion.
Denne vejledning beskriver, hvordan man indstiller en hjemmeside på Docker med en proxy, der automatisk får SSL-certifikater. En virtuel server med CentOS 7 anvendes.
Jeg antager, at serveren allerede er købt, konfigureret, og at adgangen til den sker via en nøgle, samt at fail2ban er installeret osv.
Først skal Docker installeres.
- Start med at installere afhængighederne
$ sudo yum install -y yum-utils device-mapper-persistent-data lvm2 - Tilslut repositoryet
$ sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo - Derefter installeres Docker community edition
$ sudo yum install docker-ce docker-ce-cli containerd.io - Tilføj Docker til autostart og start det
$ sudo systemctl enable docker $ sudo systemctl start docker - Tilføj brugeren til Docker-gruppen for at kunne køre Docker uden sudo
$ usermod -aG docker user
Næste skridt er at installere docker-compose. Værktøjet kan installeres på flere måder, men jeg foretrækker at installere det via pip-manager og virtualenv for at undgå at rodde mit system med unødvendige pakker.
- Installer pip
$ sudo yum install python-pip - Installer virtualenv
$ pip install virtualenv - Herefter skal der oprettes en mappe til projektet, og denne skal initialiseres. Mappen med alt nødvendigt til pakkehåndtering vil hedde ve.
$ mkdir docker $ cd docker $ virtualenv ve - For at begynde at bruge det virtuelle miljø skal følgende kommando udføres i projektmappen.
$ source ve/bin/activate - Docker-compose kan nu installeres.
pip install docker-composeFor at containerne kan se hinanden, opretter vi et netværk. Som standard anvendes bridge-driveren.
$ docker network create networkDerefter skal docker-compose konfigureres; proxy'en vil ligge i mappen proxy, og test-siden i mappen test. For eksemplets skyld bruger jeg domænenavnet example.com.
$ mkdir proxy $ mkdir test $ touch proxy/docker-compose.yml $ touch test/docker-compose.ymlIndhold. proxy/docker-compose.yml
version: '3' networks: default: external: name: network services: 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:Miljøvariabel NGINX_PROXY_CONTAINER er nødvendig for at letsencrypt-containeren kan se proxy-containeren. Mapperne /etc/nginx/certs, /etc/nginx/vhost.d og /usr/share/nginx/html skal deles af begge containere. For at letsencrypt-containeren fungerer korrekt, skal applikationen være tilgængelig både på port 80 og port 443.
Indhold. test/docker-compose.yml
version: '3' networks: default: external: name: network services: nginx: container_name: nginx image: nginx:latest environment: - VIRTUAL_HOST=example.com - LETSENCRYPT_HOST=example.com - LETSENCRYPT_EMAIL=admin@example.comHer er miljøvariablerne nødvendige for, at proxyen kan håndtere anmodningen til serveren korrekt og anmode om et certifikat til det rigtige domænenavn.
Det er kun at starte docker-compose.
$ cd proxy $ docker-compose up -d $ cd ../test $ docker-compose up -d
Kilde: habr.com
