[Hilo Oficial] Docker

Erterlo

Hoy he intentado pasar varias webs que tengo en apache a un contenedor, me he ayudado con ChatGPTo y ha sido un absoluto desastre.

Tenía pinta de ser sencillo, pero que va, al final lo he dejado por imposible.

Eso si, he conseguido instalar Traefik el cual es muy curioso y hace muy buena pinta.

docker-compose.yml
Dockerfile
log

Creo que había algún problema con la carpeta donde carga apache, en mi servidor todo está en /var/www/ pero la versión que montaba docker se iba a Http no sé qué, ya que en uno de los intentos y cambios que he intentado, me mostraba "It Works¡" el mensaje random de apache cuando funciona, pero no cargaba los datos que tenía en /var/www/webera.com.
Supongo que me ha faltado encontrar donde cojones montaba apache, pero ni idea, una tarde de mierda.

1 respuesta
draz1c

#181 Usas Dockerfile pero luego en el docker-compose usas httpd:latest, al hacer docker build ., luego lo tageas tambien httpd:latest? Porque si no, se te estará descargando esa imagen de internet en vez de usar la tuya en el que le pasas el config.conf (o httpd.conf vaya). Y aún así aunque lo hiciese así y tuvieras tu propia imagen, si el unico cambio que necesitas es meter ese archivo de configuración (no estoy seguro de los paquetes php libapache2-mod-php, no vienen instalados ya? son necesarios para que funcione?) es más cómo usar la imagen oficial y montar ese archivo de configuración con otro volumen.

He buscado un poco en google y veo cosas similares a la tuya, a ver si alguna respuesta te sirve de algo:

https://stackoverflow.com/questions/68306548/why-does-apache-serve-from-usr-local-apache2-htdocs-and-not-var-www-html

https://stackoverflow.com/questions/72809184/docker-apache-container-serves-usr-local-apache2-htdocs-as-documentroot-instead

En la máquina en la que corres el docker-compose tienes algo en las rutas /var/www/gafotas.net y /var/www/webera.com no? Porque ahi montas el directorio del host al guest.

1 1 respuesta
Erterlo

#182 La verdad que estoy verdísimo, me he afiliado a este hilo hace 1 semana +o-, he mirado videos y leído algunas cosas, pero todavía ando algo perdido.

Volveré mañana o el finde a la carga.

#182draz1c:

En la máquina en la que corres el docker-compose tienes algo en las rutas /var/www/gafotas.net y /var/www/webera.com no? Porque ahi montas el directorio del host al guest.

Esto no lo acabo de entender, ¿va a hacer una copia de los datos de esa ruta?, en nexcloud tengo unos 30GB si empieza a hacer copias me quedo sin espacio.

1 respuesta
draz1c

#183 Nada, tranqui lo preguntaba para tener una idea de como lo tienes montado, entiendo que en esas rutas tienes el contenido web y no son carpetas vacías o que no existen. Lo que ocurre no es que se copie, sino que se monta (entiéndelo como un acceso directo si quieres).

A mi en su día este video me ayudo bastante para entender los conceptos básicos de docker, a ver si te sirve:

1 1 respuesta
covaga

#166 que tanto usas trilium?

Erterlo

#184 Si en /var/www/webero.es/ está todo el contenido, lo que no me entraba en la cabeza es el porqué tiene que hacer un "acceso directo" en vez de trabajar sobre la carpeta misma..
Que ahora leyéndome, quizás es porque así la información queda dentro del "container" ¿no?

En una de esas le he puesto la misma dirección para /var/www/fregona.com/nextcloud: /var/www/fregona.com/nextcloud y un archivo del nextcloud se ha volatilizado, cuando he vuelto a apache y cerrado Docker no me funcionaba xD, suerte que lo he podido arreglar.

Gracias por el video, mañana en el curro lo escucharé un par de veces.

morlop

Tengo open media vault y portainer corriendo contenedores, ¿Puedo poner a cada contenedor una IP estática de mi red local? No red virtual, sino como si mi contenedor fuera un equipo más de la red local real.

No sé si para eso me interesa más proxmox y lxc y cada contenedor Linux ser como un equipo más de mi red.

2 respuestas
maxmalkav

#187 poder puedes, usando el modo macvlan (https://docs.docker.com/engine/network/drivers/macvlan/)

Si quieres hacer esto con Docker o con máquinas virtuales ya depende de que te rente más a la hora de administrar, copias de seguridad etc. Macvlan está pensado para casos específicos, si es algo que quieres usar con todos tus contenedores, puede que Docker no sea la mejor herramienta para tu caso.

