One place for hosting & domains

      implementar

      Cómo implementar el desplazamiento suave en React


      Introducción

      El desplazamiento suave es cuando, en vez de hacer clic en un botón y ser dirigido de forma instantánea a una parte diferente de la misma página, el usuario navega allí mediante una animación de desplazamiento. Es una de esas sutiles funciones de la IU en un sitio web que marcan una diferencia estética.

      En este artículo, va a usar el paquete react-scroll en npm para implementar el desplazamiento suave.

      Requisitos previos

      Necesitará lo siguiente para completar este tutorial:

      Este tutorial se verificó con Node v13.14.0, npm v6.14.5, react v16.13.1 y react-scroll v.1.7.16.

      Creará una aplicación sencilla en este tutorial, pero si desea un resumen rápido de cómo funciona react-scroll, consulte estos pasos resumidos:

      Instale react-scroll:

      npm i -S react-scroll
      

      Importe el paquete react-scroll:

      import { Link, animateScroll as scroll } from "react-scroll";
      

      Añada el componente de enlace. El componente <Link /> apuntará a un área concreta de su aplicación:

      <Link to="section1">
      

      Vamos a profundizar un poco más y crear una pequeña aplicación React con desplazamiento suave.

      Paso 1: Instalar y ejecutar una aplicación React

      Para mayor comodidad, este tutorial usará un proyecto React de inicio (usando Create React App 2.0) que tiene una barra de navegación (o navbar) en la parte superior junto con cinco secciones de contenido diferentes.

      Los enlaces en la navbar son solo etiquetas de anclaje en este momento, pero las actualizará en breve para permitir el desplazamiento suave.

      Puede encontrar el proyecto en React con desplazamiento suave. Observe que este enlace es para la rama start. La rama master incluye todos los cambios terminados.

      Captura de pantalla del repositorio GitHub

      Para clonar el proyecto, puede usar el siguiente comando:

      git clone https://github.com/do-community/React-With-Smooth-Scrolling.git
      

      Si observa el directorio src/Components, encontrará un archivo Navbar.js que contiene la <Navbar> con nav-items que corresponden a cinco <Section> diferente.

      src/Components/Navbar.js

      import React, { Component } from "react";
      import logo from "../logo.svg";
      
      export default class Navbar extends Component {
        render() {
          return (
            <nav className="nav" id="navbar">
              <div className="nav-content">
                <img
                  src={logo}
                  className="nav-logo"
                  alt="Logo."
                  onClick={this.scrollToTop}
                />
                <ul className="nav-items">
                  <li className="nav-item">Section 1</li>
                  <li className="nav-item">Section 2</li>
                  <li className="nav-item">Section 3</li>
                  <li className="nav-item">Section 4</li>
                  <li className="nav-item">Section 5</li>
                </ul>
              </div>
            </nav>
          );
        }
      }
      

      A continuación, si abre el archivo App.js en el directorio src, verá dónde se incluye la <Navbar> junto con las cinco <Section> reales.

      src/Components/App.js

      import React, { Component } from "react";
      import logo from "./logo.svg";
      import "./App.css";
      import Navbar from "./Components/Navbar";
      import Section from "./Components/Section";
      import dummyText from "./DummyText";
      class App extends Component {
        render() {
          return (
            <div className="App">
              <Navbar />
              <Section
                title="Section 1"
                subtitle={dummyText}
                dark={true}
                id="section1"
              />
              <Section
                title="Section 2"
                subtitle={dummyText}
                dark={false}
                id="section2"
              />
              <Section
                title="Section 3"
                subtitle={dummyText}
                dark={true}
                id="section3"
              />
              <Section
                title="Section 4"
                subtitle={dummyText}
                dark={false}
                id="section4"
              />
              <Section
                title="Section 5"
                subtitle={dummyText}
                dark={true}
                id="section5"
              />
            </div>
          );
        }
      }
      
      export default App;
      

      Cada componente <Section> asume un título y un subtítulo.

      Ya que este proyecto utiliza texto ficticio en las secciones diferentes, para reducir que se repita el código, este texto se añadió a un archivo DummyText.js, se importa y se pasa a cada componente <Section>.

      Para ejecutar la aplicación, puede usar los siguientes comandos.

      • cd React-With-Smooth-Scrolling
      • npm install
      • npm start

      Esto iniciará la aplicación en modo de desarrollo y actualizará la aplicación automáticamente cuando la guarda en sus archivos. Puede verla en el navegador en localhost:3000.

      Captura de pantalla de la aplicación en el navegador

      Paso 2: Instalar y configurar el desplazamiento en React

      Ahora, es momento de instalar el paquete react-scroll y añadir dicha funcionalidad. Puede encontrar información para el paquete en npm.

      Paquete react-scroll en npm

      Para instalar el paquete, ejecute el siguiente comando:

      A continuación, abra la copia de seguridad del archivo Navbar.js y añada una importación para dos importaciones nombradas, Link y animateScroll.

      src/Components/Navbar.js

      import { Link, animateScroll as scroll } from "react-scroll";
      

      Observe que hemos llamado a animatedScroll solo scroll para facilitar el uso.

      Con todas sus importaciones definidas, ahora puede actualizar sus nav-items para usar el componente <Link>. Este componente tiene varias propiedades. Puede leer sobre todas ellas en la página de documentación.

      Por ahora, preste especial atención a activeClass, to spy, smooth, offset y duration.

      • activeClass: La clase aplicada cuando se llega al elemento.
      • to: El objetivo hasta donde desplazarse.
      • spy: Para seleccionar Link cuando scroll está en su posición objetivo.
      • smooth: Para animar el desplazamiento.
      • offset: Para desplazar px adicional (como padding).
      • duration: El tiempo de la animación de desplazamiento. Esto puede ser un número o una función.

      La propiedad to es la parte más importante, ya que indica al componente hasta qué elemento desplazarse. En este caso, esto será cada una de sus <Section>.

      Con la propiedad offset, puede definir una cantidad adicional de desplazamiento que realizar para llegar a cada <Section>.

      Aquí tiene un ejemplo de las propiedades que usará para cada componente <Link>. La única diferencia entre ellos será la propiedad to ya que cada una apunta a una <Section> diferente:

      <Link
          activeClass="active"
          to="section1"
          spy={true}
          smooth={true}
          offset={-70}
          duration={500}
      >
      

      Deberá actualizar cada uno de los nav-items. Con estos añadidos, debería poder volver a su navegador (su aplicación debería haberse reiniciado automáticamente) y ver el desplazamiento suave en acción.

      Paso 3: Dar estilo a los enlaces activos

      La propiedad activeClass le permite definir una clase para aplicar al componente <Link> cuando su elemento to esté activo. Un <Link> se considera activo si su elemento to está a la vista cerca de la parte superior de la página. Esto puede activarse haciendo clic en el <Link> o desplazándose hasta la <Section> manualmente.

      Para demostrar esto, he abierto las DevTools de Chrome e inspeccionado el quinto <Link> como se muestra a continuación. Al hacer clic en ese <Link> o desplazarme manualmente hasta la parte inferior de la página, observé que la clase activa se ha aplicado de hecho.

      Vista del navegador de la aplicación React

      Para aprovechar esto, puede crear una clase activa y añadir un subrayado al enlace. Puede añadir este trozo de CSS en el archivo App.css en el directorio src:

      src/App.css

      .nav-item > .active {
          border-bottom: 1px solid #333;
      }
      

      Ahora, si vuelve a su navegador y se desplaza un poco, debería ver que el <Link> apropiado está subrayado.

      Vista del navegador actualizada de la aplicación React

      Paso 4: Añadir funciones adicionales

      Para un poco más de contenido, por último, este paquete también proporciona algunas funciones que pueden invocarse directamente como scrollToTop, scrollToBottom, etc. Además de varios eventos que puede administrar.

      En referencia a estas funciones, normalmente, el logotipo de la aplicación en una navbar llevará al usuario a la página de inicio o a la parte superior de la página actual.

      Como ejemplo sencillo de cómo invocar una de estas funciones proporcionadas, añadí un controlador de clic al nav-logo para desplazar al usuario de vuelta a la parte superior de la página, de esta forma:

      src/Components/Navbar.js

      scrollToTop = () => {
          scroll.scrollToTop();
      };
      

      De vuelva en el navegador, debería poder desplazarse hacia abajo en la página, hacer clic en el logotipo en la navbar y volver a la parte superior de la página.

      Conclusión

      El desplazamiento suave es una de esas funciones que pueden añadir mucho valor estético a su aplicación. El paquete react-scroll le permite aprovechar esta función sin un esfuerzo significativo.

      En este tutorial, ha añadido el desplazamiento suave a una aplicación y ha experimentado con los diferentes ajustes. Si siente curiosidad, pase algún tiempo explorando las otras funciones y eventos que este paquete ofrece.



      Source link

      Como implementar uma rolagem suave no React


      Introdução

      A rolagem suave é quando em vez de clicar em um botão e ser imediatamente levado a uma parte diferente da mesma página, o usuário é enviado para lá através de uma animação de rolagem. É um daqueles recursos sutis de IU em um site que fazem uma grande diferença estética.

      Neste artigo, você irá usar o pacote react-scroll no npm para implementar uma rolagem suave.

      Pré-requisitos

      Você precisará do seguinte para completar este tutorial:

      Este tutorial foi verificado com o Node v13.14.0, npm v6.14.5, react v16.13.1 e o react-scroll v.1.7.16.

      Você irá construir um aplicativo simples neste tutorial, mas caso deseje um resumo rápido de como o react-scroll funciona, sinta-se a vontade para consultar estes passos condensados:

      Instale o react-scroll:

      npm i -S react-scroll
      

      Importe o pacote react-scroll:

      import { Link, animateScroll as scroll } from "react-scroll";
      

      Adicione o componente de ligação. O componente <Link /> irá apontar para uma determinada área do seu aplicativo:

      <Link to="section1">
      

      Vamos nos aprofundar mais e construir um pequeno aplicativo React com rolagem suave.

      Passo 1 — Instalar e executar um aplicativo React

      Por questões de conveniência, este tutorial ira usar um projeto iniciador do React (usando o Create React App 2.0) que possui uma barra de navegação (ou navbar) no topo, juntamente com cinco seções distintas de conteúdo.

      Os links na barra de navegação são apenas marcadores de ancoragem neste ponto, mas logo serão atualizados para habilitar a rolagem suave.

      O projeto pode ser encontrado em React With Smooth Scrolling. Observe que esse link é para a ramificação de início. A ramificação mestre inclui todas as alterações finalizadas.

      Captura de tela do repositório GitHub

      Para clonar o projeto, use o comando a seguir:

      git clone https://github.com/do-community/React-With-Smooth-Scrolling.git
      

      Se você olhar no diretório src/Components, irá encontrar um arquivo Navbar.js que contém o <Navbar> com nav-items correspondentes a cinco diferentes <Section>s.

      src/Components/Navbar.js

      import React, { Component } from "react";
      import logo from "../logo.svg";
      
      export default class Navbar extends Component {
        render() {
          return (
            <nav className="nav" id="navbar">
              <div className="nav-content">
                <img
                  src={logo}
                  className="nav-logo"
                  alt="Logo."
                  onClick={this.scrollToTop}
                />
                <ul className="nav-items">
                  <li className="nav-item">Section 1</li>
                  <li className="nav-item">Section 2</li>
                  <li className="nav-item">Section 3</li>
                  <li className="nav-item">Section 4</li>
                  <li className="nav-item">Section 5</li>
                </ul>
              </div>
            </nav>
          );
        }
      }
      

      Em seguida, se abrir o arquivo App.js no diretório src, verá onde o <Navbar> está incluído juntamente com as cinco <Section>s.

      src/Components/App.js

      import React, { Component } from "react";
      import logo from "./logo.svg";
      import "./App.css";
      import Navbar from "./Components/Navbar";
      import Section from "./Components/Section";
      import dummyText from "./DummyText";
      class App extends Component {
        render() {
          return (
            <div className="App">
              <Navbar />
              <Section
                title="Section 1"
                subtitle={dummyText}
                dark={true}
                id="section1"
              />
              <Section
                title="Section 2"
                subtitle={dummyText}
                dark={false}
                id="section2"
              />
              <Section
                title="Section 3"
                subtitle={dummyText}
                dark={true}
                id="section3"
              />
              <Section
                title="Section 4"
                subtitle={dummyText}
                dark={false}
                id="section4"
              />
              <Section
                title="Section 5"
                subtitle={dummyText}
                dark={true}
                id="section5"
              />
            </div>
          );
        }
      }
      
      export default App;
      

      Cada componente <Section> assume um title (título) e subtitle (subtítulo).

      Como o projeto está usando textos fictícios nas diferentes seções, de forma a reduzir o código repetido, esse texto foi adicionado em um arquivo DummyText.js, importado e passado para cada componente <Section>.

      Para executar o aplicativo, utilize os comandos a seguir.

      • cd React-With-Smooth-Scrolling
      • npm install
      • npm start

      Isso irá iniciar o aplicativo no modo de desenvolvimento e atualizar automaticamente o aplicativo quando for salvar seus arquivos. É possível visualizá-lo no navegador em localhost:3000.

      Captura de tela do aplicativo no navegador

      Agora, é hora de instalar o pacote react-scroll e adicionar essa funcionalidade. Encontre mais informações para o pacote no npm.

      Pacote react-scroll no npm

      Para instalar o pacote, execute o seguinte comando:

      Em seguida, abra o arquivo Navbar.js novamente e adicione um import para duas importações chamadas Link e animateScroll.

      src/Components/Navbar.js

      import { Link, animateScroll as scroll } from "react-scroll";
      

      Observe que o nome animatedScroll foi alterado para scroll para facilitar o uso.

      Com todas as importações definidas, atualize agora seus nav-items para usar o componente <Link>. Esse componente recebe várias propriedades. Leia mais sobre todas elas na página de documentação.

      Por enquanto, preste bastante atenção no activeClass, to, spy, smooth, offset e duration.

      • activeClass – a classe aplicada quando o elemento é atingido.
      • to – o alvo para onde a rolagem é feita.
      • spy – para tornar o Link selecionado quando o scroll estiver na posição do seu alvo.
      • smooth – para animar a rolagem.
      • offset – para rolar pixels adicionais (como um preenchimento).
      • duration – o tempo que leva a animação de rolagem. Isso pode ser um número ou uma função.

      A propriedade to é a mais importante, já que informa ao componente para qual elemento deve ser feita a rolagem. Neste caso, isso será cada uma das suas <Section>s.

      Com a propriedade offset, é possível definir uma quantidade adicional de rolagem a ser feita de forma a chegar em cada <Section>.

      Aqui está um exemplo das propriedades que você usará para cada componente <Link>. A única diferença entre eles será a propriedade to, já que cada uma delas aponta para uma <Section> distinta:

      <Link
          activeClass="active"
          to="section1"
          spy={true}
          smooth={true}
          offset={-70}
          duration={500}
      >
      

      Será necessário atualizar cada um dos nav-items adequadamente. Com tudo isso adicionado, você deve ser capaz de voltar ao seu navegador (seu aplicativo já deve ter sido reiniciado automaticamente) e ver a rolagem suave em ação.

      A propriedade activeClass permite definir uma classe a ser aplicada no componente <Link> quando o seu elemento to estiver ativo. Um <Link> é considerado ativo se seu elemento to estiver em exibição próximo ao topo da página. Isso pode ser acionado clicando no <Link> em si ou rolando a página até a <Section> manualmente.

      Para provar isso, o Chrome DevTools foi aberto e o quinto <Link> foi inspecionado, assim como mostrado abaixo. Ao clicar nesse <Link> ou manualmente rolar a página até o final, vê-se que a classe ativa foi, de fato, aplicada.

      Visualização do navegador do aplicativo React

      Para aproveitar isso, crie uma classe ativa e adicione um sublinhado ao link. Adicione este pequeno código CSS no arquivo App.css no diretório src:

      src/App.css

      .nav-item > .active {
          border-bottom: 1px solid #333;
      }
      

      Agora, caso volte para o seu navegador e role um pouco na página, perceberá que o <Link> apropriado está sublinhado.

      Visualização do navegador atualizada do aplicativo React

      Passo 4 — Adicionando funções adicionais

      Para finalizar com mais um pouco de conteúdo, este pacote também fornece algumas funções que podem ser chamadas diretamente, como scrollToTop, scrollToBottom, etc., bem como diversos eventos que você pode manipular.

      Em referência a essas funções, tipicamente, o logotipo do aplicativo em uma barra de navegação irá levar o usuário à página inicial ou ao topo da página atual.

      Como um exemplo simples de como chamar uma dessas funções mencionadas, um manipulador de cliques foi adicionado ao nav-logo para trazer o usuário de volta ao topo da página, desta forma:

      src/Components/Navbar.js

      scrollToTop = () => {
          scroll.scrollToTop();
      };
      

      De volta no navegador, você deve ser capaz de rolar a página para baixo, clicar no logotipo na barra de navegação e ser levado de volta para o topo da página.

      Conclusão

      A rolagem suave é um daqueles recursos que pode adicionar um grande valor estético para seu aplicativo. O pacote react-scroll permite que você implemente esse recurso sem uma sobrecarga significativa.

      Neste tutorial, você adicionou uma rolagem suave a um aplicativo e experimentou diferentes configurações. Se tiver curiosidade, explore as outras funções e eventos que este pacote tem a oferecer.



      Source link

      Cómo implementar Laravel 7 y MySQL en Kubernetes con Helm


      El autor seleccionó la organización Diversity in Tech Fund para que reciba una donación como parte del programa Write for DOnations.

      Introducción

      Laravel es actualmente uno de los frameworks de aplicaciones PHP de código abierto más populares. Generalmente, se implementa con una base de datos de MySQL, pero puede configurarse para utilizar una variedad de opciones de almacenamiento de datos backend. Laravel se enorgullece de aprovechar muchas de las características modernas y el vasto ecosistema de paquetes de PHP.

      Kubernetes es una plataforma de orquestación de contenedores que puede alojarse en los clústeres de Kubernetes de DigitalOcean para que se encargue de una gran parte del trabajo administrativo de configuración y ejecución de contenedores en producción. Helm es un administrador de paquetes de Kubernetes que facilita la configuración e instalación de servicios y pods en Kubernetes.

      En esta guía, creará una aplicación PHP de Laravel, compilará la aplicación en una imagen de Docker e implementará esa imagen en un clúster de Kubernetes de DigitalOcean utilizando el chart de Helm de LAMP. A continuación, configurará un controlador Ingress para agregar SSL y un nombre de dominio personalizado a la aplicación. Al finalizar, tendrá una aplicación de Laravel funcional conectada a una base de datos que se ejecuta en un clúster de Kubernetes.

      Requisitos previos

      Paso 1: Crear una nueva aplicación Laravel

      En este paso, utilizará Docker para crear una nueva aplicación Laravel 7, pero debería poder realizar el mismo procedimiento con una aplicación Laravel existente que utilice MySQL como copia de seguridad de la base de datos. La nueva aplicación que compile verificará que Laravel esté conectada a la base de datos y mostrará el nombre de la base de datos.

      Primero, vaya al directorio de inicio y, luego, utilice un contenedor de Docker composer para crear una nueva aplicación Laravel:

      • cd ~
      • docker run --rm -v $(pwd):/app composer create-project --prefer-dist laravel/laravel laravel-kubernetes

      Una vez que esté listo el contenedor y que se hayan instalado todos los paquetes de Composer, debería ver una nueva instalación de Laravel denominada laravel-kubernetes/ en el directorio actual. Diríjase a esa carpeta:

      A partir de aquí, ejecutará el resto de los comandos de este tutorial.

      El objetivo de esta aplicación es probar la conexión de la base de datos y mostrar su nombre en el navegador. Para probar la conexión de la base de datos, abra el archivo ./resources/views/welcome.blade.php en un editor de texto:

      • nano ./resources/views/welcome.blade.php

      Busque la sección <div class="links">...</div> y sustituya el contenido por lo siguiente:

      ./resources/views/welcome.blade.php

      ...
      <div class="links">
         <strong>Database Connected: </strong>
          @php
              try {
                  DB::connection()->getPDO();
                  echo DB::connection()->getDatabaseName();
                  } catch (Exception $e) {
                  echo 'None';
              }
          @endphp
      </div>
      ...
      

      Guarde y cierre el archivo.

      Ese es todo el proceso de personalización que deberá realizar en la aplicación predeterminada Laravel para este tutorial. Una vez que haya terminado, este breve fragmento de PHP probará la conexión de la base de datos y mostrará el nombre de dicha base de datos en la pantalla de presentación de Laravel en el navegador web.

      En el siguiente paso, utilizará Docker para compilar una imagen que contenga esta aplicación de Laravel y Docker Compose para probar que se ejecuta de manera local y que se conecta a una base de datos de MySQL.

      Paso 2: Disponer la aplicación de Laravel en un contenedor

      Ahora que creó una nueva aplicación de Laravel, deberá compilar el código en una imagen de Docker y, luego, evaluar la imagen con Docker Compose. Si bien el objetivo de este tutorial es implementar la aplicación en un clúster de Kubernetes, Docker Compose es una forma práctica de probar la imagen y la configuración de Docker de manera local antes de ejecutarla en la nube. Este proceso de retroalimentación rápido puede ser útil para realizar y probar modificaciones pequeñas.

      Primero, con nano o el editor de texto que prefiera, cree un archivo llamado Dockerfile en la raíz de la aplicación de Laravel:

      Añada el siguiente contenido: Docker utilizará este archivo para compilar el código en una imagen:

      ./Dockerfile

      FROM php:7.4-apache
      
      # Install packages
      RUN apt-get update && apt-get install -y 
          git 
          zip 
          curl 
          sudo 
          unzip 
          libicu-dev 
          libbz2-dev 
          libpng-dev 
          libjpeg-dev 
          libmcrypt-dev 
          libreadline-dev 
          libfreetype6-dev 
          g++
      
      # Apache configuration
      ENV APACHE_DOCUMENT_ROOT=/var/www/html/public
      RUN sed -ri -e 's!/var/www/html!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/sites-available/*.conf
      RUN sed -ri -e 's!/var/www/!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/apache2.conf /etc/apache2/conf-available/*.conf
      RUN a2enmod rewrite headers
      
      # Common PHP Extensions
      RUN docker-php-ext-install 
          bz2 
          intl 
          iconv 
          bcmath 
          opcache 
          calendar 
          pdo_mysql
      
      # Ensure PHP logs are captured by the container
      ENV LOG_CHANNEL=stderr
      
      # Set a volume mount point for your code
      VOLUME /var/www/html
      
      # Copy code and run composer
      COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
      COPY . /var/www/tmp
      RUN cd /var/www/tmp && composer install --no-dev
      
      # Ensure the entrypoint file can be run
      RUN chmod +x /var/www/tmp/docker-entrypoint.sh
      ENTRYPOINT ["/var/www/tmp/docker-entrypoint.sh"]
      
      # The default apache run command
      CMD ["apache2-foreground"]
      

      Guarde y cierre el archivo.

      Este archivo Dockerfile comienza con una imagen de Docker de Apache PHP 7.4 que se encuentra en Docker Hub y, luego, instala varios paquetes de Linux que generalmente los requieren las aplicaciones de Laravel. A continuación, crea archivos de configuración de Apache y habilita la reescritura de encabezados. El archivo Dockerfile instala varias extensiones comunes de PHP y agrega una variable de entorno para asegurarse de que los registros de Laravel se transmitan al contenedor a través de stderr. Esto le permitirá ver los registros de Laravel mediante el seguimiento de los registros de Docker Compose o Kubernetes.

      Por último, Dockerfile copia todo el código de la aplicación de Laravel a /var/www/tmp e instala las dependencias de Composer. Después, establece un ENTRYPOINT, pero deberá crear ese archivo, que es lo que haremos a continuación.

      En el directorio raíz de su proyecto, cree un nuevo archivo denominado docker-entrypoint.sh. Este archivo se ejecutará cuando el contenedor se ejecute de manera local o en el clúster de Kubernetes, y copiará el código de la aplicación de Laravel del directorio /var/www/tmp a /var/www/html, donde Apache podrá presentarlo.

      • nano ./docker-entrypoint.sh

      Ahora agregue la siguiente secuencia de comandos:

      ./docker-entrypoint.sh

      #!/bin/bash
      
      cp -R /var/www/tmp/. /var/www/html/
      chown -R www-data:www-data /var/www/html
      
      exec "$@"
      

      La última línea, exec "$@", le indica al shell que ejecute cualquier comando que transmitió como argumento de entrada. Esto es importante porque queremos que Docker siga ejecutando el comando Ejecutar de Apache (apache2-foregrund) después de esta secuencia de comandos. Guarde y cierre el archivo.

      A continuación, cree un archivo .dockerignore en el directorio raíz de la aplicación. Este archivo garantizará que cuando compile la imagen de Docker, no se contamine con archivos de entorno o paquetes que no deberían copiarse allí:

      ./.dockerignore

      .env
      /vendor
      

      Guarde y cierre el archivo.

      El archivo docker-compose.yml es el último que debe crear antes de poder ejecutar la aplicación de manera local con Docker Compose. Sin embargo, durante la configuración de este archivo YAML, deberá ingresar la APP_KEY que generó Laravel durante la instalación. Para encontrar esta clave, abra y busque en el archivo . /.env o ejecute los siguientes comandos cat y grep:

      Verá un resultado similar a este:

      Output

      APP_KEY=base64:0EHhVpgg ... UjGE=

      Copie la clave en el portapapeles. Asegúrese de incluir el prefijo base64:. Ahora cree el archivo docker-compose.yml en el directorio raíz de la aplicación:

      • nano ./docker-compose.yml

      Aquí incluiremos la imagen PHP de la aplicación de Laravel y también un contenedor de MySQL para ejecutar la base de datos. Añada el siguiente contenido:

      ./docker-compose.yml

      version: '3.5'
      services:
        php:
          image: your_docker_hub_username/laravel-kubernetes:latest
          restart: always
          ports:
            - 8000:80
          environment:
            - APP_KEY="your_laravel_app_key"
            - APP_ENV=local
            - APP_DEBUG=true
            - DB_PORT=3306
            - DB_HOST=mysql
            - DB_DATABASE
            - DB_USERNAME
            - DB_PASSWORD
        mysql:
          image: mysql:5.7
          restart: always
          environment:
            - MYSQL_ROOT_PASSWORD=${DB_ROOT_PASSWORD}
            - MYSQL_DATABASE=${DB_DATABASE}
            - MYSQL_USER=${DB_USERNAME}
            - MYSQL_PASSWORD=${DB_PASSWORD}
      

      Utilice la variable APP_KEY que copió en el portapapeles para la variable your_laravel_app_key, y el nombre de usuario de Docker Hub para la variable your_docker_hub_username. Guarde y cierre el archivo.

      Creará la primera imagen de manera local con docker.build. La segunda imagen es la imagen de Docker de MySQL oficial que está disponible en Docker Hub. Ambas requieren diversas variables de entorno, las cuales incluirá cuando ejecute los contenedores.

      Para compilar la imagen de Docker que contiene la aplicación de Laravel, ejecute el siguiente comando. Asegúrese de sustituir your_docker_hub_username por su nombre de usuario o el nombre de usuario de su equipo en Docker Hub, donde se almacenará esta imagen:

      • docker build -t your_docker_hub_username/laravel-kubernetes:latest .

      A continuación, puede ejecutar los dos contenedores utilizando Docker Compose con las credenciales necesarias de la base de datos:

      • DB_ROOT_PASSWORD=rootpassword DB_DATABASE=local_db DB_USERNAME=admin DB_PASSWORD=password docker-compose up -d

      Si quiere, puede modificar las cuatro variables de entorno que se utilizan aquí (DB_ROOT_PASSWORD, DB_DATABASE, DB_USERNAME y DB_PASSWORD) pero, dado que solo está probando la aplicación de manera local, aún no es necesario protegerlas.

      El proceso de iniciar la base de datos de MySQL y preparar los contenedores puede tardar hasta 30 segundos. Una vez que lo estén, puede ver la aplicación de Laravel en su equipo en localhost:8000.

      La aplicación Laravel que ejecutándose de manera local con Docker Compose

      Su aplicación PHP se conectará a la base de datos de MySQL. Tras una conexión exitosa, el texto “Database Connected: localdb”(Base de datos conectada: localdb) aparecerá debajo del logotipo de Laravel.

      Ahora que probó la imagen de Docker de manera local con Docker Compose, puede ejecutar docker-compose down para desactivar los contenedores:

      En la siguiente sección, transferirá la imagen de Docker a Docker Hub para que su chart de Helm pueda utilizarla para implementar la aplicación en el clúster de Kubernetes.

      Paso 3: Introducir la imagen de Docker en Docker Hub

      El chart de Helm de LAMP que utilizará para implementar el código en Kubernetes requiere que el código esté disponible en un registro de contenedores. Si bien puede transferir la imagen a un registro privado o con alojamiento propio, a los efectos de este tutorial, utilizará un registro de Docker público y gratuito en Docker Hub.

      En el navegador web, acceda a su cuenta en Docker Hub y, luego, cree un nuevo repositorio llamado laravel-kubernetes.

      Crear un nuevo repositorio en Docker Hub

      A continuación, si no se conectó a Docker Hub desde el equipo local, deberá iniciar sesión en Docker Hub. Puede hacerlo con la siguiente línea de comandos:

      • docker login -u your_docker_hub_username

      Cuando se le solicite, ingrese las credenciales de inicio de sesión. Generalmente, solo debe realizar esta acción una vez en cada equipo, ya que Docker guardará las credenciales en ~/.docker/config.json en el directorio de inicio.

      Por último, transfiera la imagen a Docker Hub:

      • docker push your_docker_hub_username/laravel-kubernetes:latest

      Dependiendo de la velocidad de conexión, puede tomar algunos minutos cargar la aplicación, pero una vez que Docker termine, verá un último resumen de la función hash y el tamaño de la imagen en el terminal. El aspecto será similar a este:

      Output

      latest: digest: sha256:df4bdeda91484c8c26a989b13b8f27ab14d93ab2e676e3c396714cb3811c4086 size: 4918

      Ahora que la aplicación de Laravel está en un contenedor y que introdujo una imagen en Docker Hub, puede utilizar la imagen en la implementación de un chart de Helm o de Kubernetes. En el siguiente paso, configurará valores personalizados en base al chart de Helm de LAMP y lo implementará en el clúster de Kubernetes de DigitalOcean.

      Paso 4: Configurar e implementar la aplicación con el chart de Helm de LAMP

      Helm proporciona varios Charts para ayudarlo a configurar aplicaciones de Kubernetes utilizando combinaciones de herramientas predeterminadas. Si bien podría escribir archivos de servicio de Kubernetes propios para lograr una implementación similar, en esta sección observará que al utilizar un Chart de Helm se requerirá un proceso de configuración mucho menor.

      Primero, necesitará un directorio para almacenar todos los archivos de configuración de Helm. En la raíz de su proyecto Laravel, cree un nuevo directorio llamado helm/:

      Dentro del directorio helm/ crearemos dos nuevos archivos: values.yml y secrets.yml. Primero, cree y abra values.yml:

      El archivo values.yml incluirá opciones de configuración no secretas que anularán los valores predeterminados en el gráfico de Helm de LAMP. Agregue las siguientes opciones de configuración, asegurándose de sustituir your_docker_hub_username por su nombre de usuario:

      ./helm/values.yml

      php:
        repository: "your_docker_hub_username/laravel-kubernetes"
        tag: "latest"
        fpmEnabled: false
        envVars:
          - name: APP_ENV
            value: production
          - name: APP_DEBUG
            value: false
          - name: DB_PORT
            value: 3306
          - name: DB_HOST
            value: localhost
      

      Guarde y cierre el archivo.

      Ahora cree un archivo secrets.yml:

      secrets.yml no se verificará en el control de versiones. Contendrá información de configuración confidencial, como la contraseña de la base de datos y la clave de la aplicación de Laravel. Agregue la siguiente configuración, y adáptela según corresponda para que coincida con sus credenciales:

      ./helm/secrets.yml

      mysql:
        rootPassword: "your_database_root_password"
        user: your_database_user
        password: "your_database_password"
        database: your_database_name
      
      php:
        envVars:
          - name: APP_KEY
            value: "your_laravel_app_key"
          - name: DB_DATABASE
            value: your_database_name
          - name: DB_USERNAME
            value: your_database_user
          - name: DB_PASSWORD
            value: "your_database_password"
      

      Asegúrese de utilizar combinaciones de nombre de usuario y contraseña seguras para su base de datos de producción, y utilice la misma your_laravel_app_key que empleó anteriormente, o ejecute el siguiente comando para abrir una ventana de terminal nueva y generar una nueva clave. Luego, puede copiar el nuevo valor que establezca Laravel en el archivo .env:

      • docker run --rm -v $(pwd):/app php:cli php /app/artisan key:generate

      Guarde y cierre secrets.yml.

      A continuación, para evitar que el archivo secrets.yml se integre en la imagen de Docker o se guarde en el control de versiones, asegúrese de agregar la siguiente línea en los archivos .dockerignore y .gitignore. Abra cada archivo y anexe /helm/secrets.yml a cada uno, o bien ejecute el siguiente comando para agregarlo a ambos:

      • echo '/helm/secrets.yml' >> ./.dockerignore && echo '/helm/secrets.yml' >> ./.gitignore

      Ahora que ha creado los archivos de configuración de Helm para su aplicación y la imagen de Docker, puede instalar este chart de Helm como una nueva versión en el clúster de Kubernetes. Instale el chart desde el directorio raíz de la aplicación:

      • helm install laravel-kubernetes -f helm/values.yml -f helm/secrets.yml stable/lamp

      Verá un resultado similar a este:

      Output

      NAME: laravel-kubernetes LAST DEPLOYED: Mon May 18 13:21:20 2020 NAMESPACE: default STATUS: deployed REVISION: 1

      La aplicación estará disponible en uno o dos minutos, pero puede ejecutar este comando para controlar el servicio de Kubernetes en el clúster:

      Busque el nombre de su aplicación:

      Output

      NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) laravel-kubernetes-lamp LoadBalancer your_cluster_ip your_external_ip 80:32175/TCP,3306:32243/TCP

      Cuando el nuevo servicio laravel-kubernetes-lamp muestre una dirección IP en EXTERNAL-IP, puede visitar your_external_ip para ver la aplicación ejecutándose en el clúster de Kubernetes. La aplicación se conectará a la base de datos, y verá el nombre de dicha base de datos debajo del logotipo de Laravel, como sucedió cuando ejecutó la aplicación de manera local en Docker Compose.

      La aplicación de Laravel ejecutándose en Kubernetes con el chart de Helm de LAMP

      Es aceptable ejecutar una aplicación web en una dirección IP no segura cuando se trata de una prueba de concepto, pero sin un certificado SSL y un nombre de dominio personalizado, el sitio web no está listo para producción. Antes de configurar esto en el siguiente paso, desinstale la versión mediante la línea de comandos:

      • helm delete laravel-kubernetes

      En el siguiente paso, ampliará la primera configuración de Helm para agregar un controlador Ingress, un certificado SSL y un dominio personalizado a la aplicación de Laravel.

      Paso 5: Agregar un controlador Ingress y SSL al clúster de Kubernetes

      En Kubernetes, un controlador Ingress es el responsable de exteriorizar los servicios de su aplicación a Internet. En el paso anterior, el chart de Helm de LAMP creó un equilibrador de carga de DigitalOcean y expuso la aplicación de manera directa a través de la dirección IP del equilibrador de carga.

      Podría terminar SSL y el nombre de dominio directamente en el equilibrador de carga, pero, debido a que está trabajando en Kubernetes, podría resultar más práctico administrar todo en el mismo lugar. Para obtener más información sobre los controladores Ingress y detalles sobre los siguientes pasos, consulte Cómo configurar un Ingress de Nginx en Kubernetes de DigitalOcean utilizando Helm.

      El chart de Helm de LAMP incluye una opción de configuración para admitir Ingress. Abra el archivo helm/values.yml:

      Ahora agregue las siguientes líneas:

      ./helm/values.yml

      ...
      # Use Ingress Controller
      service:
        type: ClusterIP
        HTTPPort: 80
      ingress:
        enabled: true
        domain: your_domain
      

      Esto indica que durante la implementación no se instale un equilibrador de carga y que, en su lugar, se exponga la aplicación al puerto 80 del clúster de Kubernetes, donde el controlador Ingress lo exteriorizará a Internet. Guarde y cierre values.yml.

      Ahora ejecute el comando helm install que ejecutó anteriormente para que se volviera a ejecutar la aplicación de Laravel. Asegúrese de ejecutar el comando desde el directorio raíz de la aplicación:

      • helm install laravel-kubernetes -f helm/values.yml -f helm/secrets.yml stable/lamp

      A continuación, instale el controlador nginx-ingress en el clúster de Kubernetes utilizando el controlador Ingress de Nginx que mantiene Kubernetes:

      • helm install nginx-ingress stable/nginx-ingress --set controller.publishService.enabled=true

      Una vez completada la instalación, verá un resultado similar a este:

      Output

      NAME: nginx-ingress LAST DEPLOYED: Mon May 18 13:28:34 2020 NAMESPACE: default STATUS: deployed REVISION: 1

      También necesita un recurso de Ingress para exponer la implementación de la aplicación de Laravel. Cree un nuevo archivo denominado ingress.yml en el directorio raíz de la aplicación:

      Este archivo define el host de la aplicación, el administrador del certificado SSL, el servicio de backend y el nombre del puerto. Agregue las siguientes opciones de configuración, sustituyendo your_domain por el dominio de su elección:

      ./ingress.yml

      apiVersion: networking.k8s.io/v1beta1
      kind: Ingress
      metadata:
        name: laravel-kubernetes-ingress
        annotations:
          kubernetes.io/ingress.class: nginx
          cert-manager.io/cluster-issuer: letsencrypt-prod
      spec:
        tls:
          - hosts:
              - your_domain
            secretName: laravel-kubernetes-tls
        rules:
          - host: your_domain
            http:
              paths:
                - backend:
                    serviceName: laravel-kubernetes-lamp
                    servicePort: 80
      

      Guarde y cierre el archivo.

      A continuación, debería instalar Cert-Manager y crear un emisor que le permitirá crear certificados SSL de producción utilizando Let’s Encrypt. Cert-Manager requiere definiciones de recursos personalizados que puede aplicar desde el repositorio de Cert-Manager mediante la línea de comandos:

      • kubectl apply --validate=false -f https://github.com/jetstack/cert-manager/releases/download/v0.15.0/cert-manager.crds.yaml

      Esto creará varios recursos de Kubernetes que se mostrarán en la línea de comandos:

      Output

      customresourcedefinition.apiextensions.k8s.io/certificaterequests.cert-manager.io created customresourcedefinition.apiextensions.k8s.io/certificates.cert-manager.io created customresourcedefinition.apiextensions.k8s.io/challenges.acme.cert-manager.io created customresourcedefinition.apiextensions.k8s.io/clusterissuers.cert-manager.io created customresourcedefinition.apiextensions.k8s.io/issuers.cert-manager.io created customresourcedefinition.apiextensions.k8s.io/orders.acme.cert-manager.io create

      Cert-Manager también requiere un espacio de nombres para aislarlo en el clúster de Kubernetes:

      • kubectl create namespace cert-manager

      Obtendrá el siguiente resultado:

      Output

      namespace/cert-manager created

      Debido a que el Cert-Manager de Jetstack no es uno de los charts que mantiene Kubernetes, también deberá agregar el repositorio de Helm para Jetstack. Ejecute el siguiente comando para habilitarlo en Helm:

      • helm repo add jetstack https://charts.jetstack.io

      Si se agrega de manera correcta, se mostrará el siguiente resultado:

      Output

      "jetstack" has been added to your repositories

      Ahora está listo para instalar Cert-Manager en el espacio de nombres de cert-manager del clúster de Kubernetes:

      • helm install cert-manager --version v0.15.0 --namespace cert-manager jetstack/cert-manager

      Cuando finalice, verá un resumen del despliegue similar al siguiente:

      Output

      NAME: cert-manager LAST DEPLOYED: Mon May 18 13:32:08 2020 NAMESPACE: cert-manager STATUS: deployed REVISION: 1

      El archivo de configuración de Kubernetes production_issuer.yml es el último archivo que deberá agregar al directorio raíz de la aplicación de Laravel. Cree el archivo:

      • nano ./production_issuer.yml

      Ahora, agregue lo siguiente:

      apiVersion: cert-manager.io/v1alpha2
      kind: ClusterIssuer
      metadata:
        name: letsencrypt-prod
      spec:
        acme:
          # Email address used for ACME registration
          email: your_email_address
          server: https://acme-v02.api.letsencrypt.org/directory
          privateKeySecretRef:
            # Name of a secret used to store the ACME account private key
            name: letsencrypt-prod-private-key
          # Add a single challenge solver, HTTP01 using nginx
          solvers:
            - http01:
                ingress:
                  class: nginx
      

      Guarde y cierre el archivo.

      Let’s Encrypt enviará a your_email_address cualquier aviso importante y advertencia de vencimiento, así que asegúrese de agregar una dirección que revisará de manera regular. Guarde este archivo y cree un nuevo recurso en el clúster de Kubernetes para el recurso de Ingress y para el emisor de producción:

      • kubectl create -f ingress.yml
      • kubectl create -f production_issuer.yml

      Por último, actualice los registros DNS de su nombre de dominio para que dirija un registro A a la dirección IP del equilibrador de carga. Para encontrar la dirección IP del controlador Ingress escriba:

      • kubectl get service nginx-ingress-controller

      Output

      NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE nginx-ingress-controller LoadBalancer your_cluster_ip your_external_ip 80:30187/TCP,443:31468/TCP 6m10s

      Utilice la dirección your_external_ip como la dirección IP para su registro DNS tipo A. El proceso para actualizar los registros DNS varía en función de dónde gestiona los nombres de dominio y el hosting de DNS, pero si utiliza DigitalOcean, puede consultar nuestra guía sobre Cómo administrar registros DNS.

      Una vez que se actualice el registro DNS y se genere el certificado SSL, la aplicación estará disponible en your_domain y se habilitará SSL.

      La aplicación de Laravel con terminación de SSL y un nombre de dominio personalizado

      Si bien la aplicación de PHP y la base de datos ya están conectadas, aún deberá ejecutar migraciones de base de datos. En el último paso, aprenderá a ejecutar los comandos Artisan en el pod de Kubernetes para realizar migraciones de base de datos y otras tareas comunes de mantenimiento.

      Paso 6: Ejecutar comandos remotos

      Mientras se ejecuta la aplicación de Laravel y se mantiene conectada a la base de datos de MySQL en Kubernetes, existen varias operaciones comunes que debería ejecutar en una nueva instalación de Laravel. Una tarea común que debería realizar son las migraciones de base de datos.

      Antes de poder ejecutar un comando Artisan en la aplicación de Laravel, debe conocer el nombre del pod que está ejecutando el container de dicha aplicación. Puede ver todos los pods de su clúster de Kubernetes mediante la siguiente línea de comandos:

      Verá un resultado similar a este:

      Output

      NAME READY STATUS RESTARTS AGE laravel-kubernetes-lamp-77fb989b46-wczgb 2/2 Running 0 16m

      Seleccione el pod para la implementación de laravel-kubernetes-lamp-.... Asegúrese de utilizar el nombre del resultado y no el que aparece arriba. Ahora puede ejecutar kubectl exec en él. Por ejemplo, ejecute una migración de base de datos utilizando el comando artisan migrate. Agregará el indicador --force porque está ejecutando el pod en producción:

      • kubectl exec laravel-kubernetes-lamp-77fb989b46-wczgb -- php artisan migrate --force

      Este comando arrojará un resultado como el siguiente:

      Output

      Migration table created successfully. Migrating: 2014_10_12_000000_create_users_table Migrated: 2014_10_12_000000_create_users_table (0.16 seconds) Migrating: 2019_08_19_000000_create_failed_jobs_table Migrated: 2019_08_19_000000_create_failed_jobs_table (0.05 seconds)

      De esta manera, implementó de manera exitosa Laravel 7 y MySQL en Kubernetes y realizó una tarea de mantenimiento de la base de datos indispensable.

      Conclusión

      En este tutorial, aprendió a disponer una aplicación PHP de Laravel en un container, conectarla con una base de datos de MySQL, introducir una imagen de Docker que contiene su código en Docker Hub y, luego, utilizar un chart de Helm para implementar esa imagen en un clúster de Kubernetes de DigitalOcean. Por último, agregó SSL y un nombre de dominio personalizado, y aprendió a ejecutar herramientas de línea de comandos en los pods en ejecución.

      En comparación del hosting tradicional de la pila LAMP, Kubernetes y Helm ofrecen varias ventajas: escalabilidad, la capacidad de cambiar servicios sin tener que iniciar sesión en el servidor de manera directa, herramientas para realizar actualizaciones progresivas y control sobre el entorno de hosting. Dicho esto, la complejidad de utilizar contenedores y configurar la aplicación al principio eleva la barrera a la hora de comenzar a utilizarlos. Con esta guía como punto de partida, la implementación de Laravel en Kubernetes se vuelve factible. A partir de aquí, quizás quiera aprender más sobre la capacidad de Laravel o agregar herramientas de monitoreo a Kubernetes como Linkerd, que puede instalar de manera manual siguiendo nuestra guía o con un solo clic de DigitalOcean.



      Source link