I didn’t find any tutorial for this precise use case but I can give you some answer.
You’ll have to create a volume with local-persist driver.
You can see details here:
To install the local-persist driver:
curl -fsSL https://raw.githubusercontent.com/CWSpear/local-persist/master/scripts/install.sh | sudo bash
To create a persistent volume named “nextcloud-data”:
docker volume create -d local-persist -o mountpoint=/data/nextcloud-data --name=nextcloud-data
Then, you’ll have to map this volume to your Nextcloud docker when you create it.
You can do it with docker-compose like in this docker-compose.yml to adapt at your needs.
version: '3.5'
services:
proxy:
image: jwilder/nginx-proxy:alpine
labels:
- "com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy=true"
container_name: nextcloud-proxy
networks:
nextcloud:
ports:
- 80:80
- 443:443
volumes:
- ./proxy/conf.d:/etc/nginx/conf.d:rw
- ./proxy/vhost.d:/etc/nginx/vhost.d:rw
- ./proxy/html:/usr/share/nginx/html:rw
- ./proxy/certs:/etc/nginx/certs:ro
- /etc/localtime:/etc/localtime:ro
- /var/run/docker.sock:/tmp/docker.sock:ro
restart: unless-stopped
letsencrypt:
image: jrcs/letsencrypt-nginx-proxy-companion
container_name: nextcloud-letsencrypt
depends_on:
- proxy
networks:
nextcloud:
volumes:
- ./proxy/certs:/etc/nginx/certs:rw
- ./proxy/vhost.d:/etc/nginx/vhost.d:rw
- ./proxy/html:/usr/share/nginx/html:rw
- /etc/localtime:/etc/localtime:ro
- /var/run/docker.sock:/var/run/docker.sock:ro
restart: unless-stopped
db:
image: mariadb
container_name: nextcloud-mariadb
networks:
nextcloud:
volumes:
- db:/var/lib/mysql
- /etc/localtime:/etc/localtime:ro
environment:
- MYSQL_ROOT_PASSWORD=*********
- MYSQL_PASSWORD=*********
- MYSQL_DATABASE=nextcloud
- MYSQL_USER=ncuser
restart: unless-stopped
app:
image: nextcloud:latest
container_name: nextcloud-app
networks:
nextcloud:
depends_on:
- letsencrypt
- proxy
- db
volumes:
- nextcloud-data:/var/www/html
- /etc/localtime:/etc/localtime:ro
environment:
- VIRTUAL_HOST=cloud.mydomain.tld
- LETSENCRYPT_HOST=cloud.mydomain.tld
- LETSENCRYPT_EMAIL=administrator@mydomain.tld
restart: unless-stopped
volumes:
nextcloud-data:
external: true
db:
networks:
nextcloud:
name: my-network
What’s important in this file is the mapping between path within the Docker and the volume name:
volumes:
- nextcloud-data:/var/www/html
This will tell docker-compose that the /var/www/html will be in your volume that you created and named “nextcloud-data”
volumes:
nextcloud-data:
external: true
And that will tell docker-compose that you’ve already created this volume and it’s name is “nextcloud-data” otherwise docker-compose will create a new volume named “nextcloud-data” and will prefix it with the stack name (here “nextcloud” so it would be “nextcloud_nextcloud-data”.
PS: of course since you’re running that on a Windows Server 2018, you’ll have to adapt the path.