Parámetros de Docker: ¡los mejores parámetros!

Si es un administrador de sistemas experimentado, es posible que haya oído hablar de "Estibador" oído y ya sé lo que es. Para quienes no lo saben, Docker es una tecnología de código abierto que permite que las aplicaciones se ejecuten en contenedores aislados.

¿Qué es un parámetro de Docker?

Un parámetro de Docker es un valor que se pasa a un comando de Docker. Este valor se puede especificar en forma de variable de entorno o directamente en el propio comando.

Los diferentes tipos de parámetros de Docker

El comando Docker Run tiene muchas opciones y parámetros diferentes que puede personalizar según sus necesidades. En esto Artículo Nos centraremos en los diferentes tipos de parámetros de Docker.

Hay cuatro tipos principales de parámetros de Docker: variables de entorno, comandos únicos, combinaciones de comandos y archivos. Cada tipo tiene su propio Ventajas y desventajasque es necesario tener en cuenta.

Las variables de entorno son fáciles de usar y le permiten personalizar ciertas partes de su entorno sin tener que cambiar su código. Sin embargo, sólo son capaces de almacenar tipos de datos simples, lo que significa que no son adecuados para configuraciones de aplicaciones más complejas.

Los comandos únicos le permiten ejecutar simplemente un comando sin tener que crear un archivo. Esto puede resultar útil si sólo desea realizar una acción específica sin crear una aplicación completa. Sin embargo, los comandos individuales no son escalables y, por lo tanto, pueden no ser adecuados para aplicaciones más grandes.

Las combinaciones de comandos le permiten guardar varios comandos en un archivo y luego ejecutarlos. Esto es útil cuando desea realizar múltiples acciones sin tener que cambiar el código cada vez. Sin embargo, las combinaciones de comandos suelen ser confusas y difíciles de depurar.

Los archivos son la forma más flexible de almacenar y ejecutar su código. Los archivos se pueden crear y modificar fácilmente, lo que significa que son adecuados para todo tipo de aplicaciones. Sin embargo, los archivos suelen ser confusos y difíciles de depurar.

Los mejores parámetros de Docker

Los mejores parámetros de Docker

Si usa Docker, puede especificar una variedad de opciones para controlar el comportamiento del contenedor. Este artículo explica los mejores y más utilizados parámetros de Docker.

–name: este parámetro le da un nombre al contenedor. Si no especifica un nombre, se generará un nombre aleatorio. El nombre debe ser único para que puedas identificar fácilmente el contenedor.

–detach / -d: este parámetro ejecuta el contenedor en segundo plano. De forma predeterminada, el contenedor se ejecuta en primer plano y la línea de comando permanece bloqueada hasta que el contenedor sale o se cancela con Ctrl+C. Si desea ejecutar el contenedor en segundo plano, debe especificar el parámetro –detach.

–publish / -p: Este parámetro establece una conexión entre un puerto de contenedor y un puerto de host. Si no se conecta, no podrá llegar al puerto del contenedor desde el exterior. Si desea publicar varios puertos, puede especificar el parámetro –publish varias veces.

–interactive / -i: este parámetro garantiza que el contenedor se ejecute en primer plano y que la línea de comando no se bloquee hasta que el contenedor salga o se cancele con Ctrl + C.

–tty / -t: Este parámetro simula una terminal en el contenedor. Especificar este parámetro le permite escribir en el contenedor y ejecutar comandos. Si no se especifica este parámetro, no será posible escribir en el contenedor ni ejecutar comandos.

–rm: este parámetro elimina el contenedor después de que sale. Si no especifica este parámetro, el contenedor permanecerá intacto y podrá restaurarse más tarde.

–volumen / -v: este parámetro crea una conexión entre una carpeta host y una carpeta contenedora. Cuando se conecta, puede copiar archivos de la carpeta del host al contenedor y viceversa.

–workdir / -w: este parámetro establece el directorio de trabajo en el contenedor. De forma predeterminada, el directorio de trabajo está configurado en /root.

–user / -u: este parámetro establece el usuario en el contenedor. Por defecto se utiliza el usuario root.
Estos son sólo algunos de los muchos parámetros de Docker disponibles. Para obtener más información, consulte la documentación de Docker.