1 respuesta
morlop

#188 es que al final veo un lío estar pasando puertos de cada contenedor entre host y contenedor y redirigir puertos de router al host, y que no se pisen puertos de contenedores, etc... Mientras que a cada contenedor le doy su IP de red local real, me es más fácil, cada uno tendría todos sus puertos, solo tendría que redirigir del router a la IP local (que es un contenedor), etc...

Y no sé si para eso proxmox es mejor o lo que digo de IP local directamente al contenedor.

Lo que no me gustaría en proxmox es tener que asignar un espacio concreto de disco a cada lxc mientras que por contenedores eso no tengo que hacerlo y cogen el espacio que quieran.

2 respuestas
maxmalkav

#189 la solución para evitar en docker parte de lo que describes es usar un proxy inverso. Puedes definir manualmente la configuración con algo basado en nginx o usar algo más sofisticado como traefik y automatizar en parte el mapeo de URLs a puertos concretos.

1 respuesta
morlop

#190 uso nginx proxy manager para el tema del dominio, pero eso no quita que tenga que hacer la historia de los puertos, los contenedores, etc... Mientras que si tienen IP local propia me da igual que varios contenedores usen el 80, con el proxy manager le apunto, o con el propio router.

1 respuesta
Erterlo

Disculpad que vuelva con la brasa, pero hoy le he vuelto a echar unas horas y no he conseguido apenas avanzar.
Eso sí, ya le voy pillando el tranquillo al funcionamiento de docker xD.

He tratado de levantar dos webs diferentes web1.com y web2.com y no ha habido manera, creo que la estoy cagando con traefik, ya que tras cientos de pruebas he cargado el archivo doker-compose.yml sin traefik, ultrabásico, ni certificados ni ostias y entonces si ha funcionado.

Código

Por cierto, como veréis en vez de apache he utilizado nginx, lo he intentado de primeras con apache, pero me daba el mismo error que el otro día y no me he querido complicar.

#191morlop:

uso nginx proxy manager para el tema del dominio, pero eso no quita que tenga que hacer la historia de los puertos, los contenedores, etc

Me iría de muerte toda esa info, creo que me he quedado atascado en ese punto y no he sabido salir de ahí.

Al menos esta vez, no he jodido ninguna web ni he roto nextcloud xD

1 respuesta
PiPePiTo

#189 es una buena práctica exponer sólo los puertos que vas a necesitar, sobretodo en máquinas cuyas actualizaciones de seguridad dependen de gente que lo hace de gratis.

El engorro al final es el mismo, o te aprender la dirección ip de cada docker o te aprendes el puerto, porque aunque cada contenedor tenga su IP vas a tener que mapear el puerto que expone cada app al puerto 80

Al final es una configuración que le vas a hacer una vez y con nginx proxy manager una vez puesto apuntando al sitio no lo vuelves a tocar

Bolo extra

Cuando a la ip de tu router le llegue una petición a un puerto 80, cómo sabría a qué docker de todos tendría que enviarlo?

1 respuesta
morlop

#192 con nginx proxy manager es fácil. Los puerros 80 y 443 del router los redirijo al servidor.
Solo el contenedor de nginx proxy manager tiene comunicados 80 y 443 con host.
Ahora en nginx proxy manager creo los proxys y les meto los certificados de lets encrypt de cada proxi donde pones el dominio o subdominio y a qué IP y puerto, es decir, a qué contenedor docker va a ir.

#193 según el proxy creado en nginx proxy manager, yo le digo una IP local u otra. Si se llama web1 npm apunta a ip1 y si es web2 apunto a ip2.

1
sPNkKkKkKkKk

#187 Macvlan es para casos muy concretos y no lo usaría para todos los servicios corriendo en docker que puedas tener. Para esto si tienes suficiente potencia en el host usaría un proxmox con LXC sin privilegios en los mismos y con un traefik/npm como proxy inverso si quieres por temas de dominio y acceso desde fuera.

9 días después
morlop

Estoy haciendo un docker compose y no entiendo el tema de declarar los volúmenes en general.

volumes:
  nextcloud:
  db:
  redis_data:

y en cada servicio meto su correspondiente, por ejemplo:

volumes:
      - db:/var/lib/mysql

La cosa es que de esta forma, me mete los archicos en docker/volumes del disco principal, pero yo he creado otro directorio en otro disco de más capacidad y lo quiero ahí en plan:

