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ás a:
- ejecutar una base de datos localmente usando Docker,
- ejecutar pruebas automatizadas utilizando una base de datos dockerizada,
- ejecute su 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:
Ejecute aplicaciones aisladas usando Docker
Docker elimina las tareas de configuración repetitivas y mundanas y se utiliza a lo largo del ciclo de vida del desarrollo para un desarrollo de aplicaciones rápido, fácil y portátil: escritorio y 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 bases 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 el 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, lo que le permite iniciar el contenedor Docker sin perder sus datos,-p 3306:3306
asigna el puerto del contenedor3306
a nuestra máquina para que otras aplicaciones puedan usarlo,-e MYSQL_DATABASE=my-database
establece una variable de entorno para crear una nueva base de datos llamadamy-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 utilizar 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 de acceso 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, hay 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, la puesta en marcha 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 host en modo de red --net=host
, lo que facilita la conexión a la base de datos que inició. Alternativamente, puede crear un docker network
e iniciar 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.
Resumen
En este tutorial, aprendió a aprovechar Docker para crear, probar. y ejecute aplicaciones sin contaminar su sistema.
Todo está en su entorno Docker aislado y funciona localmente, como en sistemas de integración continua y sistemas de producción donde puede iniciar cientos de sus aplicaciones.
Puede encontrar la aplicación de ejemplo lista para usar en mi Repositorio de aplicaciones de ejemplo de GitHub Docker For Development .
Espero que hayas disfrutado el artículo.
Si te gustó y sentiste la necesidad de darme un aplauso o simplemente quieres ponerte en contacto, sígueme en Twitter .
Trabajo en eBay Kleinanzeigen, una de las mayores empresas de anuncios clasificados del mundo. Por cierto, ¡estamos contratando !