–restart: este parámetro especifica cómo Docker debe reiniciar un contenedor si se cierra o falla. Hay diferentes opciones para este parámetro: no, en caso de falla, siempre y a menos que se detenga. El valor predeterminado es "no", lo que significa que el contenedor no se reiniciará. Si especifica "en caso de falla", el contenedor se reiniciará si se está ejecutando con un Error se cancela (por ejemplo, debido a una falla). "Siempre" significa que el contenedor siempre se reiniciará, incluso si se cerró limpiamente. "A menos que se detenga" es similar a "siempre", pero aquí el contenedor no se deja funcionando desatendido; Una vez que ejecute el comando "docker stop" para detener el contenedor, ya no se reiniciará.

–hostname: como sugiere el nombre, este parámetro establece el nombre de host del contenedor. El valor predeterminado es el nombre del contenedor, o un nombre aleatorio si no se especifica ningún nombre.

–interactive o -i: este parámetro le permite iniciar sesión e interactuar con un contenedor en ejecución. Por ejemplo, puede iniciar una terminal en el contenedor y ejecutar comandos. Si no especifica este parámetro, no podrá iniciar sesión ni interactuar con el contenedor.

–volumen o -v: este parámetro crea una conexión entre una carpeta host y una carpeta contenedora. Cuando se conecta, puede copiar archivos de la carpeta del host al contenedor y viceversa.

Ventajas y desventajas de un parámetro Docker

Podría decirse que el beneficio más importante de un parámetro de Docker es que aumenta la flexibilidad y adaptabilidad de una aplicación. Por ejemplo, se pueden pasar variables de entorno específicas a una aplicación específica. El acceso a los recursos del sistema host también se puede controlar mediante el parámetro.

Otra ventaja es que ciertas funciones de seguridad también se pueden vincular a una aplicación mediante parámetros de Docker. Por ejemplo, se puede garantizar que sólo los usuarios autorizados puedan acceder a una aplicación.

Una desventaja de los parámetros de Docker es que normalmente sólo están disponibles para desarrolladores y administradores de sistemas. Por lo general, no son visibles ni comprensibles para los usuarios normales. Por lo tanto, puede resultar difícil personalizar una aplicación si no conoce los parámetros de Docker.

Referencia de ejecución de Docker

La mayoría de los comandos de Docker comienzan con el comando "docker" seguido de un subcomando. docker run es un subcomando típico y se utiliza para ejecutar un nuevo contenedor.

El comando docker run tiene muchas opciones y parámetros diferentes que puede especificar para crear y configurar el contenedor que desea ejecutar. En este artículo, veremos los mejores parámetros para el comando de ejecución de Docker.

Opciones exclusivas del operador

La mayoría de las opciones de los operadores no son exclusivas de los operadores, sino que también están disponibles para otros usuarios. Sin embargo, existen algunas opciones que están destinadas exclusivamente a operadores. Éstas incluyen:

–log-level: establece el nivel de registro. Sólo los operadores tienen acceso a esta opción para personalizar el registro de su instalación.

–storage-opt: Permite al operador configurar opciones de almacenamiento adicionales para su instalación. Esto es útil cuando el operador utiliza un backend de almacenamiento específico que no es compatible con Docker.

–formato: permite al operador personalizar el formato de salida de información de la ventana acoplable. Esto resulta útil si el operador desea seguir procesando la información de una forma específica.

Separado vs primer plano

Cuando ejecuta un contenedor con el comando docker run, siempre se ejecuta en primer plano. Esto significa que el contenedor tiene la Consola del sistema host y no puede salir del comando sin detener el contenedor.

Si desea ejecutar un contenedor en segundo plano (separado), puede hacerlo con el parámetro "-d". Luego, el contenedor se ejecuta en su propio proceso y el control de la consola se devuelve al host.

Identificación del contenedor

El ID del contenedor es un identificador único para un contenedor Docker. Se puede ver usando el comando docker ps y normalmente tiene ocho caracteres. Los primeros tres caracteres del ID del contenedor son el ID de la imagen que creó el contenedor.

Configuración UTS (–uts)

El modo UTS especifica cómo un contenedor debe gestionar su propia identidad. Normalmente, cada contenedor tiene su propio UID y GID. Sin embargo, este modo no siempre tiene sentido, especialmente cuando varios contenedores acceden al mismo. base de datos o necesita acceder a otros recursos. En este caso, puede desactivar el modo UTS para que todos los contenedores tengan el mismo UID y GID.

