El punto de log rotation es crítico, pero hay un matiz que suele pasarse por alto: si usas json-file con max-size, los logs se rotan pero los pierdes al reiniciar el contenedor. Para producción real, mejor montar un volumen para /var/log/app y que un logrotate del host los gestione, o directamente usar el driver local que desde Docker 20.10 es más eficiente y evita el problema de duplicación en disco que tiene json-file. Sobre el expose vs ports: ojo, que si Nginx corre en otro contenedor necesitas que ambos estén en la misma red definida como external o interna, y que Nginx resuelva por nombre de servicio. Si Nginx está en el host, entonces sí, publica solo 127.0.0.1:8000:8000 para que no quede expuesto a Internet. ¿Tienes pensado añadir un read_only: true al filesystem del contenedor de la app? Es un paso extra que cierra bastante superficie de ataque.