/srv/dev-disk-by-xxxxxx/nextcloud/db

Si usaba directamente esto funcionaba:

/srv/dev-disk-by-xxxxxx/nextcloud/db:/var/lib/mysql

Pero no entiendo cómo hacer algo del estilo:

volumes:
  nextcloud:
  db:/srv/dev-disk-by-xxxxxx/nextcloud/db
  redis_data:

para así usar luego:

volumes:
      - db:/var/lib/mysql

pero ya en mi disco de de gran capacidad.

No sé si me explico.

La cosa es que si no pongo volumes de la forma que pone global y pongo cada volumes con la ruta del disco de gran capacidad, no me funciona.

edit: ¿Puede que funcione así?

volumes:
  db:
    driver: local-persist
    driver_opts:
      mountpoint: /srv/dev-disk-by-xxxxxx/nextcloud/db
  nextcloud:
       ....
  redis:
       ....
2 respuestas
Yekale7

#196 en el compose del servicio, indicas

- volumes:
   - /srv/dev-disk-by-xxxxxx/nextcloud/db:/var/lib/mysql

Y la lo tendrías

2 respuestas
maxmalkav

#196 a la hora de definir / montar volúmenes tienes en realidad varias opciones.

  • Los volúmenes que declaras en la sección volumes: (fuera del diccionario del servicio, en el apartado sólo para volúmenes) son contenedores de datos, existen en Docker y no tienes una forma sencilla de consultar el contenido fuera de Docker.
  • lo que quieres hacer es una "bind mount", que es montar un directorio de la máquina host en un contenedor, de forma que puedas acceder a los ficheros dentro del contenedor

La sintaxis es como te han dicho en #197

1 respuesta
morlop

#197 #198 así lo hago con servicios individuales y todo perfecto, pero si lo hago aquí en nextcloud con redys y mariadb no me funciona. Por eso quería mantener la estructura de volumes global indicando mi folder y a ver si así me va. Porque si pongo el volumes global como he dicho, me va, si pongo en cada servicio el volumes personalizado, no me va. El stack levanta pero por ejemplo no tengo conexión con la bd. No lo entiendo.

version: '3.9'

networks:
  nextcloud_network:

volumes:
  nextcloud:
  db:
  redis_data:
 
services:
  db:
    image: mariadb:10.6
    restart: always
    command: --transaction-isolation=READ-COMMITTED --log-bin=binlog --binlog-format=ROW
    volumes:
      - db:/var/lib/mysql
    networks:
      - nextcloud_network
    environment:
      - MYSQL_ROOT_PASSWORD=password
      - MYSQL_DATABASE=nextcloud
      - MYSQL_USER=nextcloud
      - MYSQL_PASSWORD=password

  redis:
    image: redis:latest
    restart: always
    hostname: redis
    ports:
      - "6379:6379"
    volumes:
      - redis_data:/data
    networks:
      - nextcloud_network
      
app: image: nextcloud restart: always ports: - "8080:80" depends_on: - db - redis environment: - MYSQL_HOST=db - MYSQL_DATABASE=nextcloud - MYSQL_USER=nextcloud - MYSQL_PASSWORD=password - REDIS_HOST=redis - REDIS_PORT=6379 volumes: - nextcloud:/var/www/html networks: - nextcloud_network

Esto me va tal cual, pero si cambio los volumes de cada servicio como comento, eliminado el bloque de volumes global, no me va.

1 respuesta
maxmalkav

#199 pon la versión que no te funciona

1 respuesta
morlop

#200

version: '3.9'

networks:
  nextcloud_network:
 
services:
  db:
    image: mariadb:10.6
    restart: always
    command: --transaction-isolation=READ-COMMITTED --log-bin=binlog --binlog-format=ROW
    volumes:
      - /srv/dev-disk-by-xxxxxx/nextcloud/db:/var/lib/mysql
    networks:
      - nextcloud_network
    environment:
      - MYSQL_ROOT_PASSWORD=password
      - MYSQL_DATABASE=nextcloud
      - MYSQL_USER=nextcloud
      - MYSQL_PASSWORD=password

  redis:
    image: redis:latest
    restart: always
    hostname: redis
    ports:
      - "6379:6379"
    volumes:
      - /srv/dev-disk-by-xxxxxx/nextcloud/redis:/data
    networks:
      - nextcloud_network
      