Configuración de IPC (–ipc)

La configuración de IPC (–ipc) permite utilizar un área común para la comunicación entre contenedores. Esto permite que dos o más contenedores accedan a los mismos archivos y sockets. Si no especifica una configuración de IPC, Docker establecerá un rango predeterminado para la comunicación.

Configuración de red

Hay algunos parámetros útiles en Docker que debes conocer. Uno de estos parámetros es –net. Este parámetro determina cómo está configurada la red para una aplicación específica.

–net=host: esta opción permite que un contenedor acceda a la red del host directamente. Esto significa que el contenedor tiene acceso a todos los servicios de la red (DNS, HTTP, etc.) proporcionado por el host.

–net=bridge: esta opción crea un contenedor puente de red interno que permite que el contenedor especificado se comunique con otros contenedores y el host. Esta es la opción predeterminada para –net.

–net=container: – Esta opción permite conectar un contenedor a otro contenedor que utiliza la misma opción de red. Por ejemplo, se podrían conectar dos contenedores con la misma opción –net=bridge para conectarlos entre sí.

–net=none: esta opción deshabilita la red para un contenedor. Un contenedor que utiliza esta opción no tiene acceso a la red y, por lo tanto, no puede utilizar los servicios de red.

Para permitir que dos contenedores se comuniquen entre sí, puede utilizar el comando docker network create:

$ docker network crear mi red

Este comando crea una nueva red llamada mi-red. Para conectar un contenedor a esta red, se puede usar el comando docker run con la opción –net:
$ docker run –net=mi-red…

Para eliminar un contenedor, puede usar el comando docker rm:

$ docker rm mi-contenedor

Este comando elimina el contenedor my-container. Para eliminar una red, puede utilizar el comando docker network rm:
$ docker network rm mi-red

Este comando elimina la red denominada mi-red.

Reiniciar políticas (–reiniciar)

La política de reinicio de Docker especifica cómo se reinicia un contenedor después de un Error debe reiniciarse. Las opciones de reinicio son:

–restart=no: el contenedor no se reiniciará.
–restart=always: El contenedor siempre se reinicia, incluso si se cerró limpiamente.
–restart=on-failure: El contenedor se reiniciará si se está ejecutando con un Error fue terminado.
–restart=unless-stopped: el contenedor siempre se reinicia a menos que se detuviera manualmente con el comando docker stop.

Estado de salida

El estado de salida es un valor devuelto por un comando o función para indicar si el comando o función se completó correctamente.

Si un comando se completa con un estado de salida de 0, generalmente significa que el comando fue exitoso. Un estado de salida diferente normalmente significa que el comando falló.

Los estados de salida también se pueden utilizar para generar códigos de error específicos. Esto puede resultar útil si tiene una Buscar y corregir errores desear. Por ejemplo, la salida 1 se puede utilizar para mostrar el error "Archivo no encontrado".

Limpiar (–rm)

La mayoría de los comandos de Docker toman uno o más parámetros. Uno de los más importantes es “–rm”. Este comando garantiza que todos los objetos temporales creados por Docker se eliminen una vez que se complete el comando. Esto garantiza que no queden objetos no deseados en su entorno.

Configuración de seguridad

La configuración de seguridad es un aspecto muy importante cuando se trabaja con Docker. Esta sección enumera algunos de los parámetros más importantes para el Seguridad presentado por Docker.

En primer lugar, siempre debes tener en cuenta que los Docker Containers están sellados, pero no aislados. Esto significa que si un atacante ingresa a un contenedor, puede acceder a todos los demás contenedores y al sistema host. Por lo tanto, es muy importante que configure y asegure adecuadamente sus contenedores.

Uno de los parámetros más importantes para la seguridad de Docker es “–cap-add”. Este parámetro le permite pasar ciertas capacidades del kernel al contenedor. Esto le permite controlar el acceso a ciertas funciones del sistema host, aumentando así la seguridad. Por ejemplo, puede utilizar “–cap-add=NET_RAW” para asegurarse de que un contenedor no pueda detectar paquetes de red.

Otro parámetro importante es “–opción de seguridad”. Este parámetro le permite restringir el acceso a ciertas funciones del sistema host. Por ejemplo, puede utilizar “–security-opt=apparmor:unconfined” para asegurarse de que AppArmor no se aplique al contenedor. Esto les da a los atacantes una gran ventaja, ya que AppArmor ya no los restringe.

