daocloud

Docker es un proyecto de motor de contenedor de código abierto basado en tecnología de virtualización ligera desarrollada por Docker.Inc. Todo el proyecto se desarrolla en base al lenguaje Go y cumple con el protocolo Apache 2.0. A través de la estandarización de imágenes en capas y la tecnología de virtualización del kernel, Docker permite a los desarrolladores de aplicaciones y a los ingenieros de operación y mantenimiento publicar aplicaciones en todas las plataformas de manera unificada y proporciona un entorno de ejecución de aplicaciones aislado de recursos casi sin sobrecarga adicional. Debido a sus muchas características novedosas y la apertura del proyecto en sí, Docker rápidamente obtuvo la participación de muchos proveedores de TI en menos de dos años, incluidos líderes de la industria como Google, Microsoft y VMware. Al mismo tiempo, Docker también ha provocado olas en la comunidad de desarrolladores. Muchos programadores como yo han comenzado a prestar atención, aprender y utilizar Docker. Muchas empresas, especialmente las empresas de Internet, también están aumentando su inversión en Docker. Revolución de contenedores.

Resolución de nombres de imágenes de Docker

La imagen es una de las tecnologías centrales de Docker y también es el formato estándar para el lanzamiento de aplicaciones. Ya sea que use Docker para extraer imágenes o escriba DESDE la imagen en Dockerfile, descargar la imagen del Registro oficial de Docker debería ser una de las acciones más frecuentes en las operaciones de Docker. Entonces, ¿qué sucede exactamente detrás de escena cuando ejecutamos Docker Pull Image? Antes de responder a esta pregunta, primero debemos comprender cómo se nombran las imágenes de Docker. Este también es un concepto confuso en Docker: Registro, Repositorio, Etiqueta e Imagen.

El siguiente es el resultado de ejecutar imágenes de Docker en la máquina local:

Podemos encontrar que la imagen "ubuntu" que solemos decir no es en realidad un nombre de imagen, sino que representa una nombre del Repositorio de Ubuntu, al mismo tiempo, hay una serie de Imágenes etiquetadas en este Repositorio. La etiqueta de Imagen es un GUID. Por conveniencia, también se puede hacer referencia a ella a través del Repositorio: etiqueta.

Entonces, ¿qué es el Registro? El registro almacena datos de imágenes y proporciona las funciones de extraer y cargar imágenes. Las imágenes del Registro se organizan a través de Repositorios y cada Repositorio contiene varias Imágenes.

El Registro contiene uno o más Repositorios

El Repositorio contiene una o más Imágenes

Las imágenes están representadas por GUID y tienen una o más Etiquetas asociadas a ellas

Entonces, ¿dónde especificar el Registro? Extraigamos otra imagen con un nombre más completo:

Intenté extraer una imagen de Ubuntu arriba y especifiqué el Registro como un Registro privado creado para mi máquina local. El siguiente es el fragmento de código del comando de extracción en Docker CLI (función CmdPull en docker/api/client/command.go)

En tiempo de ejecución, la variable taglessRemote anterior se pasará a localhost:5000/ ubuntu. El código anterior intenta analizar la dirección del Registro a partir de la variable taglessRemote. En nuestro caso, es localhost:5000.

Entonces regresemos y echemos un vistazo a la historia detrás del siguiente comando de extracción familiar:

Seguimos el código de muestra anterior e ingresamos el fragmento de código de definición de la función de análisis ResolveRepositoryName. (docker /registry/registry.go)

Descubrimos que Docker CLI determinará si la primera parte del parámetro taglessRemote entrante contiene '.' o ':'. parte como la dirección del Registro. De lo contrario, se utilizará el Registro oficial predeterminado de Docker (es decir, index.docker.io es en realidad un servidor de índice, y la diferencia entre este y el Registro se analizará más adelante), que es el. parte resaltada del código anterior. La historia detrás de esto aún no ha terminado. Si has subido una imagen a DockerHub, debes recordar que el formato del nombre de la imagen que subiste es nombre de usuario/repositorio:etiqueta, para que el usuario Bob y la usuaria Alice puedan tener un repositorio con la. mismo nombre, utilizando el prefijo de nombre de usuario como aislamiento de espacio de nombres, como Bob/ubuntu y Alice/ubuntu. La imagen oficial se distingue por la biblioteca de nombres de usuario. El fragmento de código específico es el siguiente (función CmdPull en docker/api/client/command.go)

Regresemos y veamos el análisis de etiquetas en la barra lógica de la línea de comando de Docker (función CmdPull en docker/api/client/command.go):

El código intentará encontrar la etiqueta después de ' : ' en el nombre de la imagen ingresada por el usuario. no existe, se utilizará el 'DEFAULTTAG' predeterminado, que es 'más reciente'.

Es decir, en nuestro ejemplo, el comando se analizará de la siguiente manera (tenga en cuenta que el siguiente comando no se puede ejecutar directamente porque la CLI de Docker no permite especificar explícitamente la dirección de Registro oficial)

Configurar el Mirror del Registro

La razón por la que Docker es tan atractivo es que además de su novedosa tecnología, el ecosistema que rodea el Registro oficial (Docker Hub) también es bastante llamativo. En Docker Hub, puede descargar fácilmente una gran cantidad de imágenes de aplicaciones en contenedores para su uso inmediato. Docker mantiene oficialmente algunas de estas imágenes, y muchos desarrolladores cargan y comparten muchas más de forma espontánea. Y también puede vincular su sistema de alojamiento de código (actualmente admite Github y Bitbucket) en Docker Hub para configurar la función de generación automática de imágenes, de modo que Docker Hub genere automáticamente la imagen de Docker correspondiente cuando se actualice su código. ?

Desafortunadamente, Docker Hub no tiene un servidor en China ni utiliza una CDN nacional. Los codificadores como yo no pueden permitirse el lujo de descargar la imagen. El jefe está detrás. nosotros instándonos. Esperando que muevamos el código. Para superar los retrasos en la red transoceánica, generalmente existen dos soluciones: una es utilizar un registro privado y la otra es utilizar un espejo de registro. Hablaremos de ellas una por una a continuación.

La primera solución es crear o utilizar un Registro privado existente que sincroniza periódicamente imágenes populares con Docker Hub. El Registro privado guarda copias de algunas imágenes y luego puede extraerlas de este Registro privado a través de Docker Pull private-registry.com/user. -nombre/ubuntu:último. Debido a que esta solución requiere una sincronización regular de las imágenes de Docker Hub, es más adecuada para escenarios donde las imágenes utilizadas son relativamente estables o son imágenes privadas. Además, los usuarios deben asignar explícitamente el nombre de la imagen oficial al nombre de la imagen privada. El Registro privado se usa más comúnmente en escenarios empresariales internos.

La implementación del Registro privado también es muy conveniente. Puede descargar directamente la imagen del Registro en Docker Hub y usarla de inmediato. Para una implementación específica, consulte la documentación oficial.

La segunda opción es utilizar el Espejo del Registro. Su principio es similar al almacenamiento en caché. Si la imagen se encuentra en el Espejo, se devolverá directamente al cliente. donde la imagen se almacena y se almacena automáticamente en caché en el Mirror. Lo mejor es que el uso de Mirror es transparente para los usuarios de Docker. Es decir, después de configurar Mirror, aún puede ingresar a docker pull ubuntu para extraer la imagen de Docker Hub. Además de que la velocidad se vuelve más rápida, no hay nada como. antes la diferencia.

Para conectarme al ecosistema Docker Hub de una manera más conveniente, usar Registry Mirror se ha convertido naturalmente en mi primera opción. A continuación, echaré un vistazo al proceso en el que Docker usa Mirror para extraer la imagen. En el siguiente ejemplo, estoy usando el servicio Registry Mirror proporcionado por DaoCloud. Después de solicitar el servicio Mirror, obtendrá una dirección Mirror. Luego, todo lo que tenemos que hacer es configurar esta dirección en el script de inicio de Docker Server y reiniciar Docker. service La configuración de Mirror entrará en vigor (cómo obtener el servicio Mirror, consulte el apéndice de este artículo)

El comando para configurar Docker Registry Mirror en Ubuntu es el siguiente:

sudo echo “DOCKER_OPTS=\”\ $DOCKER_OPTS –registry-mirror=CmdPull function in mand.go)

Primero, Docker CLI intentará obtener autorización, en nuestro caso solicitará https: //index.docker.io/v1 Autenticación Una vez completada la autenticación, el servidor de autenticación devolverá el Token correspondiente. Tenga en cuenta que la autenticación del usuario aquí no tiene nada que ver con el Mirror del Registro configurado, por lo que no tenemos que preocuparnos por los problemas de seguridad del uso del Mirror. Luego, Docker CLI llamará al comando de creación de imágenes de Docker Server (es decir, el programa Docker Daemon) y Docker Server realizará la acción específica de extraer la imagen. El fragmento de código es el siguiente (función pullRepository de docker/graph/pull.go. )

Se puede encontrar en el código que si se configura un Mirror del Registro, Docker Server primero extraerá la imagen del Mirror. Si el Mirror no logra extraerla, en segundo lugar la extraerá del Registro especificado. en el espejo. Todos pueden volver a dar un suspiro de alivio. Incluso si el Registry Mirror configurado falla, no afectará la capacidad del usuario para tirar del espejo, pero la velocidad se reducirá. . .

Después de desplegar la imagen, puedes ejecutar el contenedor