Gustavo Morales
VM
Docker container
Virtual Machines vs Docker containers
¿Como se ejecuta en el sistema?
Es un proceso
¿Que es Docker?
docker
docker version
docker info
Docker images are the basis of containers. An Image is an ordered collection of root filesystem changes and the corresponding execution parameters for use within a container runtime. An image typically contains a union of layered filesystems stacked on top of each other. An image does not have state and it never changes.
https://hub.docker.com
docker pull [image][:tag]
docker image ls docker image inspect [name] docker image history [name]
docker image build -t [name] [DockerfilePath]
docker pull nginx
FROM nginx:latest COPY monster-battle/src /usr/share/nginx/html
git clone https://github.com/gmoralesc/monster-battleDockerfile
docker image build -t pokemon .docker container run -p 80:80 pokemonCrear una imagen llamada node_auth_simple
1. (FROM) A partir de la imagen node:14
2. (WORKDIR) Establecer el directorio de trabajo /usr/src/app
3. (RUN) Ejecutar git clone https://github.com/gmoralesc/node-auth --branch develop .
5. (COPY) Copiar el archivo .env
6. (RUN) Ejecutar el comando npm install
6. (EXPOSE) Exponer el puerto 3000
7. (CMD) Establecer el comando npm start
B. Dockerfile
C. Crear el contenedor
Ejecutar la app en un contenedor modo detach en el puerto 3000
Instrucciones en https://github.com/gmoralesc/node-auth
SERVER_HOSTNAME=0.0.0.0 SERVER_PORT=3000 JWTSECRET=rickandmorty
A. .env
FROM node:16 WORKDIR /usr/src/app RUN git clone https://github.com/gmoralesc/node-auth --branch develop . COPY .env . RUN npm install EXPOSE 3000 CMD ["npm","start"]
Dockerfile
Es una instancia de una imagen corriendo como proceso en el sistema
docker container --help
docker container run
docker container ls
docker container stop
docker container start
docker container logs
docker container run --publish 80:80 nginx
docker container run --publish 80:80 --detach nginx
docker container ls
docker container stop [hash]
docker container ls -a
docker container run -p 80:80 -d --name web nginx
docker container logs web
docker container top web
docker container rm [-f] webDe las siguientes imágenes en sus respectivos puertos
nginx (puerto 80:80)
httpd (puerto 8080:80)
mysql (puerto 3306:3306)
A. Ejecutar los contenedores
B. Administrar los contenedores
docker container run -p 80:80 -d --name nginx nginx
container run -p 8080:80 -d --name apache httpd
docker container run -p 3306:3306 -d -e MYSQL_RANDOM_ROOT_PASSWORD=yes --name mysql mysql
docker container ls
docker container logs mysql
A. Ejecutar los contenedores
B. Administrar los contenedores
docker container top [name] docker container inspect [name] docker container stats
docker container run -it docker container exec
docker container run -it --name alpha ubuntu docker container start -ai alpha
docker container start alpha docker container exec alpha ls -l
docker container stop alpha
docker container run -it alpine bash docker container run -it alpine sh
centos:7
ubuntu:14.04
centos: yum install curl
ubuntu: apt-get update && apt-get install curl
A. Ejecutar los contenedores
B. Instalar cURL
curl --version
C. Comprobar la versión de cURL
docker container run -it --name beta centos:7
docker container run -it --rm --name delta ubuntu:14.04
centos: yum install curl
ubuntu: apt-get update && apt-get install curl
A. Ejecutar los contenedores
B. Instalar cURL
curl --version
C. Comprobar la versión de cURL
Docker crea una red virtual donde están todos los contenedores por defecto
docker network ls docker network inspect docker network create --driver docker network connect docker network disconnect
docker network create webnetwork docker container run -d --name beta --network webnetwork alpine sleep 1d
docker container run -d --name gamma --network webnetwork alpine sleep 1d
docker exec -it beta apk add iputils
docker inspect gamma | grep IPAddress
docker exec -it container1 ping [IP]
Crear una red
Crear 3 contenedores basados en la imagen nginx con la opción --net-alias webserver, en la misma red y ejecutarlos en segundo plano
imagen: alpine comando: apk add curl curl -s my-webserver
A. Crear y ejecutar los contenedores
B. Escanear los contenedores en la red
docker network create my_custom_network
docker run -d --network my_custom_network --net-alias my-webserver nginx
docker run -d --network my_custom_network --net-alias my-webserver nginx
docker run -d --network my_custom_network --net-alias my-webserver nginx
docker run -it --network my_custom_network alpine sh
apk add curl
curl -s my-webserver
A. Crear y ejecutar los contenedores
B. Escanear los contenedores en la red
docker image pull mysql
docker container run -d --name mysql -e MYSQL_ALLOW_EMPTY_PASSWORD=yes mysql
docker container inspect mysql
docker volume ls docker container run -d --name mysql -e MYSQL_ALLOW_EMPTY_PASSWORD=yes -v mysql-data:/var/usr/mysql mysql
docker container inspect mysql
docker volume ls
docker volume inspect [id]
Ejecutar un contenedor a partir con las siguientes caracteristicas:
image: postgres:14
volume: pg-data
Detach mode (-d)
A. Crear contenedor inicial
B. Comprobar el entorno
C. Reutilizar el volume
Verificar los logs para garantizar que imagen se ejecutó correctamente y luego detener el contenedor
Ejecutar otro contenedor con las mismas características del primero pero esta vez utilizar la imagen de postgres:14.9 y debe utilizar el mismo volumen creado anteriormente.
Si es posible interactuar con el primer contenedor y guardar datos, luego comprobar que los datos no se perdieron con el segundo contenedor
docker run --name pg-14 -e POSTGRES_PASSWORD=mysecretpassword -v pg-data:/var/lib/postgresql/data -d postgres:14
docker exec -it pg-14 psql -U postgres -c "CREATE DATABASE testdb;"
A. Crear contenedor inicial
B. Comprobar el entorno
C. Reutilizar el volume
docker stop pg-14
docker rm pg-14
docker run --name pg-14.9 -e POSTGRES_PASSWORD=mysecretpassword -v pg-data:/var/lib/postgresql/data -d postgres:14.9
docker exec -it pg-14.9 psql -U postgres -l
docker container run -v [absolute_path]:[image_path]
docker container run -d -p 80:80 -v ./src/:/usr/share/nginx/html pokemon2Tomando como referencia la imagen de my_website creada anteriormente y estando en el directorio que contiene el directorio academia
Realizar cambios en el código fuente y comprobarlos en el navegador
version: 3.3 services: service-name: image: ports: environment: volumes: service-name: volumes: networks:
docker-compose up nunca reconstruye las imágenes en ese caso es necesario utilizar docker-compose build
FROM node:16 WORKDIR /usr/src/app COPY . .
RUN npm install EXPOSE 3000 CMD ["npm", "run", "dev"]
C. Dockerfile
D. docker-compose.yml
Crear un manifesto con los siguientes servicios:
A. Descargar proyecto
git clone https://github.com/gmoralesc/node-auth mkdir -p node-auth/node_modules
SERVER_HOSTNAME=0.0.0.0 SERVER_PORT=3000 DATABASE_URL=mongodb://db/nodeauth JWTSECRET=rickandmorty
B. .env
(Crear dentro del directorio de node-auth)
FROM node:16 WORKDIR /usr/src/app COPY . .
RUN npm install EXPOSE 3000 CMD ["npm", "run", "dev"]
C. Dockerfile
A. Descargar proyecto
git clone https://github.com/gmoralesc/node-auth
SERVER_HOSTNAME=0.0.0.0 SERVER_PORT=3000 DATABASE_URL=mongodb://db/nodeauth JWTSECRET=rickandmorty
B. .env
D. docker-compose.yml
version: '3.1'
services:
server:
build: .
ports:
- '3000:3000'
depends_on:
- db
db:
image: mongo:3.6.18
ports:
- '27017:27017'
...
volumes:
- ./node-auth:/usr/src/app
- /usr/src/app/node_modules
A. Editar docker-compose.yml
B. Editar Dockerfile
FROM node:16 WORKDIR /usr/src/app
COPY package.json .
COPY package-lock.json . COPY .env . RUN npm install EXPOSE 3000 CMD ["npm", "run", "dev"]
docker-compose up -- build
C. Construir y ejecutar
version: '3.1'
services:
server:
build: .
ports:
- '3000:3000'
volumes:
- ./:/usr/src/app
- /usr/src/app/node_modules
depends_on:
- db
db:
image: mongo:3.6.18
ports:
- '27017:27017'A. docker-compose.yml
B. Dockerfile
FROM node:16 WORKDIR /usr/src/app
COPY package.json .
COPY package-lock.json . COPY .env . RUN npm install EXPOSE 3000 CMD ["npm", "run", "dev"]
docker-compose up -- build
C. Construir y ejecutar