En los últimos años, han surgido varias tecnologías para compartimentar aplicaciones. Desde ejecutar una aplicación desde una jaula, hasta virtualizar un sistema operativo completo dentro de nuestro sistema. Algo que se utiliza mucho en servidores. Actualmente hay una tecnología en auge, y es Docker. Docker nos permite encerrar una aplicación, junto con las bibliotecas que necesita para funcionar y ejecutarla en un entorno aislado, de forma que la aplicación compartimentada no pueda ver nada del exterior. Aunque, si lo deseamos, podrá conectar por red con otros recursos o a Internet.
Docker se usa mucho en el ámbito de los servidores. Nos permite ejecutar aplicaciones de manera que cada una se ejecute en un espacio determinado, con unos permisos, utilizando unos recursos de sistema definidos y utilizando un sistema operativo y bibliotecas de sistema determinadas, que pueden no ser las de nuestro sistema. Otra ventaja añadida es que los contenedores docker tienen un guión definido para su construcción, lo que nos asegura que la configuración del software del contenedor no variará entre instancias, podemos perfectamente configurarlo en nuestro ordenador local e instalarlo más tarde en un servidor cuando nos aseguremos de que todo esté bien, o hacer que todo un equipo (o empresa) utilice el mismo software, en la misma versión y con la misma configuración y evitar así la típica excusa de: «En mi ordenador funciona.»
Tabla de contenidos
Docker en el escritorio
Pero docker compartimenta aplicaciones, da igual del tipo que sean. Así que, ¿por qué no compartimentar aplicaciones de escritorio? De forma que encerremos todo lo que necesitamos de la misma en un entorno controlado y así evitamos tener problemas con dependencias, versiones, incluso con entornos Java cuando utilicemos dicha aplicación. Es muy común que una aplicación se actualice para utilizar bibliotecas en versiones muy nuevas y nuestra distribución no instale esas dependencias, incluso cuando las instalamos a mano, podemos meter la pata y hacer que nuestro sistema se vuelva inestable o que no funcione directamente. También es muy útil cuando necesitamos software que ya no está soportado, o necesitamos una versión antigua y vamos a ejecutarla en un sistema operativo más moderno que no instala las versiones de las bibliotecas que necesitamos.
Puede parecer un gasto innecesario de disco duro, porque seguramente tengamos muchas bibliotecas y software repetido en nuestro sistema; y de memoria, porque habrá veces que la misma biblioteca esté cargada en RAM varias veces (aunque podemos optimizar un poco nuestro kernel para que no tenga mucho problema con eso). Pero nos dará seguridad en nuestro sistema, ya que esta aplicación estará aislada y no tendrá acceso a recursos sin permiso, para esa aplicación ni existirán. Y además, la posibilidad de llevarnos la aplicación a otro equipo o servidor, construirla allí y que todo esté igual que en nuestro ordenador.
Construyendo el Dockerfile. Como ejemplo dbeaver
Cada Dockerfile será independiente de la aplicación que necesitemos ejecutar. Aunque podemos utilizar este archivo como base. En este caso, vamos a dockerizar el programa dbeaver, una poderosa herramienta de administración de base de datos con muchas opciones. Como vemos, es una aplicación hecha en Java. Y, puede que en nuestro ordenador o nuestro servidor, no nos interese tener un entorno de Java públicamente disponible, y solo dejarlo para este programa.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | FROM ubuntu:18.04 MAINTAINER Gaspar Fernandez <gaspar.fernandez@totaki.com> ARG UNAME=user ARG UID=1000 ARG GID=1000 RUN apt-get update \ && apt-get -y install wget \ && apt-get -y install libxext6 libxrender1 libxtst6 libxi6 software-properties-common \ && apt-get -y install openjdk-8-jre \ && wget -q --output-document=/tmp/dbeaver.deb https://dbeaver.io/files/dbeaver-ce_latest_amd64.deb \ && dpkg -i /tmp/dbeaver.deb \ && mkdir -p /home/$UNAME \ && echo "$UNAME:x:${UID}:${GID}:Developer,,,:/home/$UNAME:/bin/bash" >> /etc/passwd \ && echo "$UNAME:x:${UID}:" >> /etc/group \ && chown ${UID}:${GID} -R /home/$UNAME \ && gpasswd -a $UNAME audio \ && gpasswd -a $UNAME video COPY docker-entry.sh /usr/local/bin ENTRYPOINT ["/usr/local/bin/docker-entry.sh"] USER $UNAME ENV HOME /home/$UNAME |
En este caso, partimos de una versión 18.04 de Ubuntu, en la que tenemos que instalar dependencias del escritorio X y OpenDJK, seguidamente, descargar el .deb de la página oficial de dbeaver para proceder a la instalación del programa.
Seguidamente, aunque podemos continuar como root, sobre todo para los programas de escritorio, no es aconsejable y muchos de ellos se quejan al arrancar. Así que creamos un usuario (podríamos cambiarle el nombre al usuario, aunque no será tan importante, por ahora se llamará user). Luego le asignamos grupos (en este caso no es tan importante, pero hay programas con los que sí).
Generalmente, me gusta escribir un docker-entry.sh para cada aplicación a dockerizar, aunque solo sea para ejecutar el programa nada más. Porque, a veces tenemos que filtrar argumentos, ejecutar un pequeño script antes que el programa o hacer una copia de la configuración, etc. En este caso, nuestro docker-entry.sh será este:
1 2 3 4 | #!/bin/bash echo "Ejecutando dbeaver..." dbeaver |
Tras ello, aunque podríamos utilizar docker-compose, vamos a crear un script para construir el contenedor y otro para ejecutar la aplicación. Aunque la ejecución es más o menos sencilla, no tenemos por qué recordar los argumentos para ejecutar el programa. Además, así podremos crear más fácilmente accesos directos y otras utilidades derivadas.
build.sh
1 2 3 4 5 6 | #!/bin/bash readonly SCRIPTPATH="$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")" pushd $SCRIPTPATH docker build -t gasparfm/dbeaver . popd |
Primero, almacenamos en la variable SCRIPTPATH el nombre del directorio donde se encuentra el script, me gusta utilizar esta línea por si llamamos al script desde una ruta diferente a la ruta donde está, o si hacemos un enlace simbólico al archivo. De esta forma, obtendremos en la variable la ruta exacta donde se encuentra el archivo de script al que hace referencia el enlace. Y así podremos realizar tareas en ese directorio, como por ejemplo la construcción de la imagen de nuestro contenedor.
run.sh
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | #!/bin/bash readonly SCRIPTPATH="$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")" pushd $SCRIPTPATH docker run --rm --name dbeaver -e DISPLAY=$DISPLAY \ -v /dev/shm:/dev/shm:rw \ -v /etc/machine-id:/etc/machine-id:ro \ -v /var/lib/dbus:/var/lib/dbus:ro \ -v /tmp/.X11-unix:/tmp/.X11-unix \ -v /etc/localtime:/etc/localtime:ro \ -v /etc/hosts:/etc/hosts:ro \ -v $(pwd)/user:/home/user \ -v $HOME/.ssh:/home/user/sshkeys:ro \ gasparfm/dbeaver popd |
Para ejecutar el script, podemos crear un enlace en /usr/local/bin a este archivo, llamándolo como queramos. Aquí comento algunos argumentos utilizados:
- –rm: Borra el contenedor si existe. Para utilizar siempre el mismo, porque normalmente solo vamos a necesitar una instancia en ejecución
- –name dbeaver: Le damos nombre al contenedor, para que no tenga un nombre aleatorio.
- -e DISPLAY=$DISPLAY: Asignamos la pantalla sobre la que escribirá la aplicación a la pantalla actual del usuario.
- -v /dev/shm:/dev/shm:rw: Algunos programas necesitan acceso a este dispositivo de memoria compartida.
- -v /etc/machine-id:/etc/machine-id:ro : Extraemos el identificador único de la máquina.
- -v /var/lib/dbus:/var/lib/dbus:ro : En este directorio también suele almacenarse el identificador único de la máquina.
- -v /tmp/.X11-unix:/tmp/.X11-unix : En este directorio suelen almacenarse los sockets para acceder al entorno X.
- -v /etc/localtime:/etc/localtime:ro : Aquí reside la zona horaria de nuestro ordenador y la vinculamos con la de la aplicación dockerizada.
- -v /etc/hosts:/etc/hosts:ro : Si tenemos hosts personalizados en /etc/hosts, nuestra aplicación debe poder acceder a ellos. O, al menos, resolverlos.
- -v $(pwd)/user:/home/user : Vinculamos el directorio local user (tendremos que crearlo) con el /home/user de la aplicación. Sobre todo porque este programa introduce mucha información que debe ser salvada. Por ejemplo, se descarga drivers de base de datos o genera muchos archivos de configuración, etc.
- -v $HOME/.ssh:/home/user/sshkeys:ro : Una opción de este programa es que nos permite acceder a bases de datos a través de túneles SSH. Por eso mismo, estaría bien poder acceder a nuestras claves privadas de SSH. Podríamos montar este volumen así o copiar las claves a mano al directorio user.
- gasparfm/dbeaver : Es el nombre del contenedor
Solo tendremos que ejecutar el programa:
Dockerizando yed
Ahora vamos a incluir un segundo programa, yed. Un software para crear diagramas, hecho en Java también. Pero esta vez necesita del JRE de Oracle. Lo que ya nos da una pista de la potencia y necesidad de dockerizar este tipo de aplicaciones.
Vamos a seguir el mismo sistema, creamos Dockerfile, docker-entry.sh, build.sh y run.sh.
Dockerfile
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | FROM ubuntu:18.04 MAINTAINER Gaspar Fernandez <gaspar.fernandez@totaki.com> ARG VERSION=3.18.1.1 ARG UNAME=user ARG UID=1000 ARG GID=1000 RUN apt-get update \ && apt-get -y install wget \ && apt-get -y install libxext6 libxrender1 libxtst6 libxi6 software-properties-common unzip RUN add-apt-repository ppa:webupd8team/java \ && apt-get update \ && echo debconf shared/accepted-oracle-license-v1-1 select true | \ debconf-set-selections \ && echo debconf shared/accepted-oracle-license-v1-1 seen true | \ debconf-set-selections \ && apt-get -y install oracle-java8-installer RUN wget -q --output-document=/tmp/yEd.zip https://www.yworks.com/resources/yed/demo/yEd-${VERSION}.zip \ && unzip /tmp/yEd.zip -d /opt/ \ && mkdir -p /home/$UNAME \ && echo "$UNAME:x:${UID}:${GID}:Developer,,,:/home/$UNAME:/bin/bash" >> /etc/passwd \ && echo "$UNAME:x:${UID}:" >> /etc/group \ && chown ${UID}:${GID} -R /home/$UNAME \ && gpasswd -a $UNAME audio \ && gpasswd -a $UNAME video COPY docker-entry.sh /usr/local/bin ENTRYPOINT ["/usr/local/bin/docker-entry.sh"] USER $UNAME ENV HOME /home/$UNAME |
docker-entry.sh:
1 2 3 4 5 6 7 8 9 10 | #!/bin/bash ARGS='' if [ $# -ge 1 ]; then ARGS="$HOME/$(basename $1)" shift 1 ARGS="$@ $ARGS" fi java -jar "/opt/$(ls)/yed.jar" $ARGS |
Esta vez, necesitamos que yed acepte argumentos del usuario, como por ejemplo el archivo que vamos a abrir.
build.sh
1 2 3 4 5 6 7 | #!/bin/bash readonly SCRIPTPATH="$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")" pushd $SCRIPTPATH docker build -t gasparfm/yed . popd |
run.sh
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | #!/bin/bash readonly SCRIPTPATH="$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")" pushd $SCRIPTPATH docker run --rm --name yed -e DISPLAY=$DISPLAY \ -v /dev/shm:/dev/shm:rw \ -v /etc/machine-id:/etc/machine-id:ro \ -v /var/lib/dbus:/var/lib/dbus:ro \ -v /tmp/.X11-unix:/tmp/.X11-unix \ -v /etc/localtime:/etc/localtime:ro \ -v /etc/hosts:/etc/hosts:ro \ -v $(pwd)/user:/home/user \ gasparfm/yed popd |
De la misma forma podemos construir programas libres o privativos. Introduciendo una capa de seguridad en estos últimos, ya que no tendremos forma de saber lo que hacen. Incluso instalando versiones determinadas de wine para hacer funcionar algunos programas. Y como última idea, podemos dockerizar navegadores, instalaciones completas de Firefox / Chrome / Chromium en las que podremos limitar los recursos para no engullir RAM o CPU (podríamos limitarles la memoria a 1Gb, por ejemplo).
Dockerfile
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | FROM ubuntu:18.04 ARG UNAME=user ARG UID=1000 ARG GID=1000 RUN apt-get update \ && apt-get -y install sudo iproute2 \ && apt-get -y install chromium-browser \ && apt-get -y clean RUN mkdir -p /home/$UNAME && \ echo "$UNAME:x:${UID}:${GID}:Developer,,,:/home/$UNAME:/bin/bash" >> /etc/passwd && \ echo "$UNAME:x:${UID}:" >> /etc/group && \ chown ${UID}:${GID} -R /home/$UNAME \ && gpasswd -a $UNAME audio \ && gpasswd -a $UNAME video \ && echo "$UNAME ALL=(ALL:ALL) NOPASSWD: ALL" > /etc/sudoers.d/user COPY docker-entry.sh /usr/local/bin RUN chmod +x /usr/local/bin/docker-entry.sh USER $UNAME ENV HOME /home/$UNAME ENTRYPOINT ["/usr/local/bin/docker-entry.sh"] |
docker-entry.sh:
1 2 3 4 | #!/bin/bash # Podríamos incluir argumentos aquí. chromium-browser |
build.sh:
1 2 3 4 5 6 | #!/bin/bash readonly SCRIPTPATH="$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")" pushd $SCRIPTPATH docker build --build-arg UID=$(id -u) --build-arg GID=$(id -g) --build-arg UNAME=user -t gasparfm/chromium . popd |
run.sh:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | #!/bin/bash readonly SCRIPTPATH="$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")" pushd $SCRIPTPATH docker run -i --rm --name chromium --privileged -e DISPLAY=$DISPLAY \ -v /dev/shm:/dev/shm:rw \ -v /etc/machine-id:/etc/machine-id:ro \ -v /run/user/$UID/pulse:/run/user/$UID/pulse:rw \ -v /var/lib/dbus:/var/lib/dbus:ro \ -v /tmp/.X11-unix:/tmp/.X11-unix \ -v $(pwd)/user:/home/user \ --device /dev/video0 \ --memory="1000m" \ --cpus 1 \ gasparfm/chromium popd |
En este caso, lo estamos limitando su procesamiento a 1 CPU (o núcleo) y aproximadamente 1Gb de memoria.
Aplicaciones dockerizadas
Y tú, ¿qué aplicación de escritorio dockerizarías?
Actualización 7/12/2018: Arreglado un fallo en la redacción cambiado Debian por Ubuntu, que se me fue la cabeza. Gracias a David Latorre por avisar.
Foto principal: unsplash-logoandrew jay
¿Flatpak no persigue el mismo objetivo?
Pues sí, es otro enfoque. Y el caso es que Flatpak, o Snap están por defecto en muchos sitios ya. Los paquetes que están disponibles son fáciles de instalar. Aunque me surgió el caso en el que no me era posible utilizar ninguno de los dos, pero sí pude utilizar Docker 🙂
Es muy bueno hermano. Esto es parecido a eso. Curso de joyas
Aqui tambien hay algunos cursos de https://wopi.es/las-mejores-joyas/
Excelente bro. Mira este post sobre como ganar seguidores en Tik Tok
https://www.vevioz.com/post/548257_tiktok-y-todo-lo-que-puede-lograr-la-comedia-en-tiktok-otra-forma-en-que-las-muj.html
Creo ver un pequeño error arriba y es el «Partimos de la versión 18.04 de Debian» esa es una versión de Ubuntu, en Debian vamos por la 9 😉
¡¡ Gracias David !! Arreglado, que se me fue la cabeza. ¡Saludos!
muy interesante, quiero probar esta manera para dockerizar una version de java, lo has hecho antes ?
Muy Interesante, ¿Existe la posibilidad de dockerizar por ejemplo Visual Studio 2019 Community y de esa forma evitar instalar una virtual machine solo para ese software?
Desde ya gracias por tu tiempo.
Hola
Hice el ejemplo de Dbeaver y me tiró el siguiente error en el «docker run»
marcelo@marcelo:~/proyectos/doc$ docker run –rm –name dbeaver -e DISPLAY=$DISPLAY \
> -v /dev/shm:/dev/shm:rw \
> -v /etc/machine-id:/etc/machine-id:ro \
> -v /var/lib/dbus:/var/lib/dbus:ro \
> -v /tmp/.X11-unix:/tmp/.X11-unix \
> -v /etc/localtime:/etc/localtime:ro \
> -v /etc/hosts:/etc/hosts:ro \
> -v $(pwd)/user:/home/user \
> -v $HOME/.ssh:/home/user/sshkeys:ro \
> gasparfm/dbeaver
Ejecutando dbeaver…
> Start DBeaver Standalone [org.jkiss.dbeaver.core.application 6.3.2.202001051908]
> Start Eclipse e4 Workbench [org.eclipse.e4.ui.workbench 1.11.0.v20191120-1917]
> Start Eclipse Workbench Model [org.eclipse.e4.ui.model.workbench 2.1.600.v20191106-1503]
> Start Eclipse Jobs Mechanism [org.eclipse.core.jobs 3.10.600.v20191122-2104]
Dbeaver:
An error has occurred. See the log file
/home/marcelo/.eclipse/org.jkiss.dbeaver.product_6.g.2_620785679_linux_gtk_x86_64/configuration/1578512352444.log.
Podrías ayudarme a ghacerlo andar? muchas gracias
El articulo es fantástico, a mi me gustaría Dokerizar una aplicación y un servicio. Tengo los instalables en *.msi y *.exe, la aplicación habla con el servicio por TCP :7171 y el servicio además habla por la red TCP: 1000 . Me recomiendas alguna lectura o algún consejo? mil gracias
Gracias Fénix.
Ha pasado tiempo desde tu comentario, no sé cómo van tus avances con él. No sé si hay alguna forma de dockerizar aplicaciones para Windows, sobre todo si tienen entorno gráfico, más allá de dockerizar un linux con wine y ejecutar las aplicaciones ahí. Y no sé si valen todas las aplicaciones. Hay personas que han dockerizado un IIS, o algún servicio de Windows, pero no te puedo decir más, lo siento.
biowin1688 คาสิโนออนไลน์ที่ทำเงินได้แบบไม่จำกัด
This article provides us with the light to observe reality. We really appreciate your blog post. After visiting your post you will find many ways.먹튀검증
This technology offers a powerful solution for application compartmentalization and reproducibility. And [url=https://www.drywallcorpuschristi.com]what is the difference between drywall and sheetrock[/url]?
This technology offers a powerful solution for application compartmentalization and reproducibility. And what is the difference between drywall and sheetrock?
This is such a wonderful post. I haven’t seen such a useful post before. I am very grateful to you and looking forward to more such posts. Welcome to my blog on how to quickly increase one’s economic income.먹튀신고
I’ve had the same text since some time ago, but it’s fresh and new, and it feels creative and innovative 안전놀이터
I have added your blog to my bookmark. I will read your article more frequently!토토사이트
I am delighted to discover various useful information in this post; we need to devise further techniques in this regard, thanks for sharing. paver contractors sarasota
I am incapable of reading articles online very often, but I’m happy I did today. It is very well written, and your points are well-expressed. I request you warmly, please, don’t ever stop writing.먹튀신고
I’m gonna read this. I’ll definitely be back. Thanks for sharing. And this article provides the light through which we can observe reality. This is a very good one and provides in-depth information. Thanks for this wonderful article.토토사이트
I am really enjoying reading your well written articles. It looks like you spend a lot of effort and time on your blog.
I have bookmarked it and I am looking forward to reading new articles. Keep up the good work.
peacocktv.com/tv
I am really enjoying reading your well written articles. It looks like you spend a lot of effort and time on your blog.
I have bookmarked it and I am looking forward to reading new articles. Keep up the good work.
peacocktv.com/tv
This technology is not limited to servers; it’s increasingly making waves in the desktop application realm, offering ready-to-use examples for efficient deployment.
The idea of running desktop apps in Docker containers intrigues me a lot. It appears to be a cutting-edge strategy that could improve flexibility and make deployment simpler. To fully understand the complexities of Revenue Law Assignment Help, it is always helpful to go deeply into case studies and real-world examples. I wish those completing these assignments the best of luck!
I’ve already downloaded the Docker app and found it to be really useful for those like me who work from home. These advantages are seen throughout your organization, from developers and operations to quality assurance (QA).
Running desktop applications in Docker containers requires specific configurations and considerations, undertale yellow for GUI-based applications.
ufa wallet 789 เว็บพนันครบวงจร แทงบอล บาคาร่า สล็อต ครบจบที่เดียว
Attractive portion of content. I simply stumbled upon your web site and in accession capital to assert that I get actually enjoyed account your weblog. ยูฟ่าเบท168
Thank you so much for sharing this great blog.
Very inspiring and helpful too.
Hope you continue to share more of your ideas.
I will definitely love to read
Regards,
peacocktv.com/tv
Peacock is among the streaming services that has caught the attention of a lot of people around the world. NBC Universal owns peacocktv.com/tv, the services offered include many films and TV shows accessible for streaming. A few of the popular and most well-known shows on the pop scene include Classics like the office and the cheers as well as current shows like Law and Order and This Is Us.
peacocktv.com/tv
ThankYou For Sharing Such An Great Post – Unlock the Power of Premium Content Watch Now
peacocktv.com/tv
I also use this memory grade calculator
Thank you for another excellent article. Where else could anybody get that kind oof information in such an ideall means of writing? I’ve a presentation next week, and I’m at the look for such info.
betflik vip
I bookmarked this blog to check for fresh posts. Keep it up, you’re awesome! This is an excellent motivational article. Keep it up. poppy playtime chapter 2
ThankYou For Sharing Such An Great Post – Unlock the Power of Premium Content Watch Now
peacocktv.com/tv
It’s a game. Five dollars is free. Try it It’s not an easy game ->-> 토토사이트.COM
Champagne Roses (David Austin) It is best to in essence excellent in addition to stable tips, which suggests see:
I am a professional Digital Marketer Expert. Having more than 5 years experience in SEO, Blog Commenting, Lead Generation.Regards; vudu.com/start
Thank you very much for sharing this. tankless water heater installation seattle
This essays service continues to provide quality work that gets me a passing grade. I have hired writer again and will continue to only use this service. Best writers on this site in my experience case study writing experts
Docker containers provide a level of Friday Night Funkin isolation that helps prevent conflicts between different applications and dependencies.
This principle is used to present your ideas and recommendations in a way that seems to have a higher value. For example, as an HR if you have a suggestion that can improve an employee’s performance then the scarcity principle will help you. You can present your idea in a way that holds higher value among people Online Academic writing help