Otro parámetro muy importante es el parámetro “–label” de SELinux. Este parámetro le permite controlar el acceso a ciertas funciones del sistema host. Por ejemplo, con “–etiqueta=tipo:
container_runtime_t” garantiza que Docker no aplique SELinux al contenedor. Esto les da a los atacantes una gran ventaja porque ya no están restringidos por SELinux.

El último parámetro importante es “–privilegiado”. Este parámetro le permite obtener acceso a todas las funciones del sistema host. Esto es muy peligroso y sólo debe usarse cuando sea absolutamente necesario.

¡Es todo por hoy! Esperamos que este artículo te haya ayudado Conceptos básicos para entender Docker.

Especificar un proceso de inicio

Docker Daemon acepta un proceso de inicio específico como argumento. Este proceso es el primer proceso que se ejecuta en el contenedor. Si no se especifica ningún proceso de inicio, se utiliza el proceso de inicio predeterminado init.

El proceso de inicio especificado debe garantizar que solo se esté ejecutando un proceso en el contenedor. Cuando se ejecutan varios procesos, pueden ocurrir errores impredecibles. El proceso de inicio especificado también debe garantizar que el contenedor se cierre correctamente cuando salga.

Especificar cgroups personalizados

Si desea establecer un límite de memoria de cgroup personalizado para su aplicación, puede hacerlo con el indicador –cgroup-memory. Por ejemplo, si desea establecer el límite en 512 MB:

–cgroup-memoria =”512m”

¿Cómo configuro un personalizado? DNS servidor para mis contenedores?

Si tienes un DNS personalizado servidor, puede configurar esto en el archivo de especificación de su aplicación o en el comando para agregar la aplicación dcos marathon. Este ejemplo muestra cómo configurar un DNS servidor utilizando el archivo de especificación de la aplicación:

{ “id”: “/mi-servicio”, “dns”: { “servidores de nombres”: [ “10.0.0.1” ] } }

Este ejemplo muestra cómo configurar un DNS servidor usando el comando agregar de la aplicación dcos marathon:
$ aplicación dcos marathon agregar { “id”: “/mi-servicio”, “dns”: { “servidores de nombres”: [ “10.0.0.1” ] } }

Para obtener más información acerca de DNS, consulte Configuración de DNS en la documentación de Marathon.

¿Cómo configuro un personalizado? search dominio para mis contenedores?

Si tienes una costumbre search dominio, puede configurar esto en el archivo de especificación de su aplicación o en el comando para agregar la aplicación dcos marathon. Este ejemplo muestra cómo configurar un seadominio rch utilizando el archivo de especificación de la aplicación:

{ “id”: “/mi-servicio”, “dns”: {“search”: [ “.ejemplo.com” ] } }

Este ejemplo muestra cómo configurar un seadominio rch utilizando el comando de adición de la aplicación dcos marathon:$ aplicación dcos marathon add { “id”: “/mi-servicio”, “dns”: { “search”: [ “.ejemplo.com” ] } }

Para obtener más información sobre DNS, consulte Configuración de DNS en la documentación de Marathon.

¿Cómo configuro una red personalizada para mis contenedores?

Si tiene una red personalizada, puede configurarla en el archivo de especificación de su aplicación o en el comando para agregar la aplicación dcos marathon. Este ejemplo muestra cómo configurar una red utilizando el archivo de especificación de la aplicación:

{ “id”: “/mi-servicio”, “redes”: [ { “modo”: “contenedor/puente” } ] }

Este ejemplo muestra cómo configurar una red usando el comando agregar de la aplicación dcos marathon:
$ dcos marathon app add { “id”: “/mi-servicio”, “redes”: [ { “modo”: “contenedor/puente” } ] }
Para obtener más información sobre redes, consulte Redes en la documentación de Marathon.

Restricciones de tiempo de ejecución sobre los recursos

"Restricciones de tiempo de ejecución de recursos" es un parámetro de Docker que controla la administración de recursos para un contenedor en ejecución. Este parámetro le permite limitar el uso de la CPU, la huella de memoria y el sistema de archivos de un contenedor.

Restricciones de memoria del usuario