app: image: nextcloud restart: always ports: - "8080:80" depends_on: - db - redis environment: - MYSQL_HOST=db - MYSQL_DATABASE=nextcloud - MYSQL_USER=nextcloud - MYSQL_PASSWORD=password - REDIS_HOST=redis - REDIS_PORT=6379 volumes: - /srv/dev-disk-by-xxxxxx/nextcloud/redis:/var/www/html networks: - nextcloud_network

Se monta todo, funciona la web, pero cuando hago ya en la interfaz el install dice que no tengo permiso para acceder a la base de datos desde una IP de un contenedor.

Básicamente quito el volumes de arriba, y meto los volumes manualmente. Y solo por eso no va.

2 respuestas
maxmalkav

#201 comprueba que la base de datos dentro del contenedor ha levantado correctamente y que no está teniendo problemas de permisos con el volumen.

Si nextcloud te da un error, copia y pega exactamente el mensaje.

1 respuesta
morlop

#202 da error la base de datos diciendo que no tengo permiso a conectarme a ella.
Los 3 contenedores están levantados, la cosa es, desde el volumen del host funciona, desde volumen de un disco secundario no. Pero no he tenido problema con otros contenedores haciendo este procedimiento, no sé. Por eso pensaba en probar usando los volumes globales fuera de los servicios, y montarlos en el disco secundario.

Yekale7

#201

version: '3.9'

networks:
  nextcloud_network:
     name: nextcloud_network
     driver: bridge

services:
  mariadb:
    image: mariadb:10.6
    restart: always
    command: --transaction-isolation=READ-COMMITTED --log-bin=binlog --binlog-format=ROW
    volumes:
      - /srv/dev-disk-by-xxxxxx/nextcloud/db:/var/lib/mysql
    networks:
      - nextcloud_network
    environment:
      - MYSQL_ROOT_PASSWORD=password
      - MYSQL_DATABASE=nextcloud
      - MYSQL_USER=nextcloud
      - MYSQL_PASSWORD=password

  redis:
    image: redis:latest
    restart: always
    hostname: redis
    ports:
      - "6379:6379"
    volumes:
      - /srv/dev-disk-by-xxxxxx/nextcloud/redis:/data
    networks:
      - nextcloud_network
      
nextcloud: image: nextcloud restart: always ports: - "8080:80" depends_on: - mariadb - redis environment: - MYSQL_HOST=mariadb - MYSQL_DATABASE=nextcloud - MYSQL_USER=nextcloud - MYSQL_PASSWORD=password - REDIS_HOST=redis - REDIS_PORT=6379 volumes: - /srv/dev-disk-by-xxxxxx/nextcloud/redis:/var/www/html networks: - nextcloud_network

Prueba con ese cambio en el network. Revisa los logs con: docker logs <servicio> y comparte el error exacto. He cambiado el nombre db del servicio, por si acaso... También habría que revisar si tienes la ipv6 activa y esté dando algún tipo de conflicto. Una alternativa sería poner los puertos como:

  • 0.0.0.0:8080:80
1 respuesta
morlop

#204 en el log de la DB:

2024-09-21  8:11:53 13 [Warning] Aborted connection 13 to db: 'unconnected' user: 'unauthenticated' host: '172.26.0.4' (This connection closed normally without authentication)

Esto cada vez que quiero hacer el install.

En el front:

Error while trying to create admin account: Failed to connect to the database: An exception occurred in the driver: SQLSTATE[HY000] [1130] Host '172.26.0.4' is not allowed to connect to this MariaDB server

Y las network de los contenedores:

nextcloud-app-1	172.26.0.4/16
nextcloud-redis-1	172.26.0.2/16
nextcloud-db-1	172.26.0.3/16

Y las credenciales de acceso son buenas joder, de hecho funciona si no pongo los volúmenes personalizados.

¿Es como que no le envía bien los enviroment y por eso dice "unauthenticated" y cosas así en lugar de las credenciales del compose?

Mirad, hay una issue con esto:
https://github.com/nextcloud/docker/issues/924
Y la cierran sin más xD

Edit: Debe ser un problema de permisos o algo, no tiene sentido que funcione en volúmenes por defecto y no en custom.. pero joder no me pasa con ninguna app más... Vaya mierda, y no quiero usar el volumen por defecto porque quiero otro disco de más capacidad.

Edit2: con tu bridge:

Failed to pull images of the stack: validating /data/compose/36/docker-compose.yml: networks.driver must be a mapping or null

Lo de 0.0.0.0:8080:80 tampoco funciona, mismo fallo de no permiso.

