Docker empaqueta software en unidades estandarizadas llamadas contenedores que incluyen todo lo necesario para que el software se ejecute, incluidas bibliotecas, herramientas de sistema, código y tiempo de ejecución. Un contenedor es un formato de empaquetado que empaqueta todo el código y las dependencias de una aplicación en un formato estándar que le permite ejecutarse de manera rápida y confiable en todos los entornos informáticos. Docker también es una plataforma de software que permite a los desarrolladores crear, probar e implementar aplicaciones en contenedores rápidamente.
Containers as a Service (CaaS) o los servicios de contenedores son servicios en la nube (AWS, Google Cloud, MS Azure, Digital Ocean).
Aislamiento vs virtualización
Cada contenedor tiene su propio sistema de archivos, su propia pila de red (y, por lo tanto, su propia dirección IP), su propio espacio de proceso y limitaciones de recursos definidas para la CPU y la memoria. Dado que un contenedor no tiene que iniciar un sistema operativo, se inicia de inmediato. Un contenedor es aislamiento, es decir, separa los recursos de un sistema operativo host, a diferencia de la virtualización que proporciona un sistema operativo invitado por encima del sistema operativo host.
https://github.com/IvanYanez10/ticket-app/blob/master/auth/Dockerfile
FROM node:alpine
WORKDIR /app
COPY package.json .
RUN npm install --only=prod
COPY . .
CMD ["npm", "start"]
Docker y Kubernetes
Kubernetes es un sistema de orquestación de código abierto que le permite ejecutar sus cargas de trabajo y contenedores. Le ayuda a administrar las complejidades operativas al escalar múltiples contenedores implementados en varios servidores. El motor de Kubernetes organiza automáticamente el ciclo de vida del contenedor y distribuye los contenedores en la infraestructura de alojamiento. Kubernetes puede aumentar o reducir rápidamente los recursos según la demanda. Aprovisiona, programa, elimina y supervisa de forma continua el estado de los contenedores.
https://github.com/IvanYanez10/ticket-app/blob/master/infra/k8s/auth-depl.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: auth-depl
spec:
replicas: 1
selector:
matchLabels:
app: auth
template:
metadata:
labels:
app: auth
spec:
containers:
- name: auth
#image: us.gcr.io/tickets-app-dev/auth 'gcloud'
image: ivanyz/auth
env:
- name: MONGO_URI
value: 'mongodb://auth-mongo-srv:27017/auth'
- name: JWT_KEY
valueFrom:
secretKeyRef:
name: jwt-secret
key: JWT_KEY
- name: STRIPE_KEY
valueFrom:
secretKeyRef:
name: stripe-secret
key: STRIPE_KEY
---
apiVersion: v1
kind: Service
metadata:
name: auth-srv
spec:
selector:
app: auth
ports:
- name: auth
protocol: TCP
port: 3000
targetPort: 3000
Docker Hub
Administrado por Docker, Docker Hub es una forma estándar de almacenar y distribuir imágenes de Docker. Tiene más de 100.000 imágenes de contenedores de proveedores de software, proyectos de código abierto y la comunidad. Docker Hub contiene software y aplicaciones de repositorios oficiales, como NGINX, Logstash, Apache HTTP, Grafana, MySQL, mongoDB, Ubuntu. El Registro es un repositorio de código abierto bajo la licencia permisiva de Apache.
El registor de Docker también ayuda a mejorar el control de acceso y la seguridad de las imágenes de Docker almacenadas en su repositorio. Administra la distribución de imágenes y también se puede integrar con los flujos de trabajo de desarrollo de aplicaciones. Los desarrolladores pueden configurar su propio Registro de Docker o utilizar un servicio de registro de Docker alojado, como Docker Hub, Oracle Container Registry, Azure Container Registry, etc.
https://hub.docker.com/r/ivanyz/auth
Docker para microservicios
Se basa en la idea de cortar aplicaciones monolíticas en pequeñas partes.
Los microservicios se implementan de forma independiente como un proceso, utilizan protocolos livianos para comunicarse entre sí y cada servicio es propietario de sus datos. Dado que los microservicios siguen un enfoque de gobernanza descentralizado, requieren una cantidad bastante alta de automatización de la infraestructura, pruebas automatizadas, pipelines de CD completamente automatizadas.
Un microservicio debe ser independiente del host y estar aislado en el nivel del sistema operativo. Debe ejecutarse dentro de sus límites de recursos, debe poder aumentarse y reducirse, reiniciarse en caso de fallas, así como detectarse y conectarse a otros microservicios.
Por lo tanto, ejecutar un microservicio en un contenedor de Docker lo coloca en un excelente punto de partida para lograr la mayoría de estos objetivos.
https://github.com/IvanYanez10/ticket-app
Aplicaciones usuales
- Docker iot Device
- Procesamiento de datos
- Contenedores como servicio
- Integración y entrega continuas
- Microservicios