{"id":134,"date":"2023-09-01T13:50:04","date_gmt":"2023-09-01T11:50:04","guid":{"rendered":"http:\/\/eines-informatiques.recursos.uoc.edu\/entornos-y-contenedores\/?page_id=134"},"modified":"2025-03-09T13:22:44","modified_gmt":"2025-03-09T11:22:44","slug":"2-7-crear-tu-propia-imagen-docker","status":"publish","type":"page","link":"http:\/\/eines-informatiques.recursos.uoc.edu\/entornos-y-contenedores\/es\/2-7-crear-tu-propia-imagen-docker\/","title":{"rendered":"2.7. Crear tu propia imagen Docker"},"content":{"rendered":"<p>Si tu b\u00fasqueda en Docker Hub ha sido infructuosa o requieres una imagen espec\u00edfica para tus necesidades, la soluci\u00f3n es crearla t\u00fa mismo.<\/p>\n<p>En primer lugar, instalaremos software en una sesi\u00f3n interactiva. Para ello utilizaremos la imagen de Alpine que previamente hab\u00edamos creado e intentaremos instalar en paquete de <em>python numpy<\/em>. Alpine no es la distribuci\u00f3n en la que querr\u00edais basaros para desarrollar vuestros proyectos; seguramente Ubuntu o Debian sean unas elecciones m\u00e1s apropiadas. Antes de empezar una imagen es importante que sep\u00e1is qu\u00e9 necesitar\u00e9is instalar, cu\u00e1les son vuestros requerimientos y escoger la distribuci\u00f3n m\u00e1s apropiada. Tambi\u00e9n es una buena pr\u00e1ctica no instalar muchos programas en cada imagen, ya que ser\u00e1n m\u00e1s dif\u00edciles de crear y mantener. Es la misma filosof\u00eda que aplic\u00e1bamos a los entornos Conda.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"mowtwo\">$ docker container run -it alpine sh<\/pre>\n<p>Seguidamente comprobaremos si tenemos Python instalado:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"droide\">\/ # python --version<\/pre>\n<p>Y podemos observar que no est\u00e1 instalado.<\/p>\n<p>Alpine tiene un gestor de paquetes llamado <em>Alpine Package Keeper<\/em> (apk) para instalar software. Dependiendo de la distribuci\u00f3n de Linux que os hay\u00e1is instalado podr\u00edais utilizar <code>apt-get, yum, zypper<\/code>\u2026<\/p>\n<p>En primer lugar, instalaremos Python y otros paquetes necesarios, y posteriormente el paquete <em>numpy<\/em>.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"droide\">\/ # apk --no-cache --update-cache add gcc gfortran python3 py3-pip python3-dev build-base wget freetype-dev libpng-dev openblas-dev\r\n\r\n\/ # pip install numpy<\/pre>\n<p>Si ahora entramos en Python podemos comprobar que se ha instalado correctamente el paquete <em>numpy<\/em>.<\/p>\n<p>Una vez salgas de este contenedor los cambios no se habr\u00e1n guardado. Para crear tu propia imagen lo m\u00e1s recomendable es utilizar un Dockerfile.<\/p>\n<p>Un Dockerfile es un archivo de texto con la siguiente estructura m\u00ednima:<\/p>\n<ul>\n<li>FROM &lt;Imagen preexistente&gt;<\/li>\n<li>RUN &lt;Comandos para instalar desde la l\u00ednea de comandos&gt;<\/li>\n<li>CMD &lt;Comandos que deben correrse por defecto&gt;<\/li>\n<\/ul>\n<p>Las instrucciones que se lanzan por defecto (CMD) tienen una estructura definida. Solo puede haber una l\u00ednea de CMD en el Dockerfile; si hubiera m\u00e1s de una se ejecutar\u00eda la \u00faltima.<\/p>\n<p>As\u00ed si quisi\u00e9ramos reproducir el contenedor anterior deber\u00edamos crear un archivo nombrado <em>Dockerfile<\/em> de la siguiente manera:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"droide\">FROM alpine\r\n\r\nRUN apk --no-cache --update-cache add gcc gfortran python3 py3-pip python3-dev build-base wget freetype-dev libpng-dev openblas-dev\r\n\r\nRUN pip install numpy\r\n\r\nCMD python3 --version<\/pre>\n<p>Una vez tenemos el Dockerfile definido crearemos la imagen:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"mowtwo\">$ docker image build -t uoc\/numpy .<\/pre>\n<p>La opci\u00f3n <code>-t<\/code> nos indica el nombre que le queremos dar a nuestra imagen. Siguiendo la nomenclatura anteriormente mencionada indicamos el autor y el paquete. El \u00ab.\u00bb nos indica que Dockerfile est\u00e1 en la misma carpeta donde estamos ejecutando los comandos; debemos especificar la ruta al directorio del Dockerfile.<\/p>\n<p>Ahora podr\u00e9is ver la nueva imagen creada:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"mowtwo\">$ docker image ls<\/pre>\n<div class=\"tabletitle\"><p>Tabla 3.<\/p>\n<\/div>\n<table width=\"642\">\n<tbody>\n<tr class=\"table-header\">\n<td width=\"128\"><strong>REPOSITORY\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/strong><\/td>\n<td width=\"128\"><strong>TAG<\/strong><\/td>\n<td width=\"128\"><strong>IMAGE ID\u00a0\u00a0\u00a0\u00a0\u00a0 <\/strong><\/td>\n<td width=\"128\"><strong>CREATED\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/strong><\/td>\n<td width=\"128\"><strong>SIZE<\/strong><\/td>\n<\/tr>\n<tr>\n<td width=\"128\">uoc\/numpy<\/td>\n<td width=\"128\">latest<\/td>\n<td width=\"128\">af1700de32cb<\/td>\n<td width=\"128\">25 minutes ago<\/td>\n<td width=\"128\">588MB<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Si corremos el contenedor Docker nos devolver\u00e1 la versi\u00f3n de Python que tenemos instalada en la imagen:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"mowtwo\">$ docker container run uoc\/numpy<\/pre>\n<p>Si entr\u00e1semos comandos en la l\u00ednea de ejecuci\u00f3n del contenedor, estos son los que se utilizar\u00edan en detrimento de los que estuviesen en el Dockerfile. As\u00ed:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"mowtwo\">$ docker container run uoc\/numpy which python3<\/pre>\n<p>Te indicar\u00e1 la localizaci\u00f3n de Python3 en el <em>filesystem<\/em> del contenedor.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Si tu b\u00fasqueda en Docker Hub ha sido infructuosa o requieres una imagen espec\u00edfica para tus necesidades, la soluci\u00f3n es crearla t\u00fa mismo. En primer lugar, instalaremos software en una sesi\u00f3n interactiva. Para ello utilizaremos la imagen de Alpine que previamente hab\u00edamos creado e intentaremos instalar en paquete de python numpy. Alpine no es la [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":[],"acf":[],"_links":{"self":[{"href":"http:\/\/eines-informatiques.recursos.uoc.edu\/entornos-y-contenedores\/es\/wp-json\/wp\/v2\/pages\/134"}],"collection":[{"href":"http:\/\/eines-informatiques.recursos.uoc.edu\/entornos-y-contenedores\/es\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"http:\/\/eines-informatiques.recursos.uoc.edu\/entornos-y-contenedores\/es\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"http:\/\/eines-informatiques.recursos.uoc.edu\/entornos-y-contenedores\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/eines-informatiques.recursos.uoc.edu\/entornos-y-contenedores\/es\/wp-json\/wp\/v2\/comments?post=134"}],"version-history":[{"count":6,"href":"http:\/\/eines-informatiques.recursos.uoc.edu\/entornos-y-contenedores\/es\/wp-json\/wp\/v2\/pages\/134\/revisions"}],"predecessor-version":[{"id":469,"href":"http:\/\/eines-informatiques.recursos.uoc.edu\/entornos-y-contenedores\/es\/wp-json\/wp\/v2\/pages\/134\/revisions\/469"}],"wp:attachment":[{"href":"http:\/\/eines-informatiques.recursos.uoc.edu\/entornos-y-contenedores\/es\/wp-json\/wp\/v2\/media?parent=134"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}