La mayoría de los parámetros de Docker están dedicados a administrar la memoria principal. Esto se utiliza principalmente para ejecutar contenedores e imágenes. También hay algunos otros parámetros para la configuración de la red y otros. Recursos son responsables.

La memoria principal de Docker es muy limitada. Entonces, si desea crear un contenedor o una imagen, debe especificar estos parámetros. De lo contrario, puede experimentar problemas de rendimiento o errores de descarga de imágenes.

Si desea aumentar el espacio de almacenamiento de un contenedor, puede ejecutar el siguiente comando:

ventana acoplable ejecutar -it –memory=”4g” ubuntu /bin/bash

Este comando crea un nuevo contenedor con 4 GB de RAM. Si necesita más memoria, puede aumentar el valor en consecuencia.

Alternativamente, puede ejecutar el siguiente comando para crear una imagen con más memoria:

Docker build –memory=”4g” -t my_image.

Este comando crea una nueva imagen con 4 GB de RAM. Si necesita más memoria, puede aumentar el valor en consecuencia.

Restricciones de memoria del kernel

Las limitaciones de memoria del kernel son un parámetro importante para Docker. Determinan cuánta memoria del kernel puede utilizar un contenedor. Si no especifica el valor de este parámetro, se utiliza el valor predeterminado.

Si desea ajustar el valor del parámetro de memoria del kernel, primero debe encontrar el valor actual. Esto se puede hacer usando el comando "docker info". Luego puede especificar el nuevo valor que desee.

Tenga en cuenta que cambiar este parámetro puede requerir reiniciar el contenedor.

Restricción de intercambio

La configuración de intercambio es un valor entre 0 y 100 que determina la frecuencia con la que el sistema escribe el contenido de la memoria en el espacio de intercambio. Un valor de intercambio alto significa que el intercambio se produce con mayor frecuencia y viceversa. El valor predeterminado es 60. Para bases de datos Generalmente se recomienda un menor intercambio para garantizar que la memoria permanezca en la memoria el mayor tiempo posible.

Restricción de participación de CPU

El uso compartido de CPU es una construcción integrada en el kernel de Linux que Docker utiliza para garantizar que un contenedor no utilice más de la cantidad especificada de núcleos. Esto es importante para el aislamiento entre los contenedores y el host, así como para la confiabilidad de todo el sistema.

restricción de conjunto de CPU

Una restricción de CPUset impone un límite a la cantidad de CPU que puede usar un contenedor. Esto es útil para garantizar que un contenedor no interfiera con otros contenedores en el sistema host.

Restricción de cuota de CPU

La limitación de cuota de CPU (cgroup_cpu_shares) es una característica del kernel de Linux que permite limitar el uso de la CPU entre diferentes procesos. Este parámetro se puede especificar en Docker usando el comando “–cpu-shares”.

Por ejemplo, si especifica un valor de 512, el contenedor recibirá el doble de tiempo de CPU que un contenedor con un valor de 256. Por lo tanto, especificar un valor alto no significa necesariamente que el contenedor recibirá más tiempo de CPU, sino solo en relación con otros contenedores con valores inferiores.

Bloquear restricción de ancho de banda IO (Blkio)

La limitación del ancho de banda de Block IO es una herramienta que le permite limitar el ancho de banda del rendimiento de E/S de un contenedor. Esto es útil para garantizar que un contenedor no sobrecargue otros contenedores en el host. El ancho de banda de Block IO se mide en bytes por segundo y se puede configurar para todos los dispositivos o para un dispositivo específico.

–blkio-peso

El peso blkio indica cuánto ancho de banda de E/S recibe un contenedor de todo el sistema. Por ejemplo, si especifica un valor de 100, el contenedor recibirá el doble de ancho de banda de E/S en comparación con otro contenedor con el valor predeterminado de 50. Este parámetro es útil si desea garantizar que un contenedor en particular logre un rendimiento óptimo.

Grupos adicionales

Si desea ejecutar varios servicios en un solo contenedor, puede crear grupos adicionales. Esto es útil si, por ejemplo, desea ejecutar un servidor web y un servidor de base de datos en un solo contenedor. Para crear un grupo adicional, agregue el siguiente comando al comando de ejecución de Docker: –group-add.

Privilegios de tiempo de ejecución y capacidades de Linux

