En este tutorial, vamos a desplegar una infraestructura de contenedores, para poner en funcionamiento un servidor Nextcloud usando varios contenedores Docker:
Nextcloud: Contenedor ya preparado, aunque tiene la opción de phpfpm, vamos a usar Apache y lo vamos a poner detràs de un proxy inverso en Nginx.
Mariadb: Contenedor de base de datos Mariadb, un fork de MySQL que presenta un rendimiento superior respeto a MySQL, es necesario para que Nextcloud funcione ya que requiere de una conexión con una base de datos.
Nginx: Contenedor oficial de Nginx, vamos a usarlo para recibir todas las peticiones http y https y las va a direccionar al contenedor Nextcloud, junto a el vamos a poner otro contenedor que va a automatizar la gestión de los certificados SSL con Let's Encrypt.
Letsencrypt nginx proxy companion: Este contenedor automatiza todo el proceso de creación y renovaciones de certificados para Ngninx con Let's Encrypt.
Vamos a usar datastores persistentes, pues nos interesa mantener la configuración de los contenedores, como los datos del SQL, la configuración Nginx y certificados SSL además de los datos almacenados en nuestro Nextcloud. Para que todos estos contenedores se comuniquen entre ellos también vamos a crear una red en Docker que va a permitir que solo se puedan ver entre ellos, en excepción de Nginx que si va a ser accesible a internet.
Preparando proxy inverso y SSL.
Vamos a crear una red para que los contenedores se comuniquen entre ellos
docker network create netnextEl siguiente paso es crear el contenedor Nginx para que haga el proxy inverso y atienda a las peticiones http y https que vienen de internet.
docker run --name nginx --net netnext -p 80:80 -p 443:443 \
-v nginx-certs:/etc/nginx/certs \
-v nginx-vhost:/etc/nginx/vhost.d \
-v nginx-conf:/etc/nginx/conf.d \
-v nginx-dhparam:/etc/nginx/dhparam \
-v nginx-html:/usr/share/nginx/html \
-v /var/run/docker.sock:/tmp/docker.sock:ro \
--label com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy \
-d --restart always jwilder/nginx-proxyAhora vamos a poner en marcha el contenedor que nos va a permitir gestionar los certificados SSL.
docker run --name leproxy --net netnext \
-v /var/run/docker.sock:/var/run/docker.sock:ro \
--volumes-from nginx \
-d --restart always jrcs/letsencrypt-nginx-proxy-companionDesplegando Nextcloud
Ahora que ya tenemos listo el proxy inverso y la gestión de los certificados digitales, ya podemos empezar desplegando Nextcloud, en primer lugar vamos a preparar un contenedor para la base de datos en Mariadb.
docker run --name nextclouddb --net netnext \
-v nextclouddb:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=contraseña-root \
-e MYSQL_DATABASE=nextcloud \
-e MYSQL_USER=nextcloud \
-e MYSQL_PASSWORD=contraseña-nextcloud \
-d --restart always mariadbPor último ya podemos desplegar nuestro Nextcloud usando la base de datos de mariadb y el proxy inverso de nginx levantados anteriormente.
docker run --name nextcloud --net netnext \
-v nextcloud-html:/var/www/html \
-v nextcloud-apps:/var/www/html/custom_apps \
-v nextcloud-config:/var/www/html/config \
-v nextcloud-data:/var/www/html/data \
-v nextcloud-theme:/var/www/html/themes/ \
-e MYSQL_HOST=nextclouddb \
-e MYSQL_DATABASE=nextcloud \
-e MYSQL_USER=nextcloud \
-e MYSQL_PASSWORD=contraseña-nextcloud \
-e VIRTUAL_HOST=direcciondetunextcloud.com \
-e LETSENCRYPT_HOST=direcciondetunextcloud.com \
-e LETSENCRYPT_EMAIL=tu@correo.com \
-d --restart always nextcloudAccediendo por primera vez a tu Nextcloud
Ahora ya puedes acceder a tu nextcloud con la URL de tu sitio ;)

Lo primero que nos va a pedir es dar de alta un usuario y contraseña de administrador, una vez la entramos Nextcloud va a realizar los ultimos pasos de instal·lación y ya lo vamos a tener listo para usar.

A partir de aquí, puedes administrar tu Nextcloud, como tu necesites, recuerda que los datos se encuentran en volumenes persistentes:
docker volume ls
DRIVER VOLUME NAME
local nextcloud-apps
local nextcloud-config
local nextcloud-data
local nextcloud-html
local nextcloud-theme
local nextclouddb
local nginx-certs
local nginx-conf
local nginx-dhparam
local nginx-html
local nginx-vhost