Mi archivo "compose" para montar Ollama y Tailscale en contenedores con Docker.
Se aprovecha Tailscale para obtener un certificado SSL y un subdominio. Los contenedores se montan y funcionan como un nodo de Tailscale, así que aparecerá una máquina con el nombre "ollama" en la lista de nodos de Tailscale. Solo podrá ser accedido a través de la Tailnet, no se expone ningún puerto en el "host".
El contenedor de Ollama utiliza la imagen
rocm
,
que corresponde a la variante que aprovecha las GPU de AMD. El uso de la GPU por
parte de un contenedor de Docker es sencillo cuando el sistema "host" es
GNU/Linux y la GPU es AMD. Dudo que este archivo "compose" funcione en otros
sistemas "host", y para trabajar con GPU NVIDIA hay que revisar la documentación
de Ollama.
- Genera una llave de un solo uso para autenticar el nodo en Tailscale.
- Corre los contenedores con Docker Compose:
TS_AUTHKEY=<your_one_time_auth_key> docker compose up -d
. Reemplaza<your_one_time_auth_key>
por la llave de un solo uso que obtuviste en el paso anterior. - Revisa la lista de máquinas de Tailscale. Debe aparecer una máquina con el nombre "ollama".
- Corre el primer modelo desde la línea de comandos.
Gemma3 es un buen candidato para probar
en chat:
docker exec -it ollama ollama run gemma3
. Esto descargará (si no está descargado) el modelo y lo correrá para poder interactuar con él. - Busca más modelos en la lista de
modelos disponibles. Instala los que desees, por
ejemplo llama3.1:
docker exec -it ollama ollama pull llama3.1
.
Ollama ofrece una API (al estilo OpenAI), que permite interactuar con los modelos instalados. Para usarla, puedes hacer peticiones HTTP a la dirección de tu máquina Ollama en tu Tailnet. Por ejemplo:
curl https://ollama.<your-tailnet-domain>/api/generate -d '{
"model": "gemma3",
"prompt": "Hola, ¿cómo estás?",
"stream": false
}' | jq .
Reemplaza <your-tailnet-domain>
con el nombre de tu Tailnet. Se encuentra en
la sección DNS de la consola de
Tailscale. Suele tener la forma taila1b2c3.ts.net
.
La petición se hace usando el protocolo https://
. Si es la primera vez que se
hace una petición al dominio de la máquina "ollama", puede tardar unos segundos
mientras se genera el certificado SSL. Para que esto funcione, MagicDNS y
los certificados HTTPS deben estar habilitados en tu Tailnet, en la sección de
DNS.
Los modelos de Ollama se almacenan en un volumen llamado ollama_ollama
, como
se define en el archivo "compose". Estos modelos siempre pueden descargarse
usando el comando ollama pull
. Sin embargo, si deseas guardar una copia de los
modelos para reutilizarlos en otra instancia de Ollama, o para restaurarlos en
caso de re-despliegue, puede hacerse con un contenedor auxiliar, así:
docker run --rm --volumes-from ollama -v $(pwd):/backup busybox tar cvf /backup/backup.tar /root/.ollama
Este comando crea un archivo tar con todo el contenido del volumen y lo guarda
en el directorio actual con el nombre backup.tar
.
- Remover los contenedores:
docker compose down
- Remover los volúmenes:
docker volume rm ollama_ollama ollama_ts-authkey
- Remover la máquina "ollama" de la Tailnet.
Si hiciste una una copia del volumen ollama_ollama
para poder restaurarlo
después de haber borrado los contenedores y volúmenes, puedes hacerlo siguiendo
los pasos:
- Vuelve a correr los contenedores. Asegúrate de que la máquina "ollama" aparezca de nuevo en tu Tailnet.
- Restaura el volumen
ollama_ollama
con el archivo tar que guardaste antes. Esto puede hacerse con un contenedor auxiliar, así:docker run --rm --volumes-from ollama -v $(pwd):/backup busybox tar xvf /backup/backup.tar
- Corre un modelo que sepas que debería estar descargado. Por ejemplo, Gemma3:
docker exec -it ollama ollama run gemma3
. El modelo no debería descargarse, pues fue restaurado de la copia de seguridad, así que debería ejecutarse enseguida.