{"id":290,"date":"2023-10-10T10:59:25","date_gmt":"2023-10-10T08:59:25","guid":{"rendered":"http:\/\/eines-informatiques.recursos.uoc.edu\/entornos-y-contenedores\/?page_id=290"},"modified":"2025-02-11T14:32:17","modified_gmt":"2025-02-11T12:32:17","slug":"2-7-crear-la-teva-propia-imatge-docker","status":"publish","type":"page","link":"http:\/\/eines-informatiques.recursos.uoc.edu\/entornos-y-contenedores\/2-7-crear-la-teva-propia-imatge-docker\/","title":{"rendered":"2.7. Crear la teva pr\u00f2pia imatge Docker"},"content":{"rendered":"<p>Si la nostra cerca a Docker Hub ha estat infructuosa o requerim una imatge espec\u00edfica per a les nostres necessitats, la soluci\u00f3 \u00e9s crear-la nosaltres mateixos.<\/p>\n<p>En primer lloc, instal\u00b7larem <em>software <\/em>en una sessi\u00f3 interactiva. Amb aquesta finalitat, utilitzarem la imatge d\u2019Alpine que pr\u00e8viament hav\u00edem creat i intentarem instal\u00b7lar el paquet de <em>python numpy<\/em>. Alpine no \u00e9s la distribuci\u00f3 en la qual voldr\u00edem basar-nos per desenvolupar els nostres projectes; segurament Ubuntu o Debian siguin unes eleccions m\u00e9s apropiades. Abans de comen\u00e7ar una imatge \u00e9s important que tinguem ben clar qu\u00e8 necessitarem instal\u00b7lar, quins s\u00f3n els nostres requisits i, finalment, escollir la distribuci\u00f3 m\u00e9s apropiada. Tamb\u00e9 \u00e9s una bona pr\u00e0ctica no instal\u00b7lar massa programes en cada imatge perqu\u00e8 seran m\u00e9s dif\u00edcils de crear i de mantenir. \u00c9s la mateixa filosofia que aplic\u00e0vem als entorns Conda.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"mowtwo\">$ docker container run -it alpine sh<\/pre>\n<p>Seguidament comprovarem si tenim Python instal\u00b7lat:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"droide\">\/ # python --version<\/pre>\n<p>I podem observar que no est\u00e0 instal\u00b7lat.<\/p>\n<p>Alpine t\u00e9 un gestor de paquets anomenat <em>Alpine Package Keeper<\/em> (apk) per instal\u00b7lar <em>software.<\/em> Depenent de la distribuci\u00f3 de Linux que tinguem instal\u00b7lat, podr\u00edem utilitzar <code>apt-get, yum, zypper<\/code>\u2026<\/p>\n<p>En primer lloc, instal\u00b7larem Python i altres paquets necessaris. Posteriorment, afegirem el paquet <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 ara entrem a Python podem comprovar que s\u2019ha instal\u00b7lat correctament el paquet <em>numpy<\/em>.<\/p>\n<p>Un cop sortim d\u2019aquest contenidor, els canvis no s\u2019hauran guardat. Per crear la nostra pr\u00f2pia imatge, el m\u00e9s recomanable \u00e9s utilitzar un Dockerfile.<\/p>\n<p>Un Dockerfile \u00e9s un arxiu de text amb l\u2019estructura m\u00ednima seg\u00fcent:<\/p>\n<ul>\n<li>FROM &lt;Imatge preexistent&gt;<\/li>\n<li>RUN &lt;Ordres per instal\u00b7lar des de la l\u00ednia d\u2019ordres&gt;<\/li>\n<li>CMD &lt;Ordres que s\u2019han de c\u00f3rrer per defecte&gt;<\/li>\n<\/ul>\n<p>Les instruccions que es llancen per defecte (CMD) tenen una estructura definida. Nom\u00e9s hi pot haver una l\u00ednia de CMD al Dockerfile; si n\u2019hi hagu\u00e9s m\u00e9s d\u2019una, s\u2019executaria l\u2019\u00faltima.<\/p>\n<p>Aix\u00ed, si volgu\u00e9ssim reproduir el contenidor anterior, haur\u00edem de crear un arxiu anomenat <em>Dockerfile<\/em> de la seg\u00fcent 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>Un cop tenim el Dockerfile definit crearem la imatge:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"mowtwo\">$ docker image build -t uoc\/numpy .<\/pre>\n<p>L\u2019opci\u00f3 <code>-t<\/code> ens indica el nom que li volem donar a la nostra imatge. Seguint la nomenclatura anteriorment esmentada indiquem l\u2019autor i el paquet. El \u00ab<code>.<\/code>\u00bb ens indica que Dockerfile \u00e9s a la mateixa carpeta on estem executant les ordres; hem d\u2019especificar la ruta al directori del Dockerfile.<\/p>\n<p>Ara podreu veure la nova imatge creada:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"mowtwo\">$ docker image ls<\/pre>\n<div class=\"tabletitle\"><p>Taula 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 executem el contenidor Docker, ens retornar\u00e0 la versi\u00f3 de Python que tenim instal\u00b7lada a la imatge:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"mowtwo\">$ docker container run uoc\/numpy<\/pre>\n<p>Si entr\u00e9ssim ordres en la l\u00ednia d\u2019execuci\u00f3 del contenidor, aquestes s\u00f3n les que s\u2019utilitzarien en detriment de les que estiguessin al Dockerfile. Aix\u00ed:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"mowtwo\">$ docker container run uoc\/numpy which python3<\/pre>\n<p>Ens indicar\u00e0 la localitzaci\u00f3 de Python3 en el <em>filesystem<\/em> del contenidor.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Si la nostra cerca a Docker Hub ha estat infructuosa o requerim una imatge espec\u00edfica per a les nostres necessitats, la soluci\u00f3 \u00e9s crear-la nosaltres mateixos. En primer lloc, instal\u00b7larem software en una sessi\u00f3 interactiva. Amb aquesta finalitat, utilitzarem la imatge d\u2019Alpine que pr\u00e8viament hav\u00edem creat i intentarem instal\u00b7lar el paquet de python numpy. Alpine [&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\/wp-json\/wp\/v2\/pages\/290"}],"collection":[{"href":"http:\/\/eines-informatiques.recursos.uoc.edu\/entornos-y-contenedores\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"http:\/\/eines-informatiques.recursos.uoc.edu\/entornos-y-contenedores\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"http:\/\/eines-informatiques.recursos.uoc.edu\/entornos-y-contenedores\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/eines-informatiques.recursos.uoc.edu\/entornos-y-contenedores\/wp-json\/wp\/v2\/comments?post=290"}],"version-history":[{"count":7,"href":"http:\/\/eines-informatiques.recursos.uoc.edu\/entornos-y-contenedores\/wp-json\/wp\/v2\/pages\/290\/revisions"}],"predecessor-version":[{"id":451,"href":"http:\/\/eines-informatiques.recursos.uoc.edu\/entornos-y-contenedores\/wp-json\/wp\/v2\/pages\/290\/revisions\/451"}],"wp:attachment":[{"href":"http:\/\/eines-informatiques.recursos.uoc.edu\/entornos-y-contenedores\/wp-json\/wp\/v2\/media?parent=290"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}