Puedes configurar una instancia de máquina virtual (VM) o una plantilla de instancias para implementar y lanzar un contenedor de Docker. Compute Engine proporciona una imagen actualizada de Container-Optimized OS (COS) con Docker instalado y lanza tu contenedor cuando se inicia la VM.
Antes de comenzar
- Si no estás familiarizado con los contenedores, consulta Qué son los contenedores y cuáles son sus beneficios.
- Si no estás familiarizado con Docker, consulta la documentación de Docker.
- Lee acerca de Container-Optimized OS.
- Lee sobre los grupos de instancias administrados (MIG).
-
Si aún no lo hiciste, configura la autenticación.
La autenticación es el proceso mediante el cual se verifica tu identidad para acceder a los servicios y las API de Google Cloud.
Para ejecutar código o muestras desde un entorno de desarrollo local, puedes autenticarte en Compute Engine seleccionando una de las siguientes opciones:
Select the tab for how you plan to use the samples on this page:
Console
When you use the Google Cloud console to access Google Cloud services and APIs, you don't need to set up authentication.
gcloud
-
Install the Google Cloud CLI, then initialize it by running the following command:
gcloud init
- Set a default region and zone.
- Administra las VM en las que se ejecutan contenedores igual que cualquier otra VM cuando configuras y administras la infraestructura de Compute Engine.
- Usa herramientas y procesos con los que estés familiarizado, como Google Cloud CLI o la API de Compute Engine, a fin de administrar las VM con contenedores.
Crea servicios escalables mediante grupos de instancias administrados (MIG) en los que se ejecutan contenedores. Estos grupos ofrecen funciones como el ajuste de escala automático, la reparación automática, las actualizaciones progresivas, las implementaciones multizona y el balanceo de cargas.
- Ejecutar una gran cantidad de microservicios
- Reducir el tiempo de inicio de contenedores
- Aprovechar la organización automatizada de Kubernetes, que incluye actualizaciones automáticas, reparación automática de nodos y ajuste de escala automático
- Implementación de software en el arranque de la VM mediante una secuencia de comandos de inicio o cloud-init.
- Creación de una imagen de disco de arranque personalizada con software preinstalado
- Empaqueta la app y las bibliotecas requeridas en una imagen de Docker, y publica esa imagen en Artifact Registry o en un registro de terceros, como Docker Hub.
- Especifica el nombre de una imagen de Docker y la configuración
docker run
cuando crees una instancia de VM o una plantilla de instancias para un MIG. - Compute Engine crea una instancia de VM mediante el uso de una imagen de Container-Optimized OS que proporciona Google. Esta imagen incluye un entorno de ejecución de Docker y software adicional que está a cargo de iniciar el contenedor.
- Compute Engine almacena la configuración del contenedor en los metadatos de la instancia, bajo la clave de metadatos
gce-container-declaration
. - Cuando se inicia la VM, la imagen de Container-Optimized OS usa la configuración del comando
docker run
que se almacena en los metadatos de la instancia, extrae la imagen de contenedor del repositorio e inicia el contenedor. - Solo puedes implementar un contenedor para cada instancia de VM. Considera usar Google Kubernetes Engine si necesitas implementar varios contenedores por instancia de VM.
Solo puedes implementar contenedores desde un repositorio público o desde un repositorio privado de Artifact Registry o Container Registry al que puedes acceder. No se admiten otros repositorios privados.
Consulta la documentación de control de acceso de Artifact Registry o Container Registry para obtener información sobre los permisos de registro privado.
No puedes asignar los puertos de una instancia de VM a los puertos del contenedor (opción de Docker
-p
). Para habilitar el acceso a tus contenedores, consulta Publica puertos de contenedor.Con este método de implementación, solo puedes usar las imágenes de Container-Optimized OS.
Solo puedes usar esta función a través de la consola de Google Cloud o de Google Cloud CLI, no a través de la API.
- Sube tu imagen de Docker a Artifact Registry.
- Usa cualquier imagen de contenedor que esté disponible de forma pública de Docker Hub o de otros registros.
Ir a la página Crear una instancia
Especifica los detalles de la VM.
En la sección Contenedor, haz clic en Implementar contenedor.
En la página Configurar contenedor, especifica un nombre de imagen de contenedor y configura las opciones de ejecución del contenedor según tus necesidades. Por ejemplo, puedes especificar
gcr.io/cloud-marketplace/google/nginx1:latest
para la imagen de contenedor.Continúa con el proceso de creación de VM.
- Actualiza la declaración del contenedor en la instancia. Compute Engine almacena la declaración del contenedor actualizada en los metadatos de la instancia en la clave de metadatos
gce-container-declaration
. - Detener y reiniciar la instancia para activar la configuración actualizada, si la instancia se está ejecutando. Si la instancia no está en ejecución, actualiza la declaración del contenedor y mantiene la instancia detenida. La instancia de VM descarga la imagen nueva y, luego, inicia el contenedor cuando se inicia la VM.
Ve a la página Instancias de VM.
Haz clic en el nombre de la VM que se actualizará
En la página de detalles de la instancia, haz clic en Editar.
Especifica la nueva imagen de contenedor y actualiza las opciones de ejecución del contenedor según sea necesario.
Para guardar los cambios, haz clic en Guardar y reiniciar. Compute Engine guarda los cambios y reinicia la instancia de forma automática para completar la actualización. Una vez que la VM se reinicia, Compute Engine descarga la nueva imagen y, luego, inicia el contenedor con la configuración actualizada.
Crea una plantilla de instancias que se base en una imagen de Docker.
Crea un MIG a partir de la plantilla de instancias nueva.
Ve a la página Plantillas de instancias.
Para crear una plantilla de instancias, haz clic en Crear plantilla de instancias.
En la sección Contenedor, selecciona la opción para implementar una imagen de contenedor.
En Imagen del contenedor, especifica el nombre de la imagen de Docker y configura las opciones de ejecución del contenedor si lo deseas. Por ejemplo, puedes especificar
gcr.io/cloud-marketplace/google/nginx1:15
para la imagen de contenedor.Haz clic en Crear.
- Prepara una imagen de Docker nueva para la implementación.
- Crea una plantilla de instancias basada en la nueva imagen de Docker de la misma manera en la que creas una plantilla basada en un contenedor.
- Actualiza un MIG a la plantilla de instancias nueva mediante el actualizador de grupos de instancias administrados.
- Crea una plantilla de instancias basada en la versión actual de la imagen de Docker, de la misma manera en que se crea una plantilla basada en un contenedor para un MIG nuevo. De forma predeterminada, se usa la última versión compatible de una imagen de Container-Optimized OS.
- Actualiza un MIG con la plantilla de instancias nueva mediante el actualizador de grupos de instancias administrados.
VM_NAME
: el nombre de la instancia de VMCONTAINER_NAME
: el nombre del contenedorLos registros del agente de inicio, también conocidos como registros konlet. El agente de inicio analiza la configuración del contenedor y ejecuta tareas para iniciar el contenedor en una instancia de VM de Compute Engine.
Los registros de acontecimientos de Docker informan sobre los acontecimientos del contenedor, incluidos los de inicio y detención del contenedor.
Los registros del contenedor incluyen el
STDOUT
de las apps que se ejecutan en el contenedor.Ve a la página Instancias de VM.
Selecciona la instancia de VM cuyos registros del agente de inicio quieres ver.
En Registros (Logs), haz clic en Puerto en serie 1 - consola (Serial port 1 - console) para ver los registros de la consola en serie.
- Conéctate a tu instancia con un contenedor mediante SSH.
Ejecuta el comando
sudo journalctl
para ver el inicio de la VM y los registros de inicio del contenedor. Usa el siguiente comando para filtrar los registros del agente de inicio del contenedor (konlet
).sudo journalctl -u konlet*
Ve a la página Instancias de VM.
Selecciona la instancia de VM cuyos registros del agente de inicio quieres ver.
En Registros (Logs), haz clic en Cloud Logging para ver los registros de Cloud Logging.
Ingresa un filtro de búsqueda para recuperar los registros del agente de inicio.
resource.type="gce_instance" logName="projects/PROJECT_ID/logs/cos_system" jsonPayload.SYSLOG_IDENTIFIER="konlet-startup" jsonPayload._HOSTNAME="VM_NAME"
Reemplaza lo siguiente:
PROJECT_ID
: el ID del proyecto que contiene la instanciaVM_NAME
: el nombre de la instancia de la que deseas obtener los registros
PROJECT_ID
: el ID del proyecto que contiene la instanciaVM_NAME
: el nombre de la instancia de la que deseas obtener los registros- Conéctate a la instancia con un contenedor mediante SSH.
Ejecuta el comando
sudo journalctl
con el siguiente filtro para ver los registros de acontecimientos de Docker.sudo journalctl -u docker-events-collector
Ve a la página Instancias de VM.
Selecciona la instancia de VM cuyos registros del agente de inicio quieres ver.
En Registros (Logs), haz clic en Cloud Logging para ver los registros de Cloud Logging.
Ingresa el siguiente filtro de búsqueda para obtener los registros de acontecimientos de Docker.
resource.type="gce_instance" logName="projects/PROJECT_ID/logs/cos_system" jsonPayload._HOSTNAME="VM_NAME" jsonPayload.SYSLOG_IDENTIFIER="docker"
Reemplaza lo siguiente:
PROJECT_ID
: el ID del proyecto que contiene la instanciaVM_NAME
: el nombre de la instancia de la que deseas obtener los registros
PROJECT_ID
: el ID del proyecto que contiene la instanciaVM_NAME
: el nombre de la instancia de la que deseas obtener los registrosVe a la página Instancias de VM.
Selecciona la instancia de VM cuyos registros del agente de inicio quieres ver.
En Registros (Logs), haz clic en Cloud Logging para ver los registros de Cloud Logging.
La página de Cloud Logging se carga con un filtro de búsqueda predeterminado. Copia el valor de
resource.labels.instance_id
. Lo usarás más tarde.Actualiza el filtro de búsqueda para recuperar los registros del contenedor.
resource.type="gce_instance" logName="projects/PROJECT_ID/logs/cos_containers" resource.labels.instance_id="INSTANCE_ID"
Reemplaza lo siguiente:
PROJECT_ID
: el ID del proyecto que contiene la instanciaINSTANCE_ID
: el ID de la instancia de la que deseas obtener los registros
Determina el ID de la instancia de la que quieres obtener los registros:
gcloud compute instances describe VM_NAME \ --zone ZONE \ --format="value(id)"
Reemplaza lo siguiente:
VM_NAME
: Es el nombre de la instancia de la que deseas obtener los registros.ZONE
: Es la zona en la que se encuentra la instancia.
Usa el comando y el filtro siguientes para ver los registros del contenedor de la instancia.
gcloud logging read "resource.type=gce_instance AND \ logName=projects/PROJECT_ID/logs/cos_containers AND \ resource.labels.instance_id=INSTANCE_ID"
Reemplaza lo siguiente:
PROJECT_ID
: el ID del proyecto que contiene la instanciaINSTANCE_ID
: el ID de la instancia
Por ejemplo, usa el siguiente comando a fin de ver los últimos 10 registros de contenedor en Cloud Logging para una instancia de VM que se ejecuta en COS 70, que existe en
my-project
y que tiene un ID de instancia de VM555123456789012345
.gcloud logging read "resource.type=gce_instance AND \ logName=projects/my-project/logs/cos_containers AND \ resource.labels.instance_id=555123456789012345" \ --limit 10
- Especificar una política de reinicio de contenedor
- Anular el contenedor
ENTRYPOINT
(comando predeterminado que se ejecutará cuando se inicie el contenedor) - Pasar argumentos al comando del contenedor
ENTRYPOINT
- Ejecutar un contenedor en modo privilegiado
- Activar un directorio de host o
tmpfs
como volumen de datos dentro del contenedor - Configurar variables de entorno
- Asignar un búfer para
STDIN
en el entorno de ejecución del contenedor - Asignar un seudo TTY
- Obtén más información sobre la configuración de opciones para ejecutar tu contenedor.
- Obtén más información sobre los grupos de instancias administrados.
- Obtén información sobre Container-Optimized OS.
Elige implementar contenedores en VM y MIG
Mediante la implementación de contenedores en Compute Engine, puedes simplificar la implementación de apps mientras controlas la infraestructura de VM.
Como alternativa, puedes considerar implementar en Google Kubernetes Engine, que permite llevar a cabo las siguientes tareas:
La ejecución de cada microservicio en una máquina virtual (VM) individual en Compute Engine puede causar que la sobrecarga del sistema operativo represente una parte importante del costo. Google Kubernetes Engine te permite implementar varios contenedores y grupos de contenedores para cada instancia de VM, que pueden asignar recursos de VM de host de manera más eficiente a microservicios con una huella más pequeña.
Cómo funciona la implementación de contenedores en Compute Engine
Dentro de los métodos más comunes para implementar software en una instancia de VM de Compute Engine, se incluyen los siguientes:
Ambos métodos combinan las tareas de configuración de la app y de configuración del entorno del sistema operativo. Como desarrollador, debes rastrear y resolver de forma minuciosa cualquier dependencia del entorno de ejecución. Por ejemplo, si dos apps que se ejecutan en una VM usan versiones diferentes de la misma biblioteca, debes instalar ambas versiones y, luego, indicarlas a través de variables del sistema.
Como alternativa, puedes implementar software en un contenedor en una instancia de VM o en un MIG. Un contenedor lleva el software de la aplicación y las bibliotecas requeridas, y está aislado de las bibliotecas y apps del SO. Un contenedor se puede mover con facilidad de un entorno de implementación a otro sin tener que lidiar con las versiones conflictivas de las bibliotecas en el contenedor y su SO.
A continuación, se describe el proceso de implementación de un contenedor en Compute Engine:
Compute Engine ejecuta las siguientes tareas después de realizar una solicitud para crear una instancia de VM:
Limitaciones
Prepara un contenedor para la implementación
Elige uno de los siguientes enfoques para que Compute Engine pueda acceder a tu imagen de contenedor:
Implementa un contenedor en una instancia de VM nueva
Puedes implementar un contenedor en una instancia de VM nueva mediante la consola de Google Cloud o con Google Cloud CLI.
Console
En el siguiente ejemplo, se implementa un contenedor de
https://gcr.io/cloud-marketplace/google/nginx1:latest
, una imagen de Nginx de Docker que proporciona Google, en una instancia de VM. Si quieres usar otra imagen de Docker, especifica esa imagen en lugar de la que se menciona en los siguientes ejemplos.gcloud
Usa el comando
gcloud compute instances create-with-container
:gcloud compute instances create-with-container VM_NAME \ --container-image DOCKER_IMAGE
Por ejemplo, con el siguiente comando, se crea una instancia de VM nueva llamada
nginx-vm
, que inicia y ejecuta la imagen de Dockergcr.io/cloud-marketplace/google/nginx1:latest
.gcloud compute instances create-with-container nginx-vm \ --container-image gcr.io/cloud-marketplace/google/nginx1:latest
Obtén más información sobre el comando
gcloud compute instances create-with-container
.Siempre que uses una imagen pública de Docker Hub, debes especificar un nombre de imagen de Docker completo. Por ejemplo, especifica el siguiente nombre de imagen para implementar una imagen de contenedor de Apache:
docker.io/httpd:2.4
Actualiza un contenedor en una instancia de VM
Puedes actualizar una imagen de Docker y las opciones de configuración para ejecutar el contenedor en una instancia de VM mediante la consola de Google Cloud o con Google Cloud CLI.
Cuando actualizas una VM que ejecuta un contenedor, Compute Engine lleva a cabo dos pasos:
Console
gcloud
Actualiza la declaración del contenedor con el comando
gcloud compute instances update-container
. Por ejemplo:gcloud compute instances update-container nginx-vm \ --container-image gcr.io/cloud-marketplace/google/nginx1:latest
Con este comando, se configura la imagen del contenedor como
gcr.io/cloud-marketplace/google/nginx1:latest
y se reinicia la instancia para activar los cambios. También puedes actualizar cualquiera de las propiedades descritas en Configura opciones para ejecutar tu contenedor mediante el uso de las marcas correspondientes.Una vez que se reinicia la instancia, se descarga la imagen de contenedor nueva y, luego, se inicia el contenedor con la configuración nueva.
Implementa un contenedor en un grupo de instancias administrado
Puedes implementar un contenedor en un grupo de instancias administrado (MIG) nuevo mediante la consola de Google Cloud o Google Cloud CLI mediante estos pasos:
Console
En el siguiente ejemplo, se crea una plantilla de instancias que implementa un contenedor de una imagen Nginx (
gcr.io/cloud-marketplace/google/nginx1:15
) de Docker proporcionada por Google en un MIG. Para usar otras imágenes de Docker, especifica la imagen deseada en lugar degcr.io/cloud-marketplace/google/nginx1:15
en el siguiente ejemplo.A continuación, crea un MIG que use la plantilla de instancias nueva.
gcloud
Crea una plantilla de instancias para ejecutar imágenes de Docker con el comando
gcloud compute instance-templates create-with-container
:gcloud compute instance-templates create-with-container TEMPLATE_NAME \ --container-image DOCKER_IMAGE
Si quieres, también puedes configurar las opciones de ejecución del contenedor .
Por ejemplo, el siguiente comando crea una plantilla de instancias nueva con el nombre
nginx-template
, que incluye información sobre la imagen de Docker. Una instancia de VM creada a partir de esta plantilla inicia y ejecuta la imagen de Dockergcr.io/cloud-marketplace/google/nginx1:15
cuando se inicia la VM.gcloud compute instance-templates create-with-container nginx-template \ --container-image gcr.io/cloud-marketplace/google/nginx1:15
A continuación, crea un MIG mediante la plantilla de instancias nueva.
Ahora que ya tienes una plantilla de instancias, puedes crear un MIG que la use. Por ejemplo, para crear un MIG mediante la CLI de gcloud y la
nginx-template
que acabas de crear, ejecuta el siguiente comando:gcloud compute instance-groups managed create example-group \ --base-instance-name nginx-vm \ --size 3 \ --template nginx-template
Actualiza un grupo de instancias administrado que ejecuta un contenedor
Puedes actualizar un grupo de instancias administrado (MIG) para implementar una versión nueva de una imagen de Docker o una versión nueva de la imagen de Container-Optimized OS.
Actualiza un MIG a una versión nueva de una imagen de contenedor
Puedes implementar una versión nueva de una imagen de Docker en un MIG mediante el actualizador de grupos de instancias administrados en tres pasos:
Actualiza un grupo de instancias administrado a una versión nueva de la imagen Container-Optimized OS
Google actualiza las imágenes de Container-Optimized OS con regularidad. Es posible que quieras aplicar esas actualizaciones a tus MIG en contenedores sin cambiar la imagen de Docker. Puedes actualizar un MIG a una versión nueva de una imagen de Container-Optimized OS mediante la consola de Google Cloud o Google Cloud CLI en dos pasos:
Conéctate a un contenedor mediante SSH
Puedes conectarte a un contenedor en una VM mediante SSH. Usa la CLI de gcloud para ejecutar
gcloud compute ssh
con la marca--container
:gcloud compute ssh VM_NAME --container CONTAINER_NAME
Reemplaza lo siguiente:
Obtén más información sobre el comando
gcloud compute ssh
y sus argumentos.Supervisa contenedores en Compute Engine
Para supervisar tus instancias que ejecutan una imagen de Container-Optimized OS, usa el agente Detector de problemas de nodos, que se comunica con Cloud Monitoring e informa las métricas relacionadas con el estado. El agente está integrado en las imágenes de Container-Optimized OS a partir del Milestone 77.
Para habilitar el agente, en contenedores que usen imágenes con Milestone 88 o una versión posterior, edita la sección de metadatos personalizados y configura
google-monitoring-enabled
comotrue
.Si deseas conocer otras formas de habilitar Node Problem Detector, visita Habilita la supervisión del estado.
El agente de Node Problem Detector admite las métricas de la lista de métricas que comienzan con
guest/
.Para interactuar con las métricas que recopila el agente, visita el Explorador de métricas.
Visualiza los registros
Puedes ver tres tipos de registros relacionados con contenedores:
Visualiza los registros del agente de inicio
Los registros del agente de inicio están disponibles en la consola en serie, mediante el servicio del sistema
journald
que se incluye en la imagen de SO y a través de Cloud Logging.Visualiza los registros del agente de inicio en la consola en serie
Console
gcloud
Usa el comando
get-serial-port-output
para ver los registros en el puerto en serie de la instancia.gcloud compute instances get-serial-port-output VM_NAME
Reemplaza
VM_NAME
con el nombre de la instancia de VM.Por ejemplo, usa el siguiente comando para ver el resultado del puerto en serie de una instancia de VM llamada
nginx-vm
:gcloud compute instances get-serial-port-output nginx-vm
Visualiza los registros del agente de inicio en
journald
Visualiza los registros del agente de inicio en Logging
Console
gcloud
Usa el comando
gcloud logging read
con un filtro apropiado para ver los registros del agente de inicio del contenedor.gcloud logging read "resource.type=gce_instance AND \ logName=projects/PROJECT_ID/logs/cos_system AND \ jsonPayload.SYSLOG_IDENTIFIER=konlet-startup AND \ jsonPayload._HOSTNAME=VM_NAME"
Reemplaza lo siguiente:
Por ejemplo, usa el siguiente comando a fin de ver los últimos 10 registros del agente de inicio en Logging de una instancia de VM llamada
nginx-vm
que ejecuta COS 70 y que existe enmy-project
.gcloud logging read "resource.type=gce_instance AND \ logName=projects/my-project/logs/cos_system AND \ jsonPayload.SYSLOG_IDENTIFIER=konlet-startup AND \ jsonPayload._HOSTNAME=nginx-vm" \ --limit 10
Visualiza los registros de eventos de Docker
Puedes ver los registros de eventos de Docker en
journald
y en Cloud Logging.Visualiza los registros de eventos de Docker en
journald
Visualiza registros de acontecimientos de Docker en Logging
Console
gcloud
Usa el comando
gcloud logging read
con un filtro adecuado para ver los registros de eventos de Docker.gcloud logging read "resource.type=gce_instance AND \ logName=projects/PROJECT_ID/logs/cos_system AND \ jsonPayload._HOSTNAME=VM_NAME AND \ jsonPayload.SYSLOG_IDENTIFIER=docker"
Reemplaza lo siguiente:
Por ejemplo, usa el siguiente comando a fin de ver los últimos 10 registros de acontecimientos de Docker en Logging de una instancia de VM llamada
nginx-vm
que ejecuta COS 70 y que existe enmy-project
.gcloud logging read "resource.type=gce_instance AND \ logName=projects/my-project/logs/cos_system AND \ jsonPayload._HOSTNAME=nginx-vm AND \ jsonPayload.SYSLOG_IDENTIFIER=docker" \ --limit 10
Visualiza registros de contenedores
Console
gcloud
Usa el comando
gcloud logging read
para ver los registros del contenedor.Especifica imágenes optimizadas para contenedores o familias de imágenes
De forma predeterminada, las instancias de VM o las plantillas de instancias en contenedores se crean con el fin de usar la imagen optimizada para contenedores compatible más reciente. La imagen pertenece al proyecto
cos-cloud
.Puedes anular esta configuración predeterminada con otra imagen del proyecto
cos-cloud
. Para obtener información acerca de las familias de imágenes disponibles y sus atributos, consulta Elegir la versión correcta de Container-Optimized OS.Por ejemplo, después de saber qué imagen deseas usar, en la CLI de gcloud, proporciona la marca
--image
para anular la imagen optimizada para contenedores predeterminada o proporcionar la marca--image-family
para elegir la última imagen de la familia especificada en el momento de la creación de la VM.En el siguiente ejemplo, se crea una instancia de VM en contenedor que usa la imagen más reciente de la familia de imágenes
cos-dev
:gcloud compute instances create-with-container nginx-vm \ --image-family cos-dev \ --image-project cos-cloud \ --container-image gcr.io/cloud-marketplace/google/nginx1:1.15
Configura las reglas de firewall
Las VM en contenedores inician contenedores cuya red está configurada en modo de host. Un contenedor comparte la pila de red del host y todas las interfaces del host están disponibles para el contenedor.
De forma predeterminada, las reglas de firewall de Google Cloud bloquean todas las conexiones entrantes a una instancia de VM y permiten todas las conexiones salientes desde una instancia de VM.
Crea reglas de firewall para permitir conexiones entrantes a tu instancia y, por lo tanto, al contenedor.
Configura las opciones de ejecución de un contenedor
Puedes configurar las siguientes opciones para ejecutar tu contenedor:
Obtén más información sobre la configuración de opciones para ejecutar tu contenedor.
Próximos pasos
Salvo que se indique lo contrario, el contenido de esta página está sujeto a la licencia Atribución 4.0 de Creative Commons, y los ejemplos de código están sujetos a la licencia Apache 2.0. Para obtener más información, consulta las políticas del sitio de Google Developers. Java es una marca registrada de Oracle o sus afiliados.
Última actualización: 2024-12-22 (UTC)
-