{"id":240,"date":"2019-01-14T19:13:23","date_gmt":"2019-01-14T22:13:23","guid":{"rendered":"https:\/\/precisionit.com.ar\/blogs\/marianokovo\/?p=240"},"modified":"2019-01-14T19:13:25","modified_gmt":"2019-01-14T22:13:25","slug":"sql-server-containers","status":"publish","type":"post","link":"https:\/\/precisionit.com.ar\/blogs\/marianokovo\/sql-server-containers\/","title":{"rendered":"SQL Server &#038; Containers"},"content":{"rendered":"<p>Visitas: 919<\/p>\n<p class=\"has-medium-font-size\"><strong>Containers &#8211; Que y para qu\u00e9?<\/strong><\/p>\n\n\n\n<p>Un Contenedor es fundamentalmente una manera de\nempaquetar el software para que una aplicaci\u00f3n pueda ser ejecutada, incluyendo\nlos binarios y sus dependencias pero haciendo a esta independiente de la\narquitectura subyacente. <\/p>\n\n\n\n<p>Todo c\u00f3digo, bibliotecas y dependencias de la\naplicaci\u00f3n se agrupan en un paquete como como un artefacto inmutable.&nbsp; Es decir, que cuando una aplicaci\u00f3n es\nempaquetada en un Contenedor , sabremos exactamente c\u00f3mo se ejecutar\u00e1 de manera\npredecible, repetible e inmutable. No encontraremos ning\u00fan error inesperado al\nmoverlo a una nueva m\u00e1quina, o entre entornos. <\/p>\n\n\n\n<p>Un Contenedor puede ser pensado como ejecutar una\nm\u00e1quina virtual, pero sin todo el overhead de tener que levantar todo un\nsistema operativo. Por esta raz\u00f3n, empaquetar una aplicaci\u00f3n en un contenedor\nfrente a instanciar una m\u00e1quina virtual mejorar\u00e1 el tiempo total de encendido\nsignificativamente y reducir\u00e1 el footprint total de consumo de recursos.&nbsp; <\/p>\n\n\n\n<p>Las caracter\u00edsticas anteriores hacen a los Contenedores una gran herramienta y un bloque de construcci\u00f3n esencial en una arquitectura de la nube moderna o de microservicios.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"425\" src=\"https:\/\/precisionit.com.ar\/blogs\/marianokovo\/wp-content\/uploads\/2019\/01\/Arquitectura-1024x425.png\" alt=\"\" class=\"wp-image-241\" srcset=\"https:\/\/precisionit.com.ar\/blogs\/marianokovo\/wp-content\/uploads\/2019\/01\/Arquitectura-1024x425.png 1024w, https:\/\/precisionit.com.ar\/blogs\/marianokovo\/wp-content\/uploads\/2019\/01\/Arquitectura-300x125.png 300w, https:\/\/precisionit.com.ar\/blogs\/marianokovo\/wp-content\/uploads\/2019\/01\/Arquitectura-768x319.png 768w, https:\/\/precisionit.com.ar\/blogs\/marianokovo\/wp-content\/uploads\/2019\/01\/Arquitectura-1200x498.png 1200w, https:\/\/precisionit.com.ar\/blogs\/marianokovo\/wp-content\/uploads\/2019\/01\/Arquitectura.png 1202w\" sizes=\"(max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px\" \/><\/figure>\n\n\n\n<p>Los contenedores\noriginalmente construidos sobre instrucciones de Kernel Linux, se volvieron\ndisponibles sobre Windows a partir Windows Server 2016.<\/p>\n\n\n\n<p>Ref.: <a href=\"https:\/\/msdn.microsoft.com\/en-us\/magazine\/mt797649\">https:\/\/msdn.microsoft.com\/en-us\/magazine\/mt797649<\/a><\/p>\n\n\n\n<p><a href=\"https:\/\/docs.microsoft.com\/en-us\/virtualization\/windowscontainers\/about\/\">https:\/\/docs.microsoft.com\/en-us\/virtualization\/windowscontainers\/about\/<\/a><\/p>\n\n\n\n<p>El objetivo\nprincipal de usar contenedores fue y es actualmente poder ejecutar las\naplicaciones en un entorno de servidor de la misma manera que lo realiza en un\nentorno de desarrollo, evitando los cambios de arquitectura y dependencias.&nbsp; <\/p>\n\n\n\n<p>Ahora bien, a esta\nexcelente idea le faltaba un componente esencial para poder ser utilizada. De\nqu\u00e9 manera los usuarios pueden interactuar con esta tecnolog\u00eda? Esto incluye la\nadministraci\u00f3n, la orquestaci\u00f3n y la seguridad para los contenedores. La respuesta\nlleva a otro componente de software, como Docker (ampliamente utilizado),\nKubernetes, y otros m\u00e1s espec\u00edficos en Cloud como Azure Container Server\n(AKS).&nbsp; <\/p>\n\n\n\n<p><a href=\"https:\/\/kubernetes.io\/\">https:\/\/kubernetes.io\/<\/a><\/p>\n\n\n\n<p><a href=\"https:\/\/www.docker.com\/\">https:\/\/www.docker.com\/<\/a><\/p>\n\n\n\n<p><a href=\"https:\/\/docs.microsoft.com\/en-us\/azure\/aks\/\">https:\/\/docs.microsoft.com\/en-us\/azure\/aks\/<\/a><\/p>\n\n\n\n<p class=\"has-medium-font-size\"><strong>Construcci\u00f3n y Deploy de Containers con Docker<\/strong><\/p>\n\n\n\n<p>Docker es un software de c\u00f3digo abierto, que provee un\namplio set de herramientas para construir e implementar software en\ncontenedores. <\/p>\n\n\n\n<p>Para descargar la versi\u00f3n Destkop (para\nWindows o Mac) : <a href=\"https:\/\/www.docker.com\/get-started\">https:\/\/www.docker.com\/get-started<\/a><\/p>\n\n\n\n<p>Una\nvez instalado el software, como primer paso, se crea un archivo especial\nllamado &#8220;<em>Dockerfile&#8221;<\/em>. Los archivos &#8220;Dockerfile&#8221;\ndefinen un proceso de construcci\u00f3n, el cual una vez utilizado con el comando\n\u2018docker build\u2019 , se produce una &#8220;imagen <em>docker&#8221;\ninmutable<\/em>.\nEste proceso ser\u00eda como pensar en un &#8220;Snapshot&#8221; de la aplicaci\u00f3n, que\nse prepara para ser instanciada en cualquier momento.<\/p>\n\n\n\n<p>Para iniciar esta imagen, se ejecuta el comando\n\u2018docker run\u2019 en cualquier ambiente donde se encuentre corriendo el proceso de\ndocker. Este puede correr tanto en un desktop como en un servidor de producci\u00f3n\no en la Nube. Sin importar donde se ejecute la imagen, esta correr\u00e1 de la misma\nforma siempre.<\/p>\n\n\n\n<p>Adicionalmente Docker provee un\nrepositorio en la Nube, llamado <a href=\"https:\/\/hub.docker.com\/\">Docker Hub<\/a>. Podr\u00edamos pensar en esto como si fuera GitHub para im\u00e1genes\nDocker. De esta forma se puede utilizar Docker Hub para almacenar y distribuir\nlas im\u00e1genes de los contenedores que uno construya.<\/p>\n\n\n\n<p>Bien, hasta este\npunto hicimos una introducci\u00f3n a Containers y Docker, pero\u2026 Que somos? Somos\nBase de datos!<\/p>\n\n\n\n<p>Entonces, veamos un\nejemplo para descargar una imagen de SQL Server 2017 sobre Linux ya\ncontenerizada sobre Docker, desde el repositorio oficial de Micosoft.<\/p>\n\n\n\n<p class=\"has-medium-font-size\"><strong>Docker Pull &#8211; Descargando la imagen <\/strong><\/p>\n\n\n\n<p>Desde la linea de\ncomandos, realizaremos un Pull de la imagen de SQL Server 2017 para Linux la\ncual es completamente compatible para ser ejecutada en containers. Este proceso\nes realmente r\u00e1pido pensando en que estamos bajando una imagen funcional de SQL\nServer.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker pull mcr.microsoft.com\/mssql\/server:2017-latestdocker<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"732\" src=\"https:\/\/precisionit.com.ar\/blogs\/marianokovo\/wp-content\/uploads\/2019\/01\/pull-1024x732.png\" alt=\"\" class=\"wp-image-242\" srcset=\"https:\/\/precisionit.com.ar\/blogs\/marianokovo\/wp-content\/uploads\/2019\/01\/pull-1024x732.png 1024w, https:\/\/precisionit.com.ar\/blogs\/marianokovo\/wp-content\/uploads\/2019\/01\/pull-300x215.png 300w, https:\/\/precisionit.com.ar\/blogs\/marianokovo\/wp-content\/uploads\/2019\/01\/pull-768x549.png 768w, https:\/\/precisionit.com.ar\/blogs\/marianokovo\/wp-content\/uploads\/2019\/01\/pull.png 1103w\" sizes=\"(max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px\" \/><\/figure>\n\n\n\n<p class=\"has-medium-font-size\"><strong>Docker Run &#8211; Instanciando la imagen <\/strong><\/p>\n\n\n\n<p>Una vez finalizado\nel proceso de Pull, solo resta instanciar la imagen. En el caso de SQL Server\nse deben configurar los par\u00e1metros de Aceptaci\u00f3n de Contrato de Usuario Final,\nestablecer la Contrase\u00f1a del SysAdmin, el puerto TCP para conectarnos y el nombre\nde la instancia docker.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\ndocker run -e \"ACCEPT_EULA=Y\" -e \"SA_PASSWORD=Strong!Passw0rd@\" `\n   -p 1433:1433 --name sql1 `\n   -d microsoft\/mssql-server-linux:2017-latest<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"472\" src=\"https:\/\/precisionit.com.ar\/blogs\/marianokovo\/wp-content\/uploads\/2019\/01\/run-1024x472.png\" alt=\"\" class=\"wp-image-243\" srcset=\"https:\/\/precisionit.com.ar\/blogs\/marianokovo\/wp-content\/uploads\/2019\/01\/run-1024x472.png 1024w, https:\/\/precisionit.com.ar\/blogs\/marianokovo\/wp-content\/uploads\/2019\/01\/run-300x138.png 300w, https:\/\/precisionit.com.ar\/blogs\/marianokovo\/wp-content\/uploads\/2019\/01\/run-768x354.png 768w, https:\/\/precisionit.com.ar\/blogs\/marianokovo\/wp-content\/uploads\/2019\/01\/run.png 1103w\" sizes=\"(max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px\" \/><\/figure>\n\n\n\n<p>Inmediatamente\ntendremos nuestro contenedor ejecutando un SQL Server 2017 completo y listo\npara conectarnos y trabajar.<\/p>\n\n\n\n<p class=\"has-medium-font-size\"><strong>Conect\u00e1ndonos a la Instancia<\/strong><\/p>\n\n\n\n<p>Podemos conectarnos\ndirectamente desde la misma l\u00ednea de comandos, invocando un shell de Linux\nsobre nuestro container:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker exec -it sql1 \"bash\"<\/code><\/pre>\n\n\n\n<p>Y luego, una vez dentro de la instancia, podemos utilizar el viejo y querido SQLCMD<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/opt\/mssql-tools\/bin\/sqlcmd -S localhost -U SA -P 'Strong!Passw0rd@'<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"732\" src=\"https:\/\/precisionit.com.ar\/blogs\/marianokovo\/wp-content\/uploads\/2019\/01\/bash-1024x732.png\" alt=\"\" class=\"wp-image-244\" srcset=\"https:\/\/precisionit.com.ar\/blogs\/marianokovo\/wp-content\/uploads\/2019\/01\/bash-1024x732.png 1024w, https:\/\/precisionit.com.ar\/blogs\/marianokovo\/wp-content\/uploads\/2019\/01\/bash-300x215.png 300w, https:\/\/precisionit.com.ar\/blogs\/marianokovo\/wp-content\/uploads\/2019\/01\/bash-768x549.png 768w, https:\/\/precisionit.com.ar\/blogs\/marianokovo\/wp-content\/uploads\/2019\/01\/bash.png 1103w\" sizes=\"(max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px\" \/><\/figure>\n\n\n\n<p>Todo esto en cuesti\u00f3n de escasos minutos y pudiendo realizar todos los pasos en una forma completamente program\u00e1tica. En definitiva un proceso completamente definible como DEVOps.<\/p>\n\n\n\n<p>En pr\u00f3ximos posts, veremos c\u00f3mo avanzar en la configuraci\u00f3n y la orquestaci\u00f3n de estas nuevas tecnolog\u00edas.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Visitas: 919 Containers &#8211; Que y para qu\u00e9? Un Contenedor es fundamentalmente una manera de empaquetar el software para que una aplicaci\u00f3n pueda ser ejecutada, incluyendo los binarios y sus dependencias pero haciendo a esta independiente de la arquitectura subyacente. Todo c\u00f3digo, bibliotecas y dependencias de la aplicaci\u00f3n se agrupan en un paquete como como &hellip; <a href=\"https:\/\/precisionit.com.ar\/blogs\/marianokovo\/sql-server-containers\/\" class=\"more-link\">Continuar leyendo<span class=\"screen-reader-text\"> &#8220;SQL Server &#038; Containers&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[26,57,23],"tags":[],"_links":{"self":[{"href":"https:\/\/precisionit.com.ar\/blogs\/marianokovo\/wp-json\/wp\/v2\/posts\/240"}],"collection":[{"href":"https:\/\/precisionit.com.ar\/blogs\/marianokovo\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/precisionit.com.ar\/blogs\/marianokovo\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/precisionit.com.ar\/blogs\/marianokovo\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/precisionit.com.ar\/blogs\/marianokovo\/wp-json\/wp\/v2\/comments?post=240"}],"version-history":[{"count":1,"href":"https:\/\/precisionit.com.ar\/blogs\/marianokovo\/wp-json\/wp\/v2\/posts\/240\/revisions"}],"predecessor-version":[{"id":245,"href":"https:\/\/precisionit.com.ar\/blogs\/marianokovo\/wp-json\/wp\/v2\/posts\/240\/revisions\/245"}],"wp:attachment":[{"href":"https:\/\/precisionit.com.ar\/blogs\/marianokovo\/wp-json\/wp\/v2\/media?parent=240"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/precisionit.com.ar\/blogs\/marianokovo\/wp-json\/wp\/v2\/categories?post=240"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/precisionit.com.ar\/blogs\/marianokovo\/wp-json\/wp\/v2\/tags?post=240"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}