{"id":14,"date":"2020-04-30T10:21:47","date_gmt":"2020-04-30T08:21:47","guid":{"rendered":"https:\/\/edutictac.es\/chverma\/?p=14"},"modified":"2020-04-30T10:21:47","modified_gmt":"2020-04-30T08:21:47","slug":"ponencia-ujilliurex-2020-be-docker-my-friend","status":"publish","type":"post","link":"https:\/\/edutictac.es\/blog\/chverma\/2020\/04\/30\/ponencia-ujilliurex-2020-be-docker-my-friend\/","title":{"rendered":"Pon\u00e8ncia Ujilliurex 2020: Be docker, my friend"},"content":{"rendered":"\n<p>Podeu consultar esta pon\u00e8ncia i totes les pon\u00e8ncies a <a href=\"http:\/\/ujilliurex.uji.es\/videos.php\">http:\/\/ujilliurex.uji.es\/videos.php<\/a><\/p>\n\n\n\n<p class=\"has-text-align-left\">Abans d\u2019explicar qu\u00e8 \u00e9s docker, farem una comparativa amb la realitat. Nosaltres, com a persones, som dependents d\u2019objectes que necessitem per a fer certes faenes. Per exemple, necessitem culleres per al caldo, forquetes per a l\u2019ensalada&#8230; Imaginem que se\u2019n anem a passar un mes fora de casa, all\u00e0 on Sant Pere <em>va pedre la sabata. <\/em>All\u00ed sols hi ha quatre parets i un teulat, ni sof\u00e0, ni cuina&#8230; I et preguntes, paga la pena anar? I si pogueres embolicar totes les depend\u00e8ncies\/ferramentes necess\u00e0ries per a desenvolupar la teua vida all\u00ed amb normalitat i foren portables? Doncs a\u00e7\u00f2 \u00e9s docker.<\/p>\n\n\n\n<p>No obstant, no podem comen\u00e7ar la casa per la teulada, cal posar \u00e8mfasi amb diversos conceptes envers als contenidors. Per tant, a continuaci\u00f3 s\u2019expliquen els conceptes b\u00e0sics.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Imatges<\/h2>\n\n\n\n<p>Una imatge \u00e9s un paquet, en el qual es troba una aplicaci\u00f3 o servei i tot el necessari (codi, executables, llibreries, configuraci\u00f3, etc) perqu\u00e8 esta aplicaci\u00f3 puga funcionar.<\/p>\n\n\n\n<p>Per\u00f2, aleshores, per qu\u00e8 estem parlant d\u2019imatges i no de contenidors? D\u2019acord amb el diccionari, una imatge \u00e9s una \u00abidea o representaci\u00f3 mental del que es percep pels sentits\u00bb. Qu\u00e8 t\u00e9 a vore una imatge ac\u00ed? Doncs b\u00e9, un contenidor no \u00e9s m\u00e9s que una inst\u00e0ncia d\u2019una imatge, \u00e9s a dir, una imatge en funcionament. Tamb\u00e9 podem fer un s\u00edmil entre imatge i un programa executable. Si ens fixem, quan executem un programa, este es transforma en un proc\u00e9s (una inst\u00e0ncia del programa). Si el tornem a executar obtenim una segona inst\u00e0ncia. Aleshores, podem dir que les imatges s\u00f3n com els programes executables i els contenidors com els processos en execuci\u00f3.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Contenidors<\/h2>\n\n\n\n<p>Com explic\u00e0vem abans, un contenidor no \u00e9s m\u00e9s que una inst\u00e0ncia d&#8217;esta imatge que t\u00e9 tot el necessari perqu\u00e8 la nostra aplicaci\u00f3 funcione adequadament. Per\u00f2, el contenidor t\u00e9 una caracter\u00edstica realment interessant. El contenidor utilitza i comparteix el sistema operatiu de la m\u00e0quina en la qual s&#8217;est\u00e0 executant, amb altres aplicacions i per descomptat, amb altres contenidors.<\/p>\n\n\n\n<p>Aix\u00f2 \u00e9s precisament el que ho diferencia d&#8217;una m\u00e0quina virtual. Les m\u00e0quines virtuals alcen un sistema operatiu complet, mentre que els contenidors tenen el m\u00ednim imprescindible per al funcionament de l&#8217;aplicaci\u00f3 o servei, \u00e9s a dir, minimitza les aplicacions i programes b\u00e0sics per al funcionament d\u2019una aplicaci\u00f3 o programa concret.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Imatges i contenidors<\/h2>\n\n\n\n<p>La difer\u00e8ncia entre el paral\u00b7lelisme, que feiem abans entre les inst\u00e0ncies dels programes i els contenidors, radica en el fet que quan acaba l&#8217;execuci\u00f3 d&#8217;una inst\u00e0ncia de l&#8217;aplicaci\u00f3 esta desapareix, en canvi, en detindre un contenidor este queda enmagatzemat en el nostre equip. Per qu\u00e8? La ra\u00f3 perqu\u00e8 el contenidor quede en el nostre equip \u00e9s, d&#8217;una banda per poder iniciar-lo de nou, i en segon lloc, perqu\u00e8 \u00e9s possible que a l&#8217;interior d&#8217;este tinguem arxius que ens siguen d&#8217;utilitat. Si en acabar l&#8217;execuci\u00f3 del contenidor, s&#8217;esborrara de manera autom\u00e0tica, segur que en m\u00e9s d&#8217;una ocasi\u00f3, s&#8217;emportar\u00edem un disgust.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Instal\u00b7laci\u00f3 de l&#8217;entorn<\/h2>\n\n\n\n<p>Podem trobar les instruccions d\u2019instal\u00b7laci\u00f3 del docker al web oficial: <a href=\"https:\/\/docs.docker.com\/get-docker\/\">https:\/\/docs.docker.com\/get-docker\/<\/a><\/p>\n\n\n\n<p>Com som sabeu, al Lliurex 19 podem instal\u00b7lar el docker emprant el Zero-Center o per comandaments. Ac\u00ed, ho farem per consola.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Preparaci\u00f3 dels repositoris<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code># Actualitzar i instal\u00b7lar paquets per permetre l\u2019\u00fas d\u2019apt via https\n$ sudo apt-get update\n\n$ sudo apt-get install \\\n    apt-transport-https \\\n    ca-certificates \\\n    curl \\\n    gnupg-agent \\\n    software-properties-common\n\n# Afegir clau GPG\n $ curl -fsSL https:\/\/download.docker.com\/linux\/ubuntu\/gpg | sudo apt-key add -\n\n# Afegir repositori\n $ sudo add-apt-repository \\\n   \"deb &#091;arch=amd64] https:\/\/download.docker.com\/linux\/ubuntu \\\n   $(lsb_release -cs) \\\n   stable\"<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">Instalar docker i docker-compose<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code># Actualitzar i instal\u00b7lar docker Community Edition\n $ sudo apt-get update\n $ sudo apt-get install docker-ce docker-ce-cli containerd.io\n# Afegir docker al nostre grup, aix\u00ed no cal emprar sudo\n $ sudo usermod -aG docker $USER\n# Instal\u00b7lar docker-compose\n$ sudo curl -L \"https:\/\/github.com\/docker\/compose\/releases\/download\/1.25.4\/docker-compose-$(uname -s)-$(uname -m)\" -o \/usr\/local\/bin\/docker-compose\n$ sudo chmod +x \/usr\/local\/bin\/docker-compose<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">Test: Hola m\u00f3n<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code># Hola m\u00f3n\n $ docker run hello-world<\/code><\/pre>\n\n\n\n<p class=\"has-text-align-left\">Com tots els programes, el primer \u00e9s fer el Hola m\u00f3n. <br>Com qualsevol contenidor, es necessita d\u2019una imatge per poder generar una inst\u00e0ncia. Esta imatge \u00e9s diu hello-world.<br>Normalment, les imatges estan allotjades a <a href=\"https:\/\/hub.docker.com\/\">https:\/\/hub.docker.com<\/a>. Es una plataforma on podem penjar les nostres imatges i seran p\u00fabliques per a les dem\u00e9s persones. <br>Qu\u00e8 fa \u00ab<strong>docker run hello-world<\/strong>\u00bb comandament? Al intentar posar en funcionament la imatge hello-world, el que fem es buscar si ja tenim una imatge anomenada \u00abhello-world\u00bb al nostre equip, en cas contrari, la descarrega del repositori, crea i arranca un contenidor al nostre ordinador.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Comandaments docker<\/h2>\n\n\n\n<h4 class=\"wp-block-heading\">Llistar imatges i contenidors<\/h4>\n\n\n\n<p>Per a saber de quines imatges disposem localment, podem emprar <strong>docker image ls<\/strong> o <strong>docker images<\/strong>. Per obtindre els contenidors que tenim executant-se actualment emprarem <strong>docker container ls<\/strong>. Si volem llistar tots els contenidors <strong>docker container ls -a<\/strong>.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Arrancar un contenidor i executar la consola<\/h4>\n\n\n\n<p>Una vegada posem en marxa un contenidor amb <strong>docker run [nom_imatge]<\/strong>, este passa a execuci\u00f3. Podem executar comandaments dins del contenidor. Per exemple, podem emprar la consola d\u2019eixe contenidor. Per a fer-ho, abans hem d\u2019intentificar el nom del contenidor, el seu <strong>CONTAINER ID<\/strong>. Per tant, executem <strong>docker container ls<\/strong> i copiem l\u2019identificador corresponent. Tamb\u00e9 podem quedar-nos amb els primers caracters alfanum\u00e8rics. Per exemple, si tenim un contenidor amb id 2d09865a0635 podem emprar <strong>docker exec -ti 2d0 sh<\/strong>. Amb este comandament estem executant <strong>sh<\/strong> en el contenidor 2d09865a0635 amb dues opcions: <strong>-t<\/strong> li estem dient que emprarem una pseudoterminal i amb <strong>-i<\/strong> ser\u00e0 interactiva. Tan propte com executem el comandament entrarem en la consola del contenidor i podrem navegar i executar comandaments dins d\u2019este. Per aquest motiu, <strong>no cal usar SSH<\/strong> per interactuar amb els contenidors.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Parar i esborrar un contenidor<\/h4>\n\n\n\n<p>Si ja hem acabat amb el contenidor i volem tombar-lo, el primer que hem de fer es parar l\u2019execuci\u00f3 amb <strong>docker stop 2d0<\/strong> (tamb\u00e9 podem polsar <strong>ctrl + C<\/strong> en el terminal on hem llan\u00e7at el contenidor). Si el que volem es esborrar els contenidors, perqu\u00e8 ja no els necessitem i ocupen espai, emprarem <strong>docker container rm 2d0<\/strong>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Docker-compose<\/h2>\n\n\n\n<p>Una vegada hem vist com llan\u00e7ar i manejar els contenidors i les imatges, passarem a les opcions per a emprar volums, exposar serveis, mapejar ports&#8230; Per\u00f2 en compte d\u2019emprar directament docker, emprarem una ferramenta que ens ajuda a configurar, al\u00e7ar, parar i moltes m\u00e9s coses, els nostres contenidors. Esta ferramenta es diu <strong>docker-compose<\/strong>. Per a aprendre de forma simple com s\u2019empra esta ferramenta, anem a fer-ho de forma pr\u00e0ctica. Abans, un poc de context. <br>Moltes vegades, quan treballem com a <strong>coordinadores TIC<\/strong> als centres, ens trobem que hem de solucionar infinites <strong>incid\u00e8ncies<\/strong>, totes sabeu de qu\u00e8 parle&#8230; Doncs una forma de centralizar-les \u00e9s emprar un formulari accessible dins del centre, on les docents poden emplenar les seues incid\u00e8ncies i les coordinadores planificar-se per resoldre-les o donar instruccions de com es poden solventar. A m\u00e9s, podem emprar el mateix sistema que s\u2019usa per a les incid\u00e8ncies que col\u00b7loquem al SAI, el sistema <strong>OTRS<\/strong>. <br>Aleshores, anem a la faena. Per emprar la ferramenta <strong>docker-compose<\/strong>, necessitem crear un fitxer anomenat <strong>docker-compose.yml<\/strong>. Afortunadament, no som els \u00fanics que hem pensat en \u00abdockeritzar\u00bb OTRS, una simple cerca al web ens duu a un repositori a GitHub anomenat <a rel=\"noreferrer noopener\" href=\"https:\/\/github.com\/complemento\/docker.otrs\" target=\"_blank\">complemento\/docker.otrs<\/a>. A m\u00e9s, ens dona ja un fitxer <a rel=\"noreferrer noopener\" href=\"https:\/\/raw.githubusercontent.com\/complemento\/docker.otrs\/master\/docker-compose.yaml\" target=\"_blank\">docker-compose.yml<\/a>. Crearem una carpeta local (p.e. $ mkdir docker-otrs) i dins d\u2019esta executem $ wget <a rel=\"noreferrer noopener\" href=\"https:\/\/raw.githubusercontent.com\/complemento\/docker.otrs\/master\/docker-compose.yaml\" target=\"_blank\">https:\/\/raw.githubusercontent.com\/complemento\/docker.otrs\/master\/docker-compose.yaml<\/a> En este moment, ja podem analitzar les opcions de les que fa \u00fas este fitxer. Este fitxer empra el format yml. De forma resumida, la formataci\u00f3 que empra \u00e9s:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Cada opci\u00f3 dep\u00e9n de forma jer\u00e0rquica de la seua superior.<\/li><li>Cada opci\u00f3 ha de ser identada de forma correcta per a especificar a qui pertany.<\/li><li>Si una opci\u00f3 t\u00e9 diverses entrades podem emprar el guionet (-)<\/li><\/ul>\n\n\n\n<p>Al web <a href=\"https:\/\/docs.docker.com\/compose\/compose-file\/compose-file-v2\/\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/docs.docker.com\/compose\/compose-file\/compose-file-v2\/<\/a> podem trobar totes les opcions de qu\u00e8 disposa este fitxer.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">El fitxer docker-compose.yml<\/h4>\n\n\n\n<pre class=\"wp-block-preformatted\" style=\"font-size: small\"><span style=\"color:#e34adc\">version:<\/span> <span style=\"color:#0000e6\">'2'<\/span>\n\n<span style=\"color:#e34adc\">services:<\/span>\n<span style=\"color:#e34adc\">&nbsp;&nbsp;otrs:<\/span>\n<span style=\"color:#e34adc\">&nbsp;&nbsp;&nbsp;&nbsp;image:<\/span> ligero<span style=\"color:#808030\">\/<\/span>otrs\n<span style=\"color:#e34adc\">&nbsp;&nbsp;&nbsp;&nbsp;restart:<\/span> unless<span style=\"color:#808030\">-<\/span>stopped\n<span style=\"color:#e34adc\">&nbsp;&nbsp;&nbsp;&nbsp;volumes:<\/span>\n      <span style=\"color:#808030\">-<\/span> <span style=\"color:#808030\">.<\/span><span style=\"color:#808030\">\/<\/span>data<span style=\"color:#808030\">\/<\/span>otrs<span style=\"color:#800080\">:<\/span><span style=\"color:#808030\">\/<\/span>opt<span style=\"color:#808030\">\/<\/span>otrs\n      <span style=\"color:#808030\">-<\/span> <span style=\"color:#808030\">\/<\/span>etc<span style=\"color:#808030\">\/<\/span><span style=\"color:#603000\">localtime<\/span><span style=\"color:#800080\">:<\/span><span style=\"color:#808030\">\/<\/span>etc<span style=\"color:#808030\">\/<\/span><span style=\"color:#603000\">localtime<\/span><span style=\"color:#800080\">:<\/span>ro\n      <span style=\"color:#808030\">-<\/span> <span style=\"color:#808030\">.<\/span><span style=\"color:#808030\">\/<\/span>otrs_addons<span style=\"color:#800080\">:<\/span><span style=\"color:#808030\">\/<\/span>opt<span style=\"color:#808030\">\/<\/span>otrs_addons\n<span style=\"color:#e34adc\">&nbsp;&nbsp;&nbsp;&nbsp;environment:<\/span>\n      <span style=\"color:#808030\">-<\/span> MYSQL_HOSTNAME<span style=\"color:#808030\">=<\/span>mysql\n      <span style=\"color:#808030\">-<\/span> MYSQL_USERNAME<span style=\"color:#808030\">=<\/span>root\n      <span style=\"color:#808030\">-<\/span> MYSQL_PASSWORD<span style=\"color:#808030\">=<\/span>ligero\n      <span style=\"color:#808030\">-<\/span> CUSTOMER_ID<span style=\"color:#808030\">=<\/span>ligero\n      <span style=\"color:#808030\">-<\/span> OTRS_SYSTEM_ID<span style=\"color:#808030\">=<\/span><span style=\"color:#008c00\">10<\/span>\n      <span style=\"color:#808030\">-<\/span> OTRS_DEFAULT_LANGUAGE<span style=\"color:#808030\">=<\/span>en\n      <span style=\"color:#808030\">-<\/span> OTRS_FQDN<span style=\"color:#808030\">=<\/span>myotrs<span style=\"color:#808030\">.<\/span>ligero<span style=\"color:#808030\">.<\/span>online\n      <span style=\"color:#808030\">-<\/span> INSTALL<span style=\"color:#808030\">=<\/span><span style=\"color:#008c00\">1<\/span>\n<span style=\"color:#004a43\">#<\/span><span style=\"color:#004a43\">      <\/span><span style=\"color:#808030\">-<\/span><span style=\"color:#004a43\"> DONT_INSTALL_LIGERO_ADDONS<\/span><span style=\"color:#808030\">=<\/span><span style=\"color:#004a43\">1<\/span>\n<span style=\"color:#e34adc\">&nbsp;&nbsp;&nbsp;&nbsp;depends_on:<\/span>\n      <span style=\"color:#808030\">-<\/span> mysql\n<span style=\"color:#e34adc\">&nbsp;&nbsp;&nbsp;&nbsp;expose:<\/span>\n      <span style=\"color:#808030\">-<\/span> <span style=\"color:#008c00\">80<\/span>\n<span style=\"color:#004a43\">&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span style=\"color:#004a43\">#<\/span><span style=\"color:#004a43\"> ports<\/span><span style=\"color:#808030\">:<\/span>\n<span style=\"color:#004a43\">&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span style=\"color:#004a43\">#<\/span><span style=\"color:#004a43\">   <\/span><span style=\"color:#808030\">-<\/span><span style=\"color:#004a43\"> 80<\/span><span style=\"color:#808030\">:<\/span><span style=\"color:#004a43\">80<\/span>\n<span style=\"color:#e34adc\">&nbsp;&nbsp;mysql:<\/span>\n<span style=\"color:#e34adc\">&nbsp;&nbsp;&nbsp;&nbsp;image:<\/span> mysql<span style=\"color:#800080\">:<\/span><span style=\"color:#008000\">5.7<\/span>\n<span style=\"color:#e34adc\">&nbsp;&nbsp;&nbsp;&nbsp;restart:<\/span> unless<span style=\"color:#808030\">-<\/span>stopped\n<span style=\"color:#e34adc\">&nbsp;&nbsp;&nbsp;&nbsp;volumes:<\/span>\n      <span style=\"color:#808030\">-<\/span> <span style=\"color:#808030\">.<\/span><span style=\"color:#808030\">\/<\/span>data<span style=\"color:#808030\">\/<\/span>mysql<span style=\"color:#800080\">:<\/span><span style=\"color:#808030\">\/<\/span>var<span style=\"color:#808030\">\/<\/span>lib<span style=\"color:#808030\">\/<\/span>mysql\n<span style=\"color:#e34adc\">&nbsp;&nbsp;&nbsp;&nbsp;environment:<\/span>\n      <span style=\"color:#808030\">-<\/span> MYSQL_ROOT_PASSWORD<span style=\"color:#808030\">=<\/span>ligero\n<span style=\"color:#e34adc\">&nbsp;&nbsp;&nbsp;&nbsp;command:<\/span>\n      <span style=\"color:#808030\">-<\/span> <span style=\"color:#808030\">-<\/span><span style=\"color:#808030\">-<\/span>max_allowed_packet<span style=\"color:#808030\">=<\/span><span style=\"color:#008c00\">65737518<\/span>\n      <span style=\"color:#808030\">-<\/span> <span style=\"color:#808030\">-<\/span><span style=\"color:#808030\">-<\/span>innodb_log_file_size<span style=\"color:#808030\">=<\/span><span style=\"color:#008c00\">269331648<\/span>\n      <span style=\"color:#808030\">-<\/span> <span style=\"color:#808030\">-<\/span><span style=\"color:#808030\">-<\/span>query_cache_size<span style=\"color:#808030\">=<\/span><span style=\"color:#008c00\">36737518<\/span>\n      <span style=\"color:#808030\">-<\/span> <span style=\"color:#808030\">-<\/span><span style=\"color:#808030\">-<\/span>character_set_server<span style=\"color:#808030\">=<\/span>utf8\n      <span style=\"color:#808030\">-<\/span> <span style=\"color:#808030\">-<\/span><span style=\"color:#808030\">-<\/span><span style=\"color:#400000\">bind<\/span><span style=\"color:#808030\">-<\/span>address<span style=\"color:#808030\">=<\/span><span style=\"color:#008000\">0.0<\/span><span style=\"color:#808030\">.<\/span><span style=\"color:#008000\">0.0<\/span>\n<\/pre>\n\n\n\n<p>Al nostre fitxer, el primer que trobem \u00e9s \u00ab<strong>version<\/strong>\u00bb. Amb esta opci\u00f3, especifiquem quina versi\u00f3 del \u00abcompose-file\u00bb estem usant. En el nostre cas, la 2 (s\u2019especifica entre cometa simple). A continuaci\u00f3, trobem la secci\u00f3 de \u00ab<strong>services<\/strong>\u00bb on especifiquem els nostres serveis o contenidors que emprarem. En el nostre cas, emprem dos contenidors, un per al servei web (otrs) i altre per a emmagatzemar la informaci\u00f3, un sistema gestor de bases de dades (MySQL). Cada servei t\u00e9 les seues pr\u00f2pies opcions. En primer lloc, el contenidor \u00ab<strong>otrs<\/strong>\u00bb empra com a imatge \u00abligero\/otrs\u00bb. Amb l\u2019opci\u00f3 \u00ab<strong>restart<\/strong>: unless-stopped\u00bb indiquem que el contenidor torne a execuci\u00f3 sempre que nosaltres no el parem. Per exemple, si l\u2019ordinador s\u2019apaga, quan es torne a encendre el contenidor tamb\u00e9 es posar\u00e0 en funcionament. La seg\u00fcent opci\u00f3 que trobem \u00e9s \u00ab<strong>volumes<\/strong>\u00bb. Amb esta opci\u00f3 mapegem els directoris locals amb els de l\u2019interior del contenidor. Aix\u00ed, dintre del directori que hem creat tindrem dos directoris (el punt (.) indica que l\u2019ha de crear dins del directori actual:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>.\/data\/otrs contindr\u00e0 tot el que cont\u00e9 \/opt\/otrs<\/li><li>.\/otrs_addons contindr\u00e0 tot el que cont\u00e9 \/opt\/otrs_addons<\/li><\/ul>\n\n\n\n<p>A m\u00e9s, tamb\u00e9 li propocionem al contenidor la nostra configuraci\u00f3 d\u2019\u00fas horari, la data i l\u2019hora amb \/etc\/localtime:\/etc\/localtime:ro. :ro significa read only, sols lectura.\nContinuant amb les opcions, trobem \u00ab<strong>environment<\/strong>\u00bb on idiquem les variables d\u2019entorn que emprar\u00e0 el nostre contenidor. Trobem, doncs, les seg\u00fcents variables:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>MYSQL_HOSTNAME=mysql. Indiquem que la direcci\u00f3 de l\u2019equip que disposa de MySQL \u00e9s el contenidor \u00abmysql\u00bb. Tamb\u00e9 podr\u00edem indicar-li altres direccions, com localhost, exemple.com&#8230;<\/li><li>MYSQL_USERNAME=root i MYSQL_PASSWORD=ligero, on idiquem l\u2019usuari i la contrasenya per autenticar-nos contra la base de dades.<\/li><li>CUSTOMER_ID=ligero,  OTRS_SYSTEM_ID=10, OTRS_DEFAULT_LANGUAGE=en, OTRS_FQDN=myotrs.ligero.online, INSTALL=1 s\u00f3n variables que empra el OTRS.<\/li><\/ul>\n\n\n\n<p>Amb l\u2019opci\u00f3 \u00ab<strong>depends_on<\/strong>\u00bb indiquem que el contenidor \u00abotrs\u00bb dep\u00e9n de \u00abmysql\u00bb, per tant, per a iniciar-se s\u2019ha d\u2019iniciar primer el contenidor corresponent.\nPer defecte, cap contenidor exposa cap servei (port). Com sabeu, el port habitual del protocol HTTP \u00e9s el 80. Per tant, hem d\u2019exposar el port 80 del contenidor \u00abotrs\u00bb. Per\u00f2, exposar-lo no significa que siga accessible a trav\u00e9s de la xarxa, significa que podem fer una petici\u00f3 a l\u2019IP que tinga assignada el contenidor i obtindre el servei solicitat. Per aix\u00f2, tenim a la nostra disposici\u00f3 l\u2019opci\u00f3 \u00ab<strong>ports<\/strong>\u00bb on podem mapejar els ports del contenidor amb la nostra m\u00e0quina. Per exemple, -ports: 80:80, per tant, tota petici\u00f3 rebuda a la nostra m\u00e0quina pel port 80 ser\u00e0 redirigida al port 80 del contenidor. Aix\u00ed, dins del centre podr\u00edem accedir a l\u2019OTRS amb 10.0.1.1:80.\nPer altre costat, el contenidor \u00ab<strong>mysql<\/strong>\u00bb compta amb opcions molt paregudes a les del contenidor anterior. D\u2019estes, remarcarem la contrasenya del MYSQL que ha de ser la mateixa que la del contenidor anterior. Finalment, trobem l\u2019opci\u00f3 \u00ab<strong>commands<\/strong>\u00bb on especifiquem els comandaments que ha d\u2019executar el nostre contenidor.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Desplegar serveis<\/h4>\n\n\n\n<p>Donades per explicades les configuracions b\u00e0siques que podem especificar al fitxer \u00ab<strong>docker-compose.yml<\/strong>\u00bb, en este moment ja podem desplegar els nostres serveis (contenidors). Per a fer-ho, comptem amb el comandament <strong>docker-compose up<\/strong> i si volem que s\u2019execute en \u00abbackgroud\u00bb o com a dimoni (daemon), emprarem <strong>docker-compose up -d<\/strong>.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Consultar logs<\/h4>\n\n\n\n<p>Per a llegir els logs que generen els nostres contenidors emprarem \u00ab<strong>docker-compose logs<\/strong>\u00bb. Si volem llegir a mesura que van generant-se \u00ab<strong>docker-compose logs -f<\/strong>\u00bb. Si sols volem llegir els d\u2019un contenidor en concret \u00ab<strong>docker-compose logs -f mysql<\/strong>\u00bb.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Entrar al terminal del contenidor<\/h4>\n\n\n\n<p>Com f\u00e9iem amb \u00abdocker\u00bb, tamb\u00e9 podem accedir dins del contenidor amb \u00ab<strong>docker-compose exec mysql bash<\/strong>\u00bb.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Reiniciar contenidors<\/h4>\n\n\n\n<p>Per altra banda, podem reiniciar els contenidors amb \u00abdocker-compose restart\u00bb o sols un contenidor \u00ab<strong>docker-compose restart mysql<\/strong>\u00bb. Tamb\u00e9 podem parar-los amb \u00ab<strong>docker-compose down<\/strong>\u00bb..<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Llistar les imatges i contenidors del projecte<\/h4>\n\n\n\n<p>Podem mostrar quins contenidors tenim executant-se amb \u00ab<strong>docker-compose ps<\/strong>\u00bb. Llistar les imatges ho far\u00edem amb \u00ab<strong>docker-compose images<\/strong>\u00bb.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Esborrar contenidors<\/h4>\n\n\n\n<p>Esborrar els contenidors amb \u00ab<strong>docker-compose rm<\/strong>\u00bb o si sols volem fer-ho sobre un \u00ab<strong>docker-compose rm mysql<\/strong>\u00bb.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Dockerfile: Muntant la nostra pr\u00f2pia imatge<\/h2>\n\n\n\n<p>Ja que estem treballant sobre el projecte <a href=\"https:\/\/github.com\/complemento\/docker.otrs\">https:\/\/github.com\/complemento\/docker.otrs<\/a> farem \u00fas del seu Dockerfile. Una cosa que encara no hem explicat \u00e9s que les imatges docker es construeixen mitjan\u00e7ant capes. Una capa es crea quan es treballa sobre la imatge, \u00e9s a dir, quan s\u2019executa una instrucci\u00f3 o comandament. <\/p>\n\n\n\n<pre style=\"font-size:small\"><code>FROM ubuntu:16.04\nMAINTAINER Complemento \n\n# Definitions\nENV OTRS_VERSION=6.0.10\nENV LIGERO_REPOSITORY=6.0.0\n\nRUN apt-get update &amp;&amp; \\\n    apt-get install -y supervisor \\\n    apt-utils \\\n    libterm-readline-perl-perl &amp;&amp; \\\n    apt-get install -y locales &amp;&amp; \\\n    locale-gen en_US.UTF-8\nENV LANG en_US.UTF-8\nENV LANGUAGE en_US:en\nENV LC_ALL en_US.UTF-8\n\nRUN apt-get install -y apache2 git bash-completion cron sendmail curl vim wget mysql-client\n\n# CREATE OTRS USER\nRUN useradd -d \/opt\/otrs -c 'OTRS user' otrs &amp;&amp; \\\n    usermod -a -G www-data otrs &amp;&amp; \\\n    usermod -a -G otrs www-data\n\nRUN mkdir \/opt\/src &amp;&amp; \\\n    cd \/opt\/src\/ &amp;&amp; \\\n    chown otrs:www-data \/opt\/src &amp;&amp; \\\n    su -c \"git clone -b rel-$(echo $OTRS_VERSION | sed --expression='s\/\\.\/_\/g') \\\n    --single-branch https:\/\/github.com\/OTRS\/otrs.git\" -s \/bin\/bash otrs\n\nRUN sed -i -e \"s\/6.0.x git\/${OTRS_VERSION}\/g\" \/opt\/src\/otrs\/RELEASE\n\nCOPY link.pl \/opt\/src\/\n\nRUN chmod 755 \/opt\/src\/link.pl &amp;&amp; \\\n    mkdir \/opt\/otrs &amp;&amp; \\\n    chown otrs:www-data \/opt\/otrs\n\n# perl modules\nRUN apt-get install -y  libarchive-zip-perl \\\n                        libcrypt-eksblowfish-perl \\\n                        libcrypt-ssleay-perl \\\n                        libtimedate-perl \\\n                        libdatetime-perl \\\n                        libdbi-perl \\\n                        libdbd-mysql-perl \\\n                        libdbd-odbc-perl \\\n                        libdbd-pg-perl \\\n                        libencode-hanextra-perl \\\n                        libio-socket-ssl-perl \\\n                        libjson-xs-perl \\\n                        libmail-imapclient-perl \\\n                        libio-socket-ssl-perl \\\n                        libauthen-sasl-perl \\\n                        libauthen-ntlm-perl \\\n                        libapache2-mod-perl2 \\\n                        libnet-dns-perl \\\n                        libnet-ldap-perl \\\n                        libtemplate-perl \\\n                        libtemplate-perl \\\n                        libtext-csv-xs-perl \\\n                        libxml-libxml-perl \\\n                        libxml-libxslt-perl \\\n                        libxml-parser-perl \\\n                        libyaml-libyaml-perl\n\n\nRUN \/opt\/src\/otrs\/bin\/otrs.SetPermissions.pl --web-group=www-data\n\nRUN ln -s \/opt\/src\/otrs\/scripts\/apache2-httpd.include.conf \/etc\/apache2\/sites-available\/otrs.conf &amp;&amp; \\\n    a2ensite otrs &amp;&amp; \\\n    a2dismod mpm_event &amp;&amp; \\\n    a2enmod mpm_prefork &amp;&amp; \\\n    a2enmod headers\n\n# Supervisor\nRUN mkdir -p \/var\/log\/supervisor\nCOPY supervisord.conf \/etc\/supervisor\/conf.d\/supervisord.conf\n\n# Setup a cron for checking when OTRS is already installed, then start otrs Cron\nCOPY daemonstarter.sh \/opt\/src\/\nRUN chmod +x \/opt\/src\/daemonstarter.sh\nRUN echo \"* * * * * \/opt\/src\/daemonstarter.sh\" | crontab -\n\nCOPY otrs.sh \/opt\/src\/\nRUN chmod 755 \/opt\/src\/otrs.sh\n\nRUN mkdir \/opt\/ligero_addons\/ &amp;&amp; chown otrs:www-data \/opt\/ligero_addons\n\nADD https:\/\/addons.ligerosmart.com\/AddOns\/6.0\/Community\/LigeroRepository\/LigeroRepository-${LIGERO_REPOSITORY}.opm \/opt\/ligero_addons\/\n\nRUN chown otrs:www-data \/opt\/ligero_addons -R\n\nEXPOSE 80\n\nCMD [\"\/opt\/src\/otrs.sh\"]\n<\/code><\/pre>\n\n\n\n<p>Per tant, quan comencem a confeccionar una nova imatge docker podem partir d\u2019una imatge anterior (sent\u00e8ncia <strong>FROM<\/strong>). Com vegem, la imatge docker.otrs parteix d\u2019una imatge d\u2019Ubuntu versi\u00f3 16.04. A continuaci\u00f3, podem especificar el mantenidor d\u2019eixa imatge amb \u00ab<strong>MAINTAINER<\/strong>\u00bb. Tamb\u00e9 podem configurar variables d\u2019entorn amb \u00ab<strong>ENV<\/strong>\u00bb. Per a executar programes o aplicacions, emprarem \u00ab<strong>RUN<\/strong>\u00bb. Amb una sent\u00e8ncia \u00abRUN\u00bb podem instal\u00b7lar paquets (apt), cambiar permisos (chown), crear directoris (mkdir)&#8230; Tamb\u00e9 disposem d\u2019una sentencia \u00ab<strong>COPY<\/strong>\u00bb que copia fitxers\/directoris locals dins de les imatges. La sent\u00e8ncia \u00ab<strong>ADD<\/strong>\u00bb, passant-li com a primer par\u00e0metre una URL, descarregar\u00e0 el contingut en el fitxer\/directori dest\u00ed. Amb la sent\u00e8ncia \u00ab<strong>EXPOSE<\/strong>\u00bb obrim el port o ports que empra la nostra aplicaci\u00f3. Finalment, amb la sent\u00e8ncia \u00ab<strong>CMD<\/strong>\u00bb indiquem quin o quins comandaments ha d\u2019executar una vegada ha arrancat el nostre contenidor.<\/p>\n\n\n\n<p>Per a m\u00e9s informaci\u00f3, podem consultar <a href=\"https:\/\/docs.docker.com\/engine\/reference\/builder\/\">https:\/\/docs.docker.com\/engine\/reference\/builder\/<\/a><\/p>\n\n\n\n<p>Per a crear la nostra imatge tan sols hem d\u2019executar \u00ab<strong>docker build .<\/strong>\u00bb.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusions<\/h2>\n\n\n\n<p>En esta sessi\u00f3 hem explicat els conceptes relatius als contenidors, com s\u00f3n les imatges i els contenidors. Hem vist que una imatge \u00e9s un concepte de programari est\u00e0tic, \u00e9s a dir, que especifica de qu\u00e8 es conforma un contenidor. Per altra banda, un contenidor \u00e9s una imatge en funcionament, en execuci\u00f3. Quan treballem sobre els contenidors, normalment es guarda l\u2019estat d\u2019execuci\u00f3 anterior. Aix\u00ed podem consultar les dades en les quals treballa.<br>Els contenidors els podem emprar per a desplegar aplicacions complexes que requereixen de diverses depend\u00e8ncies especifiques per al correcte funcionament d\u2019una aplicaci\u00f3 en concret. D\u2019esta forma fem les nostres aplicacions portables i f\u00e0cilment distribuibles. A m\u00e9s, no s\u2019hem de preocupar de configurar el context en el qual s\u2019executa la nostra aplicaci\u00f3 (falta de llibreries, programari obsolet, interacci\u00f3 entre aplicacions\u2026).<\/p>\n\n\n\n<p>Per a manejar els contenidors comptem amb la ferramenta \u00abdocker\u00bb. Amb ella podem gestionar les imatges, els contenidors\u2026 Tamb\u00e9 comptem amb una ferramenta que ens permet gestionar un projecte d\u2019una forma m\u00e9s f\u00e0cil i intuitiva, \u00abdocker-compose\u00bb.<\/p>\n\n\n\n<p>Finalment, hem vist com crear una imatge basant-se amb un altra i configurar-la al nostre gust.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Podeu consultar esta pon\u00e8ncia i totes les pon\u00e8ncies a http:\/\/ujilliurex.uji.es\/videos.php Abans d\u2019explicar qu\u00e8 \u00e9s docker, farem una comparativa amb la realitat. Nosaltres, com a persones, som dependents d\u2019objectes que necessitem per a fer certes faenes. Per exemple, necessitem culleres per al caldo, forquetes per a l\u2019ensalada&#8230; Imaginem que se\u2019n anem a passar un mes fora &#8230; <a title=\"Pon\u00e8ncia Ujilliurex 2020: Be docker, my friend\" class=\"read-more\" href=\"https:\/\/edutictac.es\/blog\/chverma\/2020\/04\/30\/ponencia-ujilliurex-2020-be-docker-my-friend\/\" aria-label=\"M\u00e9s informaci\u00f3 sobre Pon\u00e8ncia Ujilliurex 2020: Be docker, my friend\">Llegiu m\u00e9s<\/a><\/p>\n","protected":false},"author":5,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"activitypub_content_warning":"","activitypub_content_visibility":"","activitypub_max_image_attachments":4,"activitypub_interaction_policy_quote":"anyone","activitypub_status":"","footnotes":""},"categories":[1],"tags":[],"class_list":["post-14","post","type-post","status-publish","format-standard","hentry","category-general"],"_links":{"self":[{"href":"https:\/\/edutictac.es\/blog\/chverma\/wp-json\/wp\/v2\/posts\/14","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/edutictac.es\/blog\/chverma\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/edutictac.es\/blog\/chverma\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/edutictac.es\/blog\/chverma\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/edutictac.es\/blog\/chverma\/wp-json\/wp\/v2\/comments?post=14"}],"version-history":[{"count":0,"href":"https:\/\/edutictac.es\/blog\/chverma\/wp-json\/wp\/v2\/posts\/14\/revisions"}],"wp:attachment":[{"href":"https:\/\/edutictac.es\/blog\/chverma\/wp-json\/wp\/v2\/media?parent=14"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/edutictac.es\/blog\/chverma\/wp-json\/wp\/v2\/categories?post=14"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/edutictac.es\/blog\/chverma\/wp-json\/wp\/v2\/tags?post=14"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}