¿What is DevOps?

Laboratorio básico

Objetivo
  • Mostrar las partes fundamentales de la cultura DevOps.
  • Llevaremos a cabo un ejercicio básico para construir una imagen básica de Laravel con Docker.
  • Se mostrará y llevará a cabo el proceso de automatización del Build en un repositorio de Gitlab.
Requisitos

1.- Instalación de Docker en Ubuntu Server 20.04



sudo apt-get update

sudo apt-get install \
    ca-certificates \
    curl \
    gnupg \
    lsb-release

sudo mkdir -p /etc/apt/keyrings

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

sudo apt-get update

sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin

sudo usermod -aG docker $USER

exit


2.- Realizar una conexión por SSH a la máquina virtual o desde visual studio code.

Para visual studio code es necesario la extensión RemoteSSH.

captura ssh

Desde una terminal con el comando:

ssh usuario@host/ip (ejemplo: ssh user1@localhost, ssh user2@1.2.3.4)

3.- Clonar repositorio de laravel

git clone https://github.com/laravel/laravel.git

Modificar el nombre del archivo .env.example a .env

4.- Crear el archivo Dockerfile

captura dockerfile

Contenido del archivo:


#Imagen Base
FROM php:8.1.4-apache

# Habilitar mod_rewrite de apache
RUN a2enmod rewrite

#Actualizar e instalar dependencias y paquetes
RUN apt-get update && apt-get install -y \
        zlib1g-dev \
        libicu-dev \
        libxml2-dev \
        libpq-dev \
        libzip-dev \
        libpng-dev \
        cron \
        && docker-php-ext-install pdo pdo_mysql zip intl soap opcache gd \
        && docker-php-ext-configure pdo_mysql --with-pdo-mysql=mysqlnd

RUN apt-get update -y 

#Copiar el binaro de composer
COPY --from=composer /usr/bin/composer /usr/bin/composer
ENV COMPOSER_ALLOW_SUPERUSER 1

#Cambiar uid y gid de apache a el uid/gid del usuario de docker
RUN usermod -u 1000 www-data && groupmod -g 1000 www-data

#Cambie el web_root a /var/www/html/public 
RUN sed -i -e "s/html/html\/public/g" /etc/apache2/sites-enabled/000-default.conf

#Copia el contenido del repositorio a la ruta /var/www/html
COPY  . /var/www/html/
WORKDIR /var/www/html/

#Cambia el owner de la ruta e inicia la instalacion de paquetes con composer
RUN chown -R www-data:www-data /var/www/html  \
&& composer install --ignore-platform-req=ext-gd && composer dumpautoload


5.- Hacer el build de la imagen de forma manual.

Sintaxis:

docker build -t <image_name> .

-t es para poner un tag o nombre a la imagen, el punto (.) es para que identifique el Dockerfile en el mismo nivel del directorio donde esta ejecutando el comando

Ejemplo:

docker build -t laravel-image .

Ejecutar un contenedor

Sintaxis:

docker run -d –name <container_name> -p <porthost>:<portcontainer> <image_name> 

-d : Ejecutar contenedor en segundo plano.
–name: nombre del contenedor.
-p : mapeo de puertos.

Ejemplo:

docker run -d –name laravel-app -p 8080:80 laravel-image

En laravel es necesario generar el APP_KEY con el siguiente comando:

Sintaxis:

docker exec -it <container_name> <command_inside_container>

Ejemplo:

docker exec -it laravel-app php artisan key:generate

Abrir el navegador en esta url:
http://localhost:8080 ó http://ipservidor:8080 ó http://ipmaquinavirtual:8080

6.- Crear el repositorio en gitlab

repo git

7.- Subir a Gitlab el repositorio actual

Sintaxis:

git remote add <nombre> https://gitlab.com/<user>/<repo_name>.git

Ejemplo:


git remote add gitlab https://gitlab.com/vvalenzuela/laravel-test.git
git branch -M master
git push -uf gitlab master

8.- Crear archivo para la build de la imagen de docker.

Se crea el archivo .gitlab-ci.yml

git archive

Contenido del archivo:


build_to_prod:
  stage: build
  image: docker:latest
  services:
    - docker:dind
  script:
    - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY
    - docker build --pull -t "$CI_REGISTRY_IMAGE":"$CI_COMMIT_SHORT_SHA" -t "$CI_REGISTRY_IMAGE":latest .
    - docker push "$CI_REGISTRY_IMAGE":"$CI_COMMIT_SHORT_SHA"
    - docker push "$CI_REGISTRY_IMAGE":latest
  only:
    - master

deploy_to_prod:
  stage: deploy
  image: 
    name: bitnami/kubectl
    entrypoint: [""]
  script:
    - echo “Deployment Complete”
  only:
    - master

9.- Ejecutar contenedor con la nueva imagen del registry de gitlab

docker login registry.gitlab.com
  • username:
  • password:
docker run -d –name laravel-app2 -p 8888:80 registry.gitlab.com/vvalenzuela/laravel-test

Abrir el navegador en esta url:
http://localhost:8888 ó http://ipservidor:8888 ó http://ipmaquinavirtual:8888