El "privilegio de tiempo de ejecución" es una función principal de Linux que permite cambiar ciertos permisos durante el tiempo de ejecución. Esto es particularmente útil cuando una aplicación requiere permisos diferentes para iniciarse o ejecutarse.

Puede utilizar esta función con el comando "sudo". Por ejemplo: sudo chmod 777 /ruta/al/archivo. Este comando brinda a todos los usuarios acceso completo al archivo especificado.
Sin embargo, existen algunas limitaciones con respecto a la función sudo. Por ejemplo, los usuarios no pueden cambiar permisos que aún no tienen. Esta es una medida de seguridad para evitar que los usuarios asuman permisos que no deberían tener.

Otra desventaja de la función sudo es que debe volver a ejecutarse para cada comando. Si un usuario a menudo tiene que ejecutar comandos con diferentes permisos, esto puede resultar muy molesto.

Capacidades de Linux es una extensión del kernel de Linux que permite establecer permisos específicos Programa y aplicaciones para asignar. Esto permite a los usuarios establecer permisos para un programa o aplicación y cambiar esos permisos si es necesario.

Mucho más flexible que la función sudo, las capacidades de Linux permiten a los usuarios ajustar los permisos de un programa o aplicación. Por ejemplo, un usuario con capacidades de Linux puede establecer permisos para que un programa solo pueda acceder a los archivos como leídos. Esto es muy útil para garantizar que un programa no realice cambios en archivos que no debería.

Las capacidades de Linux también son mucho más fáciles de usar que la función sudo. Con las capacidades de Linux, no es necesario establecer permisos para cada comando. Uno puede simplemente instalar un programa o aplicación y luego configurar los permisos para ese programa o aplicación.

Controladores de registro (–log-driver)

Cuando crea una imagen de Docker, puede especificar qué controlador de registro usar. El controlador de registro predeterminado es "archivo json". Sin embargo, existe una variedad de otras opciones. Algunos ejemplos son syslog, journald y fluentd.

Puede especificar el controlador de registro con el parámetro “–log-driver”. Por ejemplo, si desea utilizar el controlador de registro syslog, puede hacerlo así:

ejecución de la ventana acoplable –log-driver=syslog…

Este parámetro es muy útil si desea almacenar los registros de sus contenedores en un sistema de registro centralizado.

Anulación de los valores predeterminados de la imagen Dockerfile

Cuando crea una nueva imagen de Docker, puede anular la configuración predeterminada para esa imagen. Esto es útil si desea cambiar configuraciones específicas sin reconstruir la imagen completa. Por ejemplo, puede cambiar el nombre de usuario predeterminado para una nueva imagen sin reconstruir toda la imagen.

Para cambiar los valores predeterminados de una nueva imagen de Docker, primero debe crear un archivo llamado “.dockerignore” en el directorio de su proyecto. En este archivo debe especificar todos los directorios y archivos que deben ignorarse al crear la imagen. Una vez que haya creado este archivo, puede ejecutar los siguientes comandos para crear su imagen:

docker build -t tu_nombre_imagen.
Este comando crea una nueva imagen de Docker llamada "your_image_name" y sobrescribe los valores definidos por defecto.

Conclusión

Los mejores parámetros de Docker dependen en gran medida de sus necesidades. En este artículo hemos introducido algunos de los parámetros más importantes que son relevantes para la mayoría de los casos de uso. Por supuesto, hay muchas otras opciones excelentes que no se mencionan en este artículo. ¡Tómese el tiempo para investigar todas las opciones y descubrir cuáles funcionan mejor para usted!

Nota..¡es importante!

Todos los sitios externos vinculados en este sitio web son fuentes independientes. 
Estos enlaces no están patrocinados y no se recibió ninguna contribución financiera para su inclusión. 
Toda la información contenida en este sitio web se proporciona sin garantía.
Este sitio es un proyecto privado de Jan Domke y refleja únicamente opiniones y experiencias personales.

Jan Domke

Ingeniero rápido | Gerente de Redes Sociales | Gerente de Alojamiento | administrador web

Dirijo la revista en línea de forma privada desde finales de 2021. SEO4Business y así convertí mi trabajo en un hobby.
He estado trabajando como desde 2019. Senior Hosting Manager, en una de las agencias de marketing e Internet más grandes de Alemania y estoy ampliando constantemente mis horizontes.

Jan Domke