Sesiones y contenedores remotos de PowerShell
Este año he estado intensificando mi trabajo con contenedores a través de la aplicación Docker Desktop. Cuando Windows Server 2016 estaba en versión preliminar, Microsoft probó algunos cmdlets de PowerShell para trabajar con contenedores, pero nunca llegaron a ninguna parte. Básicamente, la línea de comandos de Docker se ha convertido en la herramienta de gestión de facto. Hay algunos módulos en la Galería de PowerShell que he visto, pero creo que muchos de ellos son contenedores para los comandos de la ventana acoplable. Por ahora seguiré aprendiendo Docker. Con el tiempo, si paso a una herramienta PowerShell, tendré un conocimiento sólido de la tecnología subyacente. Uno de esos desafíos fue descubrir la comunicación remota de PowerShell con un contenedor de servidor de Windows.
Creando un contenedor
Ya saqué la imagen oficial de Microsoft/WindowsServer de la ventana acoplable de mi escritorio de Windows 10. Luego creé una nueva red para tener más control sobre el contenedor que pretendo crear.
docker network create --driver nat --internal --subnet 192.168.4.0/24 company
Luego creé un contenedor asignando una dirección IP y un nombre de host.
docker container create --name srv4 --interactive --dns 1.1.1.1 --network company --memory (2gb) --ip 192.168.4.20 --hostname SRV4 microsoft/windowsservercore
docker start srv4En este punto, el contenedor se está ejecutando. Puedo hacer ping muy bien.
Configurar el contenedor
A continuación, decidí actualizar la imagen. No tengo idea de qué es el administrador, pero usando Docker puedo ejecutar comandos para agregar una nueva cuenta de administrador local.
docker exec srv4 net user localadmin P@ssw0rd /add
docker exec srv4 net localgroup administrators localadmin /add
Es posible que también necesite ajustar la configuración de sus hosts confiables para permitir el acceso remoto al nombre del contenedor o la dirección IP. Es posible que también desee agregar una entrada en un archivo LMHOSTS para facilitar la resolución de nombres. Desde todas las apariencias, esto parece prometedor.
Conexión al contenedor
Como tengo una cuenta de administrador local, es sencillo configurar una sesión CIMS y usarla para consultar el contenedor.
$cs = new-cimsession -ComputerName 192.168.4.20 -Credential localadmin
La mayoría de los cmdlets que tienen un parámetro Cimsession deberían funcionar bien.
Excelente. Entonces una PSSession también debería funcionar.
Esto me desconcertó. Utilicé la misma credencial para Cimsession sin errores. Aquí es donde debes recordar que un contenedor no es una máquina virtual. No es un servidor completo con un sistema operativo completo. Al consultar la ayuda, descubrí que hay un parámetro para una identificación de contenedor. Los que habéis asistido a alguna de mis conferencias o clases sabéis que siempre hablo de la importancia de la ayuda a la lectura y la relectura. He aquí un gran ejemplo.
Conexión de una PSSession de contenedor
Esto parece bastante sencillo. He visto la identificación del contenedor con el comando docker ps.
Por ahora, simplemente copiaré, pegaré y probaré la nueva sintaxis.
Nuevamente, quedé desconcertado y tuve que recurrir a leer un poco más sobre los comandos de la ventana acoplable. Fue entonces cuando supe que el ID del contenedor es en realidad un valor mucho más largo. El comando docker ps me da una versión truncada. Necesitaba decirle a Docker que me diera el valor total.
Hay mucho texto y copiar y pegar obviamente no escalará. Afortunadamente, encontré un comando de la ventana acoplable para mostrar solo la identificación.
$id = docker container ls -q --no-trunc
En mi caso, esto funciona bien porque solo tengo 1 contenedor ejecutándose. Con el tiempo, tendré que encontrar una mejor manera de escalar. Pero por ahora, probemos esto.
No es una conexión rápida pero funciona. Como puede ver, estoy conectado mediante la cuenta de administrador del contenedor. Una vez que tenga el ID del contenedor, también puedo usarlo con Invoke-Command.
No estoy seguro de que haya mucho más valor aquí que usar el comando nativo de Docker Exec.
Usar Invoke-Command tomó 14 segundos y el comando Docker tomó 11. Aún así, es bueno saber cómo conectar y usar una PSSession a un contenedor Docker si lo necesito.
¿Has estado sumergiéndote en contenedores? ¿Estás intentando integrar tu trabajo de PowerShell? ¿Que has aprendido? ¿Cuáles son las trampas? Sé que me encantaría saber de ellos.