2024-09-21  9:50:57 0 [Note] mariadbd: ready for connections.
Version: '11.5.2-MariaDB-ubu2404-log'  socket: '/run/mysqld/mysqld.sock'  port: 3306  mariadb.org binary distribution
2024-09-21  9:51:18 4 [Warning] Aborted connection 4 to db: 'unconnected' user: 'unauthenticated' host: '172.26.0.4' (This connection closed normally without authentication)

Ni poniendo PUID y PGID lo soluciono.

2 respuestas
draz1c

#205 Tiene pinta de ser un problema de permisos. A parte veo que hay lo que creo que es un fallo en el docker-compose que pones, porque mapeas la misma ruta a nextcloud y a redis (a no ser que tenga que ser asi para que funcione porque no he tocado redis asi que lo desconozco):
redis:

volumes:
      - /srv/dev-disk-by-xxxxxx/nextcloud/redis:/data

nextcloud:

    volumes:
      - /srv/dev-disk-by-xxxxxx/nextcloud/redis:/var/www/html

Entra en los contenedores y mira los usuarios que usa cada contenedor para crear los archivos y dale permiso a esos usuarios en cada una de las rutas de tu host (a lo mejor tienes que crear usuarios y todo para que coincida el id, pero no estoy seguro).

1 1 respuesta
maxmalkav

#206 no me quería meter ahí porque Redis no es mi especialidad, pero no pinta bien, no.

#205 has probado a borrar todo lo que tengas en /srv/dev-disk-by-xxxxxx/nextcloud/db?

Si el contenedor de la base de datos arranca, prueba a abrirle una sesión en terminal (docker exec -it ..) y ver qué pasa con la configuración de la base de datos. A unas malas puedes tirar de SQL y autorizar conexiones desde 0.0.0.0 para el usuario de nexcloud (y que salga el sol por Antequera).

También te digo que no sé como de necesario es una base de datos MySQL / MariaDB para un Nextcloud personal. Que lo mismo configuras con SQLite y a tirar millas.

Yo desplegué NextCloud con esto (por probar) y no me dio problemas (no estoy usando NextCloud, así que no me he molestado en añadir Redis ni MariaDB:

services:
  nextcloud:
    image: lscr.io/linuxserver/nextcloud:${NEXTCLOUD_VERSION:-29.0.1}
    container_name: nextcloud
    environment:
      # nextcloud/nextcloud
      # - PUID=XXX
      # - PGID=YYY
      - TZ=Europe/Amsterdam
    volumes:
      - /mnt/nas/nextcloud/config:/config
      - /mnt/nas/nextcloud/data:/data
    ports:
      - 443:443
    restart: unless-stopped

PD: prueba con la imagen linuxserver/nextcloud, a mí no me dio ningún problema e incluye por defecto algunas cosas útiles como definir el UID/GID con el que se ejecuta el contenedor.

Erterlo

Si te sirve de algo, al final conseguí montar nextcloud con traefik y varios dominios, no tengo ni idea de lo que hago, pero como digo al final funcionó. Al principio lo intenté instalar sobre unas carpetas y configuraciones ya existentes y no me iba así que al final lo que hice fue instalar todo de cero y luego mover los datos.
Espero no haber dejado ningún dato personal xD

spoiler
morlop

Vale, ya he dado con el fallo, soy tonto...
La cosa es que tengo servidor OpenMediaVault. Yo creo los volúmenes desde carpetas compartidas, todo como siempre.
La cosa es que asumía que si yo borraba esa carpeta, se borraba todo su contenido, pero NO. La he borrado, he entrado desde ssh y veo que sigue toda la mierda ahí dentro de esa carpeta, subcarpetas, etc... he hecho un rm -r de todo y desplegado el stack y todo perfecto...

¿Tanto costaba en OMV que si borro una carpeta, se borre todo su contenido? Wtf... 1 día con esta tontería...

Gracias a todos.

1 respuesta
maxmalkav
#209morlop:

¿Tanto costaba en OMV que si borro una carpeta, se borre todo su contenido? Wtf... 1 día con esta tontería...

Es bueno comprobar primero lo más simple, por retrasado que parezca, y luego ir subiendo en complejidad. Te estabas montando una película de volúmenes y el problema era restos de otra instalación. Todo esto son valiosas experiencias :hugging:

Sobre borrar, mi NAS me pregunta si al borrar un volumen compartido TAMBIÉN quiero borrar los datos contenidos (pero es opcional), lo mismo OMV puede hacer lo mismo. Por experiencia te digo que es mejor que un software no tenga la mano larga borrando archivos.

1