GNU/Linux >> Tutoriales Linux >  >> Panels >> Docker

¿Qué es Docker? Aprenda a usar contenedores:explicado con ejemplos

Los contenedores son una herramienta esencial para el desarrollo de software en la actualidad. Ejecutar aplicaciones en cualquier entorno se vuelve fácil cuando aprovecha los contenedores.

La tecnología más popular para ejecutar contenedores es Docker, que se ejecuta en cualquier sistema operativo.

En esta publicación de blog, aprenderá a usar Docker para los 3 casos de uso más esenciales. Aprenderá a:

  • ejecutar una base de datos localmente usando Docker,
  • ejecutar pruebas automatizadas utilizando una base de datos dockerizada,
  • ejecuta tu aplicación localmente y en producción usando Docker.

Utilizará una aplicación Java Spring Boot, pero todos los aprendizajes se aplican a cualquier otro lenguaje de programación de su elección.

Para ejecutar todos los ejemplos, necesita:

  • Instalar Docker
  • Instalar Java

Ejecutar aplicaciones aisladas usando Docker

Docker elimina las tareas de configuración repetitivas y mundanas y se utiliza durante todo el ciclo de vida del desarrollo para un desarrollo de aplicaciones rápido, fácil y portátil:escritorio y en la nube. (Fuente:https://www.docker.com/use-cases/)

El núcleo de la superpotencia de Docker es aprovechar los llamados cgroups para crear entornos livianos, aislados, portátiles y de alto rendimiento, que puede iniciar en segundos.

Veamos cómo puede usar Docker para ser más productivo.

Contenedores de base de datos

Con Docker, puede iniciar muchos tipos de bases de datos en segundos. Es fácil y no contamina su sistema local con otros requisitos que necesita para ejecutar la base de datos. Todo viene empaquetado con el contenedor Docker.

Al buscar en hub.docker.com, puede encontrar contenedores listos para usar para muchas bases de datos.

Usando la docker run comando, puede iniciar un contenedor MySQL Docker.

docker run --rm -v "$PWD/data":/var/lib/mysql --name mysql -e MYSQL_ROOT_PASSWORD=admin-password -e MYSQL_DATABASE=my-database -p 3306:3306 mysql:8.0.28-debian

Este comando utiliza funciones avanzadas para ejecutar un contenedor Docker:

  • -v "$PWD/data" asigna su directorio local ./data al contenedor Docker, que le permite iniciar el contenedor Docker sin perder sus datos,
  • -p 3306:3306 asigna el puerto del contenedor 3306 a nuestra máquina para que otras aplicaciones puedan usarla,
  • -e MYSQL_DATABASE=my-database establece una variable de entorno para crear una nueva base de datos llamada my-database automáticamente,
  • -e MYSQL_ROOT_PASSWORD=admin-password establece una variable de entorno para establecer la contraseña de administrador,
  • --rm retira el contenedor cuando se detiene.

Estas variables de entorno y más están documentadas en la página de imágenes de Docker.

Cómo usar contenedores de bases de datos para el desarrollo

Utilizará una pila de tecnología popular para crear una aplicación web basada en Java y Spring Boot. Para centrarse en las partes de Docker, puede clonar una aplicación de demostración simple de la guía oficial Acceder a datos JPA con descanso.

# Download the sample application
git clone https://github.com/spring-guides/gs-accessing-data-rest.git

# Open the final application folder
cd complete

La aplicación viene con una base de datos en memoria, que no es valiosa para la producción porque no permite que múltiples servicios accedan y modifiquen una sola base de datos. Una base de datos MySQL es más adecuada para escalar su aplicación a muchas más lecturas y escrituras.

Por lo tanto, agregue el controlador MySQL a su pom.xml :

       <!-- Disable in memory database -->
       <!--
       <dependency>
           <groupId>com.h2database</groupId>
           <artifactId>h2</artifactId>
           <scope>runtime</scope>
       </dependency>
       -->
 
       <!-- MySQL driver -->
       <dependency>
           <groupId>mysql</groupId>
           <artifactId>mysql-connector-java</artifactId>
           <scope>runtime</scope>
       </dependency>

Ahora, debe agregar la configuración para conectarse a su base de datos agregando un archivo de configuración src/main/resources/application.properties .

# Database configuration
spring.datasource.url=jdbc:mysql://localhost:3306/my-database
spring.datasource.username=root
spring.datasource.password=admin-password
 
# Create table and database automatically
spring.jpa.hibernate.ddl-auto=update

Ahora puede iniciar la aplicación y llamar a los puntos finales existentes:

# Get all people
curl http://localhost:8080/people

# Add a person
curl -i -H "Content-Type:application/json" -d '{"firstName": "Frodo", "lastName": "Baggins"}' http://localhost:8080/people

# Get all people again, which now returns the created person
curl http://localhost:8080/people

Usó con éxito su aplicación rudimentaria, que escribe y lee datos en su base de datos. El uso de la base de datos MySQL Docker le brinda una base de datos sólida en segundos y puede usarla desde cualquier aplicación.

Cómo usar contenedores de bases de datos para pruebas de integración

La aplicación ya tiene pruebas que esperan una base de datos en ejecución. Pero, debido a que reemplazó su base de datos en memoria con una base de datos MySQL real, las pruebas no se ejecutarán correctamente si detiene su base de datos.

# Stop database
docker rm -f mysql

# Run tests
./mvnw clean test

... skipped output ...
[ERROR] Tests run: 7, Failures: 0, Errors: 7, Skipped: 0
... skipped output ...

Para iniciar y detener rápidamente los contenedores que ejecutan pruebas, existe una herramienta útil llamada testcontainers. Allí encontrará bibliotecas para muchos lenguajes de programación, incluido Java.

Primero, debe agregar algunas dependencias a su pom.xml :

       <!-- testcontainer -->
       <dependency>
           <groupId>org.testcontainers</groupId>
           <artifactId>testcontainers</artifactId>
           <version>1.16.3</version>
           <scope>test</scope>
       </dependency>
       <dependency>
           <groupId>org.testcontainers</groupId>
           <artifactId>mysql</artifactId>
           <version>1.16.3</version>
           <scope>test</scope>
       </dependency>
       <dependency>
           <groupId>org.testcontainers</groupId>
           <artifactId>junit-jupiter</artifactId>
           <version>1.16.3</version>
           <scope>test</scope>
       </dependency>

Debe actualizar las pruebas para utilizar los contenedores de prueba, que inician la base de datos en cada ejecución de prueba. Agregue una anotación y un campo a la prueba para hacer uso de ella:

//added imports
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.DynamicPropertyRegistry;
import org.springframework.test.context.DynamicPropertySource;
import org.testcontainers.containers.MySQLContainer;
import org.testcontainers.junit.jupiter.Container;
import org.testcontainers.junit.jupiter.Testcontainers;
 
@SpringBootTest
@AutoConfigureMockMvc
@Testcontainers // Annotation to enable testcontainers
public class AccessingDataRestApplicationTests {
 
   // Field to access the started database
   @Container
   private static MySQLContainer database = new MySQLContainer<>("mysql:5.7.34");
 
   //Set database configuration using the started database
   @DynamicPropertySource
   static void databaseProperties(DynamicPropertyRegistry registry) {
       registry.add("spring.datasource.url", database::getJdbcUrl);
       registry.add("spring.datasource.username", database::getUsername);
       registry.add("spring.datasource.password", database::getPassword);
   }

Para cada ejecución de prueba, la base de datos se inicia automáticamente, lo que le permite usar una base de datos real cuando ejecuta pruebas. Todo el cableado, la configuración, el inicio y la limpieza se realizan por usted.

Dockerize su aplicación

Es posible dockerizar su aplicación con herramientas simples de Docker, pero no se recomienda.

Puede construir su aplicación, usar un contenedor base que contenga Java y copiar y ejecutar su aplicación. Pero hay muchas trampas, y este es el caso de todos los lenguajes y marcos. Así que busca siempre herramientas que te hagan la vida más fácil.

En este ejemplo, utilizará contenedores Jib y distroless para crear fácilmente un contenedor Docker. El uso de ambos en combinación le brinda un contenedor mínimo, seguro y reproducible, que funciona de la misma manera localmente y en producción.

Para usar Jib, debe agregarlo como un complemento experto agregándolo a su pom.xml :

<build>
       <plugins>
           <plugin>
               <groupId>org.springframework.boot</groupId>
               <artifactId>spring-boot-maven-plugin</artifactId>
           </plugin>
 
        <!-- Jib plugin -->
           <plugin>
               <groupId>com.google.cloud.tools</groupId>
               <artifactId>jib-maven-plugin</artifactId>
               <version>3.2.1</version>
               <configuration>
                   <from>
                       <image>gcr.io/distroless/java17:nonroot</image>
                   </from>
                   <to>
                       <image>my-docker-image</image>
                   </to>
               </configuration>
           </plugin>
       </plugins>
   </build>

Ahora puede crear la imagen y ejecutar la aplicación:

# build the docker container
./mvnw compile jib:dockerBuild

# find your build image
docker images

# start the database
docker run --rm -v "$PWD/data":/var/lib/mysql --name mysql -e MYSQL_ROOT_PASSWORD=admin-password -e MYSQL_DATABASE=my-database -p 3306:3306 mysql:8.0.28-debian


# start the docker container which contains your application
docker run --net=host my-docker-image

… skipped output…
2022-04-15 17:43:51.509  INFO 1 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
2022-04-15 17:43:51.521  INFO 1 --- [           main] c.e.a.AccessingDataRestApplication       : Started AccessingDataRestApplication in 6.146 seconds (JVM running for 6.568)

La aplicación se inicia con el modo de red host --net=host , lo que facilita la conexión a la base de datos que inició. Alternativamente, puede crear una docker network e inicie ambos en la misma red.

Puede enviar su contenedor a un registro de contenedores y hacer referencia a él desde cualquier herramienta de orquestación de contenedores para ejecutar su aplicación en producción.


Docker
  1. Registros de Docker:qué son y cómo usarlos (con ejemplos)

  2. Cómo usar el comando Vmstat en Linux explicado con ejemplos

  3. Cómo usar imágenes, contenedores y archivos Docker en profundidad

  4. Cómo usar Docker Compose

  5. ¿Qué es Podman y en qué se diferencia de Docker?

Cómo automatizar las auditorías de seguridad de Docker con Docker Bench for Security

Cómo usar las políticas de reinicio de Docker para mantener los contenedores en funcionamiento

Cómo editar código en contenedores Docker con Visual Studio Code

Cómo eliminar contenedores Docker

Cómo detener los contenedores de Docker

Cómo usar el comando de suspensión en Linux:explicado con ejemplos