Git-Logo-1788CDescubrí hace unos días y empecé a dar mis primeros pasos con Docker. En el post de hoy voy un paso más y describo cómo he creado mi primer contenedor real, un servidor GIT privado (con “gitolite”). Antes de empezar, Git es un software de control de versiones y Gitolite permite hospedar repositorios Git en tu propio servidor de forma sencilla y segura.

Instalación

Para poner en marcha un contenedor hay que partir de una “imagen” mínima con el Sistema Operativo, así que mi primera intención fue usar Gentoo, pero desistí porque fui incapaz de encontrar o crear yo mismo una imagen de menos de 750-900MB (lo ideal es quedarse por debajo de 100MB-200MB).

Conclusión, como “Host” uso GNU/Linux Gentoo y para los contenedores desde “Debian“.

Preparar el Host

Lo primero es tener instalado docker en el host, aquí tienes un artículo sobre mi instalación.

Disco de datos persistente en el Host

Te recomiendo que el directorio donde vas a dejar los repositorios de tu servidor GIT sea un directorio en el Host, externo al contenedor, de modo que sea persistente.

He elegido el directorio /Apps de mi servidor como la raiz donde voy a dejar tanto los scripts como el directorio persistente para los repositorios:

De esta forma tengo todo lo importante en un solo sitio “persistente”, aunque borre el contenedor o imagen de docker los repositorios se mantienen y podré reinstalar (docker/imagen/contenedor) para tener el servicio funcionando literalmente en 5 minutos…

undefined

Usuarios en el Host

Creo dos usuarios importantes:

  • luis – Mi usuario, un usuario normal para no tener que usar root
  • git – Aunque no hace falta creo en el Host el usuario/grupo “git:git” con el mismo UID/GID que tendrá en el contenedor para darle los permisos y propietario al directorio de los repositorios y así tener coherencia dentro y fuera:

Directorio /Apps

Asigno mi usuario como propietario de la raiz

Usuario y grupo git:git

Para tener coherencia con lo que verán los contenedores:

Scripts y Dockerfile

En los enlaces siguientes tienes todo lo necesario:

Solo tienes que bajarte este último:

 

Nuevo versus Migración

Antes de arrancarlo, tenemos dos opciones:
* Arrancar el servidor “vacío” sin repositorios y empezar desde cero
* Arrancar el servidor usando respositorios de una instalación previa (migración)

Instalación nueva

Dejo el directorio /Apps/data/git/repositories vacío y asigno a git:git como el propietario del mismo.

Arranco la Aplicación (contenedor):

A continuación clonamos gitolite-admin y empiezo a trabajar, añadir otros puestos de trabajo, sus claves, etc.

 

Migración

A la hora de migrar repositiorios desde otro servidor antiguo a mi nuevo Host (a su directorio persistente) el proceso también es muy sencillo: hago un backup del antiguo, lo recupero en el nuevo y al arrancar el contenedor se dará cuenta y respetará la estructura existente.

Backup de repositorio existente

Empezamos haciendo un backup del directorio de repositorios del servidor antiguo.

Recuperar repositorio en el nuevo Host

Arrancar el contenedor

Creo y arranco el contenedor, detectará que el directorio repositories tiene repos existentes y actuará en consecuencia:

Comprobar que los repositorios están disponibles

Desde un cliente remoto que teníamos autorizado en el repositorio original

 

Acceso y consumo de los repositorios

Ahora que tenemos todo funcionando ya puedo consumir mis repositorios desde el programa “git”. Mucho más sencillo y visual, recomiendo SourceTree, una maravilla para MacOSX.

Línea de comandos

Herramienta gráfica SourceTree
undefined

Arranque durante el boot del Host

Para arrancar el contenedor durante el boot del equipo (recordar que el Host está basado en Gentoo con openrc) es tan sencillo como crear un script en el directorio /etc/init.d

Por último programo el arranque automático en cada boot

Si usas systemd, te dejo un par de ejemplos de ficheros de servicios:

No te pierdas el siguiente post sobre cómo configurar múltiples servicios en varios contenedores docker.