├── .circleci └── config.yml ├── .gitignore ├── 1 - Introduccion.md ├── 10 - Ejemplos practicos.md ├── 11 - Cicd-taller-1.md ├── 12 - Cicd-taller-2.md ├── 13 - Procesamiento de datos.md ├── 14 - contenedores para ml.ipynb ├── 2 - Trabajando con docker.md ├── 3 - Trabajando con imagenes.md ├── 4 - Trabajando con contenedores.md ├── 5 - Trabajando con volumenes.md ├── 6 - Copiando data.md ├── 7 - Enlazando contenedores.md ├── 8 - Contruyendo el Dockerfile.md ├── 9 - Llevando el contenedor al registro.md ├── README.md ├── buildspec.yml ├── files └── 2023-12-01.csv ├── flaskapp ├── Dockerfile ├── entrypoint.sh ├── main.py ├── requirements.txt ├── test.py └── utils.py ├── img ├── README.md ├── circleci-complete-2.png ├── circleci-complete.png ├── circleci-config-1.png ├── circleci-config-2.png ├── circleci-config-3.png ├── circleci-config-4.png ├── circleci-config-5.png ├── circleci1.png ├── circleci2.png ├── circleci3.png ├── circleci4.png ├── circleci5.png ├── circleci6.png ├── circleci7.png ├── circleci8.png ├── circlecifinal.png ├── cloud9-1.png ├── cloud9-2.png ├── cloud9-3.png ├── cloud9.png ├── codebuild1.png ├── codebuild10.png ├── codebuild11.png ├── codebuild12.png ├── codebuild13.png ├── codebuild14.png ├── codebuild15.png ├── codebuild16.png ├── codebuild17.png ├── codebuild18.png ├── codebuild2.png ├── codebuild3.png ├── codebuild4.png ├── codebuild5.png ├── codebuild6.png ├── codebuild7.png ├── codebuild8.png ├── codebuild9.png ├── codecommit1.png ├── codecommit2.png ├── codecommit3.png ├── codecommit4.png ├── codecommit5.png ├── codecommit6.png ├── codecommit7.png ├── codepipeline1.png ├── codepipeline2.png ├── codepipeline3.png ├── codepipeline4.png ├── codepipeline5.png ├── codepipeline6.png ├── codepipeline7.png ├── codepipeline8.png ├── docker-architecture.webp ├── dockerhub-1.png ├── dockerhub-2.png ├── dockerhub-final.png ├── dockerhub1.png ├── dockerhub2.png ├── dynamo1.png ├── ecr-build.png ├── ecr-new.png ├── ecr-work-1.png ├── ecr-work-2.png ├── ecr1.png ├── ecr2.png ├── ecr3.png ├── ecr4.png ├── ecr5.png ├── eventbridge1.png ├── eventbridge2.png ├── eventbridge3.png ├── eventbridge4.png ├── eventbridge5.png ├── eventbridge6.png ├── fork1.png ├── fork2.png ├── github-conf1.png ├── github-conf2.png ├── github-conf3.png ├── github-conf4.png ├── github-conf5.png ├── github-conf6.png ├── github-conf7.png ├── github-conf8.png ├── github-conf9.png ├── hello-world.png ├── nat-gateway.png ├── pa-batch1.png ├── pa-batch2.png ├── pa-batch3.png ├── pa-batch4.png ├── pa-batch5.png ├── pa-cloud9.png ├── pa-dockerbuild.png ├── pa-ecr1.png ├── pa-ecr2.png ├── pa-ecr3.png ├── pa-ecr4.png ├── pa-fargate1.png ├── pa-fargate2.png ├── pa-fargate3.png ├── pa-github1.png ├── pa-permissions1.png ├── pa-permissions2.png ├── pa-role1.png ├── pa-s31.png ├── pa-s32.png ├── pa-subnet1.png ├── pa-subnet3.png ├── pa-subnet4.png ├── pa-subnet5.png ├── permissions1.png ├── permissions2.png ├── run-1.png ├── run-2.png ├── run-3.png ├── run-4.png ├── run-5.png ├── stepfunction1.png ├── stepfunction2.png ├── stepfunction3.png ├── stepfunction4.png ├── test1.png ├── test2.png ├── test3.png ├── test4.png └── test5.png └── processapp ├── 2023-12-01.csv ├── Dockerfile ├── processor.py └── requirements.txt /.circleci/config.yml: -------------------------------------------------------------------------------- 1 | version: 2.1 2 | jobs: 3 | test: 4 | docker: 5 | - image: python:3.10.13 6 | steps: 7 | - checkout 8 | - run: 9 | name: Show version 10 | command: python3 --version 11 | - run: 12 | name: Run tests 13 | command: python3 flaskapp/test.py 14 | build: 15 | docker: 16 | - image: cimg/base:2022.09 17 | auth: 18 | username: $DOCKERHUB_USERNAME 19 | password: $DOCKERHUB_PASSWORD 20 | steps: 21 | - checkout 22 | - setup_remote_docker 23 | - run: 24 | name: Copy files 25 | command: cp flaskapp/* . 26 | - run: 27 | name: Build and Push application Docker image 28 | command: | 29 | docker build -t $DOCKERHUB_USERNAME/myapp:${CIRCLE_TAG} . 30 | echo $DOCKERHUB_PASSWORD | docker login -u $DOCKERHUB_USERNAME --password-stdin 31 | docker push $DOCKERHUB_USERNAME/myapp:${CIRCLE_TAG} 32 | 33 | workflows: 34 | example: 35 | jobs: 36 | - test: 37 | filters: 38 | tags: 39 | only: /.*/ 40 | - build: 41 | filters: 42 | tags: 43 | only: /.*/ 44 | branches: 45 | ignore: /.*/ -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | flaskapp/__pycache__ -------------------------------------------------------------------------------- /1 - Introduccion.md: -------------------------------------------------------------------------------- 1 | # Introducción 2 | 3 | ## 1 Introducción 4 | 5 | Docker es un proyecto de código abierto que automatiza el despliegue de aplicaciones dentro de contenedores de software, proporcionando una capa adicional de abstracción y automatización de virtualización de aplicaciones en múltiples sistemas operativos. 6 | 7 | El núcleo de Docker está formado por el motor Docker, un demonio de software de host único que permite crear y administrar contenedores. Antes de empezar a usar Docker, debes instalar el motor Docker en un host, ya sea una computadora de escritorio, portátil o un servidor. 8 | 9 | Docker está escrito en el lenguaje de programación Go y aprovecha varias características del kernel de Linux para ofrecer su funcionalidad. 10 | 11 | ## 2 Arquitectura de Docker 12 | 13 | Docker utiliza una arquitectura cliente-servidor. El cliente de Docker se comunica con el demonio Docker, que realiza el trabajo de crear, ejecutar y distribuir sus contenedores Docker. El cliente de Docker y el demonio pueden ejecutarse en el mismo sistema, o puede conectar un cliente Docker a un demonio Docker remoto. El cliente de Docker y el demonio se comunican mediante una API REST, a través de sockets UNIX o una interfaz de red. 14 | 15 |
16 | 17 |
18 | 19 | ### El demonio Docker 20 | 21 | El demonio de Docker (dockerd) escucha las solicitudes de la API de Docker y administra objetos de Docker como imágenes, contenedores, redes y volúmenes. Un demonio también puede comunicarse con otros demonios para administrar los servicios de Docker. 22 | 23 | ### El cliente Docker 24 | 25 | El cliente de Docker (docker) es la forma principal en que muchos usuarios de Docker interactúan con Docker. Cuando utiliza comandos como docker run, el cliente envía estos comandos a dockerd, quien los ejecuta. El comando Docker utiliza la API de Docker. El cliente Docker puede comunicarse con más de un demonio. 26 | 27 | ### Registro de Docker 28 | 29 | Un registro de Docker almacena imágenes de Docker. Por ejemplo Docker Hub es un registro público que cualquiera puede usar y Docker busca imágenes en Docker Hub de forma predeterminada. También puedes utilizar tu propio registro privado. 30 | 31 | Cuando utiliza los comandos docker pull o docker run, Docker extrae las imágenes necesarias de su registro configurado. Cuando utiliza el comando docker push, Docker envía su imagen a su registro configurado. 32 | 33 | ### Imágenes 34 | 35 | Una imagen es una plantilla de solo lectura con instrucciones para crear un contenedor Docker. Usualmente, una imagen se basa en otra imagen, con alguna personalización adicional. Por ejemplo, puedes crear una imagen basada en la imagen de Ubuntu, pero con el servidor web Apache y tu aplicación, así como los detalles de configuración necesarios para que tu aplicación se ejecute. 36 | 37 | Puedes crear tus propias imágenes o utilizar únicamente aquellas creadas por otros y publicadas en un registro. Para crear tu propia imagen, crea un Dockerfile con una sintaxis simple para definir los pasos necesarios para crear la imagen y ejecutala. 38 | 39 | ### Contenedores 40 | 41 | Un contenedor es una instancia ejecutable de una imagen. Puedes crear, iniciar, detener, mover o eliminar un contenedor mediante la API o CLI de Docker. Puedes conectar un contenedor a una o más redes, adjuntarle almacenamiento o incluso crear una nueva imagen basada en su estado actual. 42 | 43 | De forma predeterminada, un contenedor está relativamente bien aislado de otros contenedores y de su máquina host. Puedes controlar qué tan aislados están de la red, el almacenamiento u otros subsistemas subyacentes de un contenedor con respecto a otros contenedores o de la máquina host. 44 | 45 | Un contenedor se define por su imagen, así como por las opciones de configuración que le proporciona cuando lo crea o inicia. Cuando se elimina un contenedor, cualquier cambio en su estado que no esté almacenado en un almacenamiento persistente desaparece. 46 | -------------------------------------------------------------------------------- /10 - Ejemplos practicos.md: -------------------------------------------------------------------------------- 1 | # Ejemplos practicos 2 | 3 | ## Trabajando con postgresql 4 | 5 | 1 Vamos a inicializar un contenedor con postgresql 6 | 7 | ```sh 8 | $ docker run -d \ 9 | --name my-postgres \ 10 | -e POSTGRES_PASSWORD=mysecretpassword \ 11 | -e PGDATA=/var/lib/postgresql/data/pgdata \ 12 | -v /custom/mount:/var/lib/postgresql/data \ 13 | -p 5000:5432 postgres 14 | ``` 15 | 16 | 2 Instalamos postgresql en nuestro host para utilizar el cliente psql y poder conectarnos al postgres corriendo dentro del contenedor (Los siguientes comandos son para Amazon Linux 2023) 17 | 18 | ```sh 19 | sudo dnf update 20 | sudo dnf install postgresql15.x86_64 postgresql15-server -y 21 | ``` 22 | 23 | 3 Nos conectamos al postgresql corriendo dentro del contenedor 24 | 25 | ```sh 26 | $ psql -h localhost -p 5000 -U postgres 27 | ``` 28 | 29 | 30 | ## Trabajando con redis 31 | 32 | 1 Vamos a inicializar el contenedor con redis 33 | 34 | ```sh 35 | $ docker run -d --name myredis -p 6000:6379 redis 36 | ``` 37 | 38 | 2 Vamos a instalar redis en el host local (Los siguientes comandos son para Amazon Linux 2023) 39 | 40 | ```sh 41 | sudo dnf install -y redis6 42 | sudo systemctl start redis6 43 | sudo systemctl enable redis6 44 | sudo systemctl is-enabled redis6 45 | redis6-server --version 46 | redis6-cli ping 47 | ``` 48 | 3 Ahora nos conectamos desde nuestro host local hacia el redis corriendo en el contenedor 49 | 50 | ```sh 51 | redis6-cli -h localhost -p 6000 52 | ``` 53 | -------------------------------------------------------------------------------- /11 - Cicd-taller-1.md: -------------------------------------------------------------------------------- 1 | # Taller 1: CI/CD con GitHub, CircleCI y DockerHub 2 | 3 | 1 Primero vamos a realizar un fork del repositorio, para tener el proyecto en nuestra cuenta de GitHub 4 | 5 |
6 | 7 |
8 | 9 |
10 | 11 |
12 | 13 | 2 Tenemos que crear nuestra cuenta en CircleCi y darle los permisos necesarios(En mi caso aparecen 2 por que en mi cuenta de GitHub tengo una organización, solo debería aparecerte una) 14 | 15 |
16 | 17 |
18 | 19 |
20 | 21 |
22 | 23 | A continuación nos pide nuestra contraseña de github para confirmar la integración. 24 | 25 |
26 | 27 |
28 | 29 | Luego se nos mostrará la pantalla para crear un nuevo proyecto, colocamos el nombre del proyecto y vamos al paso 3 (Vamos a generar el ssh key) 30 | 31 |
32 | 33 |
34 | 35 | En caso te aparezca la siguiente pantalla y no la anterior, le das click en "Create Proyect" 36 | 37 |
38 | 39 |
40 | 41 | Aquí vas a selección Github y te mostrara la pantalla anteriormente vista 42 | 43 |
44 | 45 |
46 | 47 | 3 Vamos a nuestra cuenta de AWS y vamos a crear un nuevo ambiente en AWS Cloud9. 48 | 49 |
50 | 51 |
52 | 53 | Lazaremos el siguiente comando en la consola de Cloud9 54 | 55 | ```sh 56 | $ ssh-keygen -t ed25519 -f ~/.ssh/project_key -C maxcloud@gmail.com 57 | ``` 58 | 59 |
60 | 61 |
62 | 63 | Ahora verificamos que se haya generado la llave publica y privada (La llave publica termina en .pub) 64 | 65 |
66 | 67 |
68 | 69 | Revisamos el contenido de la llave privada 70 | 71 |
72 | 73 |
74 | 75 | Colocamos el contenido de la llave privada y los campos requeridos en la siguiente pantalla, y le damos click en "Create Project" 76 | 77 |
78 | 79 |
80 | 81 | Nuestro proyecto en CircleCi se ha configurado y se nos mostrara la siguiente pantalla 82 | 83 |
84 | 85 |
86 | 87 | 4 Ahora para configurar la llave publica en nuestro repositorio en GitHub, vamos a la pestaña "Settings" de nuestro repositorio 88 | 89 |
90 | 91 |
92 | 93 | Luego al menu lateral "Deploy keys" 94 | 95 |
96 | 97 |
98 | 99 | A continuacion click en "Add deploy key" 100 | 101 |
102 | 103 |
104 | 105 | Vamos a nuestro ambiente en cloud9 para ver el contenido de nuestra llave publica 106 | 107 |
108 | 109 |
110 | 111 | Agregamos el contenido de la llave publica a nuestra "Deploy key" como se muestra en pantalla y le damos click en "Add key" 112 | 113 |
114 | 115 |
116 | 117 | Nos requerirá nuestra contraseña, la colocamos y se mostrara la siguiente pantalla 118 | 119 |
120 | 121 |
122 | 123 | 5 Ahora vamos a configurar DockerHub, para ello creamos una cuenta en DockerHub, luego le damos click en "Create repository" 124 | 125 |
126 | 127 |
128 | 129 | Colocamos el nombre "myapp" y le damos click en "Create" como se muestra en la imagen 130 | 131 |
132 | 133 |
134 | 135 | 6 Vamos a configurar las variables de entorno en nuestro proyecto en CircleCI. Para esto vamos a "Proyect settings" 136 | 137 |
138 | 139 |
140 | 141 | En la siguiente pestaña le damos click en "add Environment Variable" 142 | 143 |
144 | 145 |
146 | 147 | Aquí vamos a colocar nuestra primera variable de entorno (Tu ID de DockerHub) 148 | 149 |
150 | 151 |
152 | 153 | Luego colocamos nuestra contraseña 154 | 155 |
156 | 157 |
158 | 159 | 7 Vamos a clonar nuestro repositorio a nuestro ambiente de AWS cloud9 160 | 161 |
162 | 163 |
164 | 165 | En nuestro ambiente de cloud9 vamos a lanzar el siguiente comando: 166 | 167 | ```sh 168 | $ git clone https://github.com/MaxCloud101/curso-docker.git 169 | ``` 170 | 171 |
172 | 173 |
174 | 175 | En el panel lateral observamos que se ha clonado correctamente nuestro proyecto. 176 | 177 | 8 Para disparar un build en CircleCI vamos a editar cualquier archivo y vamos a subir los cambios a nuestro repositorio en github. 178 | 179 | Para ello lanzamos los siguientes comandos: 180 | 181 | ```sh 182 | $ cd curso-docker/ 183 | $ git add README.md 184 | $ git commit -m "Change README" 185 | $ git push origin main 186 | ``` 187 | 188 |
189 | 190 |
191 | 192 | Vemos que se ha disparado un build solamente con el job de test 193 | 194 |
195 | 196 |
197 | 198 | Para dispar la construcción de una imagen Docker debemos crear un tag en el branch actual, para esto vamos a lanzar los siguientes comandos 199 | 200 | ```sh 201 | $ git tag 1.1.0 202 | $ git push --tags 203 | ``` 204 | 205 |
206 | 207 |
208 | 209 | Vemos en CircleCI que se ha generado otro build con dos jobs 210 | 211 |
212 | 213 |
214 | 215 | Ahora vamos a DockerHub y vemos que se realizado correctamente la construcción de nuestro contenedor 216 | 217 |
218 | 219 |
220 | 221 | Si se han seguido todos los pasos correctamente debes tener configurado todo tu flujo de integración continua 222 | 223 | Para mejorar la forma de trabajo para los desarrolladores se suele utilizar Gitflow, esta herramienta te va ayudar a facilitar la creación de ramas para nuevos desarrollo, despliegues a producción y resolución de Bugs. 224 | 225 | Puedes encontrar la documentación de GitFlow aquí 226 | 227 | https://www.atlassian.com/es/git/tutorials/comparing-workflows/gitflow-workflow 228 | 229 | Al terminar este taller no te olvides eliminar todos los siguientes recursos. 230 | 231 | - Eliminar el repositorio en DockerHub 232 | - En CircleCi no hay forma de eliminar el proyecto, si deseas que desaparezca debes levantar un ticket de soporte. Pero puedes darle click y dejarlo como "Unfollow Project" para que no te envié ningún tipo de alerta 233 | 234 |
235 | 236 |
237 | -------------------------------------------------------------------------------- /12 - Cicd-taller-2.md: -------------------------------------------------------------------------------- 1 | # Taller 1: CI/CD con AWS CodeCommit, AWS CodeBuild, AWS CodePipeline y AWS ECR 2 | 3 | 1 Vamos a crear nuestro repositorio en AWS CodeCommit 4 | 5 |
6 | 7 |
8 | 9 |
10 | 11 |
12 | 13 | Clonaremos nuestro repositorio en nuestro ambiente en Cloud9 14 | 15 | ```sh 16 | $ git clone https://git-codecommit.us-west-2.amazonaws.com/v1/repos/MaxCloud 17 | ``` 18 | 19 |
20 | 21 |
22 | 23 | A continuación vamos a copiar la carpeta flaskapp y el archivo buildspec.yml a nuestra carpeta con el repositorio de codecommit 24 | 25 |
26 | 27 |
28 | 29 |
30 | 31 |
32 | 33 |
34 | 35 |
36 | 37 | Subimos estos archivos a nuestro repositorio en codecommit 38 | 39 | ```sh 40 | $ cd MaxCloud 41 | $ git add . 42 | $ git commit -m "add files" 43 | $ git push 44 | ``` 45 | 46 |
47 | 48 |
49 | 50 | 2 Vamos a crear nuestro proyecto en AWS CodeBuild 51 | 52 |
53 | 54 |
55 | 56 | Colocaremos la siguiente información: 57 | 58 |
59 | 60 |
61 | 62 |
63 | 64 |
65 | 66 |
67 | 68 |
69 | 70 |
71 | 72 |
73 | 74 |
75 | 76 |
77 | 78 |
79 | 80 |
81 | 82 |
83 | 84 |
85 | 86 |
87 | 88 |
89 | 90 | Ahora le damos click en "Start Build" 91 | 92 |
93 | 94 |
95 | 96 | Observamos que el build presenta un error, es por que el rol que utiliza codebuild no tiene permisos para hacer push en AWS ECR 97 | 98 |
99 | 100 |
101 | 102 | 3 Vamos a crear nuestro repositorio en AWS ECR 103 | 104 |
105 | 106 |
107 | 108 |
109 | 110 |
111 | 112 | A continuación vamos a agregar permisos al rol de AWS CodeBuild para que pueda realizar el push a ECR. 113 | 114 | Vamos a nuestro proyecto en Codebuild y vamos a la pestaña "Proyect details" y nos vamos al apartado "Environment" y le damos click en "Service Role" 115 | 116 |
117 | 118 |
119 | 120 |
121 | 122 |
123 | 124 | Vamos a darle click en "Attach policies" 125 | 126 |
127 | 128 |
129 | 130 | Vamos a filtrar el permiso "AmazonEC2ContainerRegistryFullAccess", lo seleccionamos y le damos click en "Add permission" 131 | 132 |
133 | 134 |
135 | 136 | Regresamos al proyecto en CodeBuild y le damos en "Start build" 137 | 138 |
139 | 140 |
141 | 142 | El build falla, debido a que nos falta configurar la variable de entorno AWS_ACCOUNT_ID 143 | 144 |
145 | 146 |
147 | 148 | Vamos a agregar la variable de entorno 149 | 150 |
151 | 152 |
153 | 154 | Colocamos AWS_ACCOUNT_ID y en el valor colocamos el numero de nuestra cuenta, luego le damos "Update Environment" 155 | 156 |
157 | 158 |
159 | 160 | Le volvemos a dar a "Star build" y vemos que ahora el build se realizo con éxito 161 | 162 |
163 | 164 |
165 | 166 | Nuestra imagen Docker debe aparecer en AWS ECR 167 | 168 |
169 | 170 |
171 | 172 | 4 Vamos a automatizar la creación de imágenes cada vez que se haga un push en master, para ello vamos al servicio de AWS CodePipeline y le damos click en "Create pipeline" 173 | 174 |
175 | 176 |
177 | 178 |
179 | 180 |
181 | 182 |
183 | 184 |
185 | 186 |
187 | 188 |
189 | 190 |
191 | 192 |
193 | 194 |
195 | 196 |
197 | 198 |
199 | 200 |
201 | 202 |
203 | 204 |
205 | 206 | Despues de crear el pipeline, este se va ejecutar automáticamente y vemos que se ha generado una nueva imagen docker automáticamente 207 | 208 |
209 | 210 |
211 | 212 | Cada vez que realicemos un push a la rama main se va a ejecutar el pipeline y va a generar una nueva imagen Docker en AWS ECR 213 | 214 | 5 Debemos eliminar los recursos creados en 215 | 216 | - AWS ECR 217 | - AWS Codepipeline 218 | - AWS Codebuild 219 | - AWS CodeCommit 220 | -------------------------------------------------------------------------------- /13 - Procesamiento de datos.md: -------------------------------------------------------------------------------- 1 | # Procesamiento de datos 2 | 3 | 1 Vamos a crear un repositorio de contenedores en AWS ECR 4 | 5 |
6 | 7 |
8 | 9 |
10 | 11 |
12 | 13 |
14 | 15 |
16 | 17 | 18 | 2 Vamos a clonar el repositorio de GitHub en nuestro ambiente en Cloud9 19 | 20 | ```sh 21 | $ git clone https://github.com/MaxCloud101/curso-docker.git 22 | ``` 23 |
24 | 25 |
26 | 27 | A continuación nos digimos a la carpeta "processapp", construimos la imagen Docker y la subimos a ECR (Reemplazamos XXXXXXXXXXX por nuestro numero de cuenta) 28 | 29 | ```sh 30 | $ cd curso-docker/processapp/ 31 | $ aws ecr get-login-password --region us-west-2 | docker login --username AWS --password-stdin XXXXXXXXXXX.dkr.ecr.us-west-2.amazonaws.com 32 | $ docker build -t procesapp . 33 | $ docker tag procesapp:latest XXXXXXXXXXX.dkr.ecr.us-west-2.amazonaws.com/procesapp:latest 34 | $ docker push XXXXXXXXXXX.dkr.ecr.us-west-2.amazonaws.com/procesapp:latest 35 | ``` 36 | 37 |
38 | 39 |
40 | 41 | Si realizamos los pasos correctamente, se mostrara la imagen en nuestro repositorio 42 | 43 |
44 | 45 |
46 | 47 | 3 Configuracion de la red 48 | 49 | Nosotros vamos a lanzar contenedores en AWS batch, estos contenedores no van a tener una IP publica, solo tendrán una IP privada, por ello no podrán conectarse a diferentes APIs mediante HTTPS, para que los paquetes de red que salgan hacia internet y puedan tener una IP publica vamos a colocar los contenedores en una subnet privada, luego dejaremos que los paquetes salgan por un NAT gateway localizado en una subnet publica, estos paquetes ahora contendrán la IP publica del NAT Gateway y podrán ser dirigidos hacia internet 50 | 51 | Actualmente en mi cuenta tengo la red con el CIDR: 172.31.0.0/16, con las siguientes subnets publicas 52 | 53 | 172.31.0.0/20 54 | 172.31.16.0/20 55 | 172.31.32.0/20 56 | 172.31.48.0/20 57 | 58 | a continuación voy a agregar el siguiente segmento de red, que sera privada 59 | 60 | 172.31.64.0/20 61 | 62 | Vamos al servicio de VPC, luego vamos al apartado de subnets, y le damos click en "Create Subnet" y llenamos los campos requeridos 63 | 64 |
65 | 66 |
67 | 68 | A continuación vamos a la sección NAT Gateway, llenamos la información necesaria y le damos click en "Create NAT Gateway" (debes darle click en Allocate Elastic IP, también debes seleccionar cualquier subnet publica, no la que nosotros creamos) 69 | 70 |
71 | 72 |
73 | 74 | Luego vamos a la pestaña "Route Table" y le damos click en "Create route Table" 75 | 76 |
77 | 78 |
79 | 80 | En la route table creada vamos a darle click en "Edit Routes" y agregamos la ruta al Nat Gateway 81 | 82 |
83 | 84 |
85 | 86 | Luego vamos a la pestaña "Subnet associations" y agregamos la route table a la subnet private, finalmente debería quedar como se muestra en la imagen 87 | 88 |
89 | 90 |
91 | 92 | Si se configuro correctamente todos los recursos lanzados en la subnet privada ahora tendrán acceso a internet 93 | 94 | 4 Para crear el cluster de Fargate nos vamos al servicio de AWS Batch, luego a la pestaña de "Compute Environments" y le damos click en "Create" 95 | 96 |
97 | 98 |
99 | 100 |
101 | 102 |
103 | 104 | En la siguiente pestaña no olvides solamente seleccionar la subnet privada que acabamos de crear (Esto para que los contenedores solo se lancen en la subnet privada) 105 | 106 |
107 | 108 |
109 | 110 | Vamos a la ultima pantalla de Review y le damos click en "Create" 111 | 112 | 5 Vamos al servicio de S3 y le damos click en "Create Bucket", aquí colocamos el nombre del bucket y le damos click en "Create Bucket" 113 | 114 |
115 | 116 |
117 | 118 | Luego entramos al Bucket y en la pestaña "properties" en la sección Amazon EventBridge le damos click en "Edit" y le damos a "On" 119 | 120 |
121 | 122 |
123 | 124 | 6 A continuación vamos a configurar nuestro Job con AWS Batch, para ello vamos a ir a AWS IAM, aquí vamos a revisar que exista el role ecsTaskExecutionRole, si no existe lo creamos y verificamos que tenga los siguientes permisos atachados: 125 | 126 |
127 | 128 |
129 | 130 | Luego vamos a crear un IAM Role, vamos a darle click en el menú lateral Roles y luego a "Create Role", vamos a rellenar la información como se muestra en la imagen 131 | 132 |
133 | 134 |
135 | 136 | En la siguiente pestaña vamos a agregar los permisos 137 | 138 | AmazonDynamoDBFullAccess 139 | AmazonS3FullAccess 140 | 141 | En la siguiente pestaña solo vamos a colocar el nombre y vamos a darle click en "Create Role" 142 | 143 |
144 | 145 |
146 | 147 | Ahora nos dirigimos al servicio de AWS Batch, le damos click en "Job definitions" luego le damos click en "Create" y llenamos la siguiente información: 148 | 149 |
150 | 151 |
152 | 153 |
154 | 155 |
156 | 157 | En la siguiente pestaña vamos a configurar: 158 | 159 |
160 | 161 |
162 | 163 |
164 | 165 |
166 | 167 | En la siguiente pestaña no colocamos nada y le damos click en "Next". 168 | 169 | En la pestaña de "Job definition review" le damos click en "Create job definition" 170 | 171 | Ahora vamos a crear una cola, para ello vamos a al menú lateral en el apartado "Job queues" y le damos click en "Create", colocamos la siguiente información: 172 | 173 |
174 | 175 |
176 | 177 | Luego le damos click en "Create job queue" 178 | 179 | 7 Ahora vamos a crear la maquina de estados en "Step function". Para ello vamos al servicio de Step Functions y le damos click en "Create state machine", seleccionamos una plantilla en blanco, vamos a configurar la siguiente información 180 | 181 |
182 | 183 |
184 | 185 |
186 | 187 |
188 | 189 |
190 | 191 |
192 | 193 | ```sh 194 | { 195 | "Environment": [ 196 | { 197 | "Name": "S3_KEY", 198 | "Value.$": "$.detail.object.key" 199 | }, 200 | { 201 | "Name": "S3_BUCKET", 202 | "Value.$": "$.detail.bucket.name" 203 | } 204 | ] 205 | } 206 | ``` 207 | 208 |
209 | 210 |
211 | 212 | Finalmente le damos click en "Create", nos va a pedir agregar algunos permisos los aceptamos y continuamos 213 | 214 | 8 Vamos a conectar los eventos en Amazon EventBridge, vamos a la pestaña rules y le damos click en "Create Rule" 215 | 216 |
217 | 218 |
219 | 220 |
221 | 222 |
223 | 224 |
225 | 226 |
227 | 228 |
229 | 230 |
231 | 232 |
233 | 234 |
235 | 236 |
237 | 238 |
239 | 240 | Finalmente le damos click en Next y en el ultimo paso le damos click en "Create Rule" 241 | 242 | 9 Creamos nuestra tabla en DynamoDB 243 | 244 |
245 | 246 |
247 | 248 | 10 Para probar toda la ejecución de nuestro pipeline vamos a subir el archivo 2023-12-01.csv que se encuentra en nuestro repositorio al bucket en S3 y vemos que la maquina de estados se empieza a ejecutar 249 | 250 |
251 | 252 |
253 | 254 |
255 | 256 |
257 | 258 |
259 | 260 |
261 | 262 | Si todo se realzó con éxito vamos a ver el paso de la maquina de estados en verde y la información en DynamoDB 263 | 264 |
265 | 266 |
267 | 268 |
269 | 270 |
271 | 272 | 11 Finalmente no olvides eliminar los siguiente recursos 273 | 274 | 1 Tabla en DynamoDB 275 | 276 | 2 Regla en Amazon EventBridge 277 | 278 | 3 Maquina de estados en Step Function 279 | 280 | 4 En AWS Batch primero debes deshabilitar la cola y luego eliminar 281 | 282 | 5 En Job definitions no se puede eliminar la definición del job, solo se puede "Deregister 283 | 284 | 6 Eliminar el el repositio en AWS ECR 285 | 286 | 7 Eliminar el nat Gateway 287 | 288 | 8 Una vez se elimine el Nat Gateway vamos a Elastic Ip debes seleccionar el recurso creado y darle "Release Elastic IP addresses" 289 | 290 | 9 Eliminar la subnet privada que habíamos creado 291 | 292 | 10 Eliminar la route table 293 | -------------------------------------------------------------------------------- /2 - Trabajando con docker.md: -------------------------------------------------------------------------------- 1 | # Trabajando con Docker 2 | 3 | ## 1 Información de Docker 4 | 5 | Se pueden utilizar los siguientes subcomandos para obtener más información sobre la instalación y el uso de Docker: 6 | 7 | #### Docker info 8 | 9 | Imprime información sobre el sistema Docker y el host. 10 | 11 | ```sh 12 | $ docker info 13 | ``` 14 | 15 | #### Docker help 16 | 17 | Imprime información de uso y ayuda para el subcomando dado. 18 | 19 | ```sh 20 | $ docker help 21 | ``` 22 | #### Docker version 23 | 24 | Imprime información de la versión de Docker para el cliente y el servidor, así como la versión de Go utilizada en la compilación. 25 | 26 | ```sh 27 | $ docker version 28 | ``` 29 | 30 | ## 2 Comandos útiles en linux 31 | 32 | #### ls 33 | 34 | Te permite listar el contenido del directorio que desea (el directorio actual de forma predeterminada), incluidos archivos y otros directorios anidados. 35 | 36 | ```sh 37 | $ ls 38 | ``` 39 | 40 | #### pwd 41 | 42 | El comando pwd significa "Print Working Directory" y genera la ruta absoluta del directorio en el que se encuentra. 43 | 44 | ```sh 45 | $ pwd 46 | ``` 47 | #### cd 48 | 49 | El comando cd se refiere a "Change Directory", como su nombre indica, lo lleva al directorio al que está intentando acceder. 50 | 51 | ```sh 52 | $ cd path/to/go 53 | ``` 54 | 55 | ejemplo: 56 | 57 | ```sh 58 | $ cd /home/Max/Documents/ 59 | ``` 60 | 61 | Para ir al directorio home 62 | 63 | ```sh 64 | $ cd 65 | ``` 66 | 67 | Para ir un nivel atras 68 | 69 | ```sh 70 | $ cd .. 71 | ``` 72 | 73 | #### touch 74 | 75 | El comando touch te permite crear un archivo 76 | 77 | ```sh 78 | $ touch new_file.txt 79 | ``` 80 | 81 | #### mkdir 82 | 83 | El comando mkdir se refiere a "Make Directory", como su nombre indica, crea un nuevo directorio. 84 | 85 | ```sh 86 | $ mkdir directory_name 87 | ``` 88 | 89 | Para crear directorios de manera recursiva, usaremos el comando de la siguiente manera: 90 | 91 | ```sh 92 | $ mkdir -p directory_name/sub_folder/sub_sub_folder 93 | ``` 94 | 95 | #### cp 96 | 97 | El comando cp te permite copiar archivos y carpetas desde la terminal 98 | 99 | Para copiar un archivo debes utilizar el comando cp de la siguiente forma 100 | 101 | ```sh 102 | $ cp file_to_copy.txt new_file.txt 103 | ``` 104 | 105 | Para copiar una carpeta debes utilizar el comando cp de la siguiente forma 106 | 107 | ```sh 108 | $ cp -r dir_to_copy/ new_copy_dir/ 109 | ``` 110 | 111 | #### rm 112 | 113 | El comando rm te permitira eliminar archivos y carpetas desde el terminal 114 | 115 | Para eliminar un archivo debes utilizar el comando rm de la siguiente forma 116 | 117 | ```sh 118 | $ rm file_to_copy.txt 119 | ``` 120 | 121 | Para eliminar una carpeta debes utilizar el comando rm de la siguiente forma 122 | 123 | ```sh 124 | rm -r dir_to_remove/ 125 | ``` 126 | 127 | #### echo 128 | 129 | El comando echo muestra texto definido en la terminal 130 | 131 | ```sh 132 | echo "Hola Mundo" 133 | ``` 134 | 135 | Se utiliza usualmente para imprimir ambientales de entorno dentro de estos mensajes: 136 | 137 | ```sh 138 | echo "Hey $USER" 139 | ``` 140 | 141 | #### cat 142 | 143 | Cat de la palabra "Concatenate", te permite crear, ver y concatenar archivos directamente desde la terminal. Se utiliza principalmente para obtener una vista previa de un archivo sin abrir un editor de texto gráfico: 144 | 145 | ```sh 146 | cat long_text_file.txt 147 | ``` 148 | 149 | #### ping 150 | 151 | Ping es la utilidad de terminal de red más popular que se utiliza para probar la conectividad de la red. 152 | 153 | ```sh 154 | ping google.com 155 | ``` 156 | 157 | #### curl 158 | 159 | Curl es la abreviatura de Client URL. Los comandos de cURL están diseñados para funcionar como una forma de verificar la conectividad a las URL y como una herramienta para transferir datos. 160 | 161 | ```sh 162 | curl http-web-page 163 | ``` 164 | 165 | Rápidamente puedes obtener tu ip pública con el siguiente comando 166 | 167 | ```sh 168 | curl http://checkip.amazonaws.com 169 | ``` 170 | -------------------------------------------------------------------------------- /3 - Trabajando con imagenes.md: -------------------------------------------------------------------------------- 1 | # Trabajando con imágenes 2 | 3 | Una imagen de Docker es una plantilla de solo lectura que define al contenedor. La imagen contiene el código que se ejecutará, incluida cualquier definición para cualquier biblioteca o dependencia que el código necesite. 4 | 5 | ## 1 Principales comandos 6 | 7 | Para poder trabajar con las imágenes utilizaremos el comando docker de la siguiente forma "docker image [comando]" 8 | 9 | #### docker image pull 10 | 11 | Permite descargar una imagen de un registro 12 | 13 | ```sh 14 | $ docker image pull NAME[:TAG] 15 | ``` 16 | 17 | El siguiente comando es equivalente 18 | 19 | ```sh 20 | $ docker pull NAME[:TAG|@DIGEST] 21 | ``` 22 | 23 | Ejemplo de uso: 24 | 25 | Deseamos descargar la imagen oficial de python, para ello nos dirigimos a docker hub en la siguiente url https://hub.docker.com/_/python 26 | 27 | Si deseamos descargar la imagen de python con la etiqueta 3.12.1 lanzamos el siguiente comando: 28 | 29 | ```sh 30 | $ docker pull python:3.12.1 31 | ``` 32 | 33 | También podemos hacerlo mediante el digesto 34 | 35 | ```sh 36 | $ docker pull python@sha256:a3d69b8412f7068fd060ccc7e175825713d5a767e1e14753e75bce6f746c8a7e 37 | ``` 38 | 39 | #### docker image push 40 | 41 | Este comando permite subir las imágenes en el registro de Docker Hub o AWS ECR. 42 | 43 | ```sh 44 | $ docker image push [OPTIONS] NAME[:TAG] 45 | ``` 46 | 47 | En secciones posteriores de este curso cubriremos con mas detalle este comando 48 | 49 | #### docker image inspect 50 | 51 | Muestra información detallada sobre una o más imágenes. 52 | 53 | ```sh 54 | $ docker image inspect [IMAGE...] 55 | ``` 56 | 57 | #### docker image ls 58 | 59 | Este comando mostrará todas las imágenes de nivel superior, su repositorio, etiquetas y su tamaño. 60 | 61 | ```sh 62 | $ docker image ls 63 | ``` 64 | 65 | Para ver los digestos lanzaremos el siguiente comando 66 | 67 | ```sh 68 | $ docker image ls --digests 69 | ``` 70 | 71 | Para ver todas las imágenes incluyendo las capas intermedias usaremos 72 | 73 | ```sh 74 | $ docker image ls --all 75 | ``` 76 | 77 | #### docker rm 78 | 79 | Para eliminar una o mas imágenes corremos el comando 80 | 81 | ```sh 82 | $ docker image rm [IMAGE...] 83 | ``` 84 | -------------------------------------------------------------------------------- /4 - Trabajando con contenedores.md: -------------------------------------------------------------------------------- 1 | # Trabajando con contenedores 2 | 3 | Un contenedor de Docker es un contenedor ejecutable, independiente, ligero que integra todo lo necesario para ejecutar una aplicación, incluidas bibliotecas, herramientas del sistema, código y runtime. 4 | 5 | ## 1 Principales comandos 6 | 7 | #### Hello world en docker 8 | Vamos a ejecutar el clasico "hello world" en docker con el siguiente comando 9 | 10 | ```sh 11 | $ docker run busybox echo hello world 12 | ``` 13 | 14 | veremos un resultado similar al mostrado en la siguiente imagen 15 | 16 |

17 | 18 |

19 | 20 | A continuacion vamos a explicar cada uno de los sucesos 21 | 22 | 1 Aqui Docker intenta buscar la imagen busybox en su repositorio local 23 | 24 | 2 Como no encontro la imagen la empieza a descargar 25 | 26 | 3 Ejecuta el comando enviado al contenedor "echo hello world" 27 | 28 | ##### docker container ls 29 | 30 | Lista los contenedores 31 | 32 | ```sh 33 | $ docker container ls [OPTIONS] 34 | ``` 35 | 36 | Los comandos equivalente son los siguientes 37 | 38 | ```sh 39 | $ docker container list 40 | $ docker container ps 41 | $ docker ps 42 | ``` 43 | 44 | Importante! El comando nos mostrara los contenedores en estado RUNNING, pero si queremos ver todos los contenedores debemos agregar cualquiera de las siguientes banderas 45 | 46 | ```sh 47 | $ docker ps -a 48 | $ docker ps --all 49 | ``` 50 | 51 | ##### docker container run 52 | 53 | El comando docker run ejecuta un comando en un nuevo contenedor, descargando la imagen si es necesario y arrancando el contenedor. 54 | 55 | ```sh 56 | $ docker container run [OPTIONS] IMAGE [COMMAND] [ARG...] 57 | ``` 58 | 59 | El comando equivalente es el siguiente 60 | 61 | ```sh 62 | $ docker run [OPTIONS] IMAGE [COMMAND] [ARG...] 63 | ``` 64 | 65 | ##### docker container run (Ejemplo) 66 | 67 | A continuación vamos a correr el servidor nginx paso a paso revisando cada uno de las opciones disponibles junto al comando run para dejar corriendo nuestro servidor. 68 | 69 | 1 Vamos a arrancar nuestro contenedor nginx 70 | 71 | ```sh 72 | $ docker run nginx 73 | ``` 74 | 75 | Vamos a ver que nuestro shell se quedara atachado a los logs del contenedor 76 | 77 |

78 | 79 |

80 | Para detener el contenedor presionamos "ctrl + C" 81 | 82 | 2 Para obtener una respuesta de nustro servidor vamos a enlazarlo a un puerto, para ello lanzamos el siguiente comando 83 | 84 | ```sh 85 | $ docker run -p 8080:80 nginx 86 | ``` 87 | 88 | Con la bandera -p asignamos un puerto del host al puerto del contenedor (-p host_port:container_port) 89 | 90 | Para realizar una petición http al servidor dentro del contenedor vamos a lanzar el siguiente comando desde una consola diferente a la que se encuentra corriendo el contenedor (también podríamos hacer la petición desde nuestro navegador web) 91 | 92 | ```sh 93 | $ curl localhost:8080 94 | ``` 95 | 96 | En la siguiente imagen correspondiente a los logs del contenedor, vemos en la ultima linea que el servidor nginx recibió la petición y retorno la respuesta 97 | 98 |

99 | 100 |

101 | 102 | Por otro lado en la pestaña donde hicimos curl, verificamos que la respuesta fue el html de bienvenida de nginx 103 | 104 |

105 | 106 |

107 | 108 | 4 Para correr el servidor nginx como demonio y que no se nos quede atachado a la consola vamos a utilizar la bandera "-d" (d por la palabra DETACHED) 109 | 110 | ```sh 111 | $ docker run -p 8080:80 -d nginx 112 | ``` 113 | 114 | vamos a ver que el contenedor empieza a correr desatachado de la consola 115 | 116 |

117 | 118 |

119 | 120 | 5 Para agregar un nombre a nuestro contenedor vamos lanzar el siguiente comando 121 | 122 | ```sh 123 | $ docker run --name mynginx -p 8081:80 -d nginx 124 | ``` 125 | 126 | ##### docker container stop 127 | 128 | Envia una señal al contenedor o contenedores para detener su ejecucion 129 | 130 | ```sh 131 | $ docker container stop [CONTAINER...] 132 | ``` 133 | El comando equivalente es el siguiente 134 | 135 | ```sh 136 | $ docker stop [CONTAINER...] 137 | ``` 138 | 139 | 140 | ##### docker container rm 141 | 142 | Elimina uno o más contenedores. Para poder utilizar este comando el contenedor debe estar detenido. No se podra eliminar contenedores en estado RUNNING 143 | 144 | ```sh 145 | $ docker container rm [CONTAINER...] 146 | ``` 147 | 148 | El comando equivalente es el siguiente 149 | 150 | ```sh 151 | $ docker container remove [CONTAINER...] 152 | $ docker rm [CONTAINER...] 153 | ``` 154 | 155 | ##### docker container exec 156 | 157 | El comando docker exec ejecuta un nuevo comando en un contenedor en ejecución. 158 | 159 | El comando que especifica con Docker Exec solo se ejecuta mientras se ejecuta el proceso principal del contenedor (PID 1) y no se reinicia si se reinicia el contenedor. 160 | 161 | ```sh 162 | $ docker container exec CONTAINER COMMAND 163 | ``` 164 | El comando equivalente es el siguiente 165 | 166 | ```sh 167 | $ docker exec CONTAINER COMMAND 168 | ``` 169 | 170 | Ejemplo: 171 | 172 | Normalmente vamos a requerir acceder a un contenedor que se encuentra corriendo para revisar algunos archivos, para esto utilizaresmo el comando exec para ingresar al contenedor usando bash 173 | 174 | ```sh 175 | $ docker exec -it CONTAINER bash 176 | ``` 177 | 178 | ##### docker container logs 179 | 180 | El comando Docker Logs recupera por lotes los registros presentes en el momento de la ejecución. 181 | 182 | ```sh 183 | $ docker container logs CONTAINER 184 | ``` 185 | El comando equivalente es el siguiente 186 | 187 | ```sh 188 | $ docker logs CONTAINER 189 | ``` 190 | 191 | Si deseas ver los logs en tiempo real, debe lanzar el siguiente comando 192 | 193 | ```sh 194 | $ docker logs --follow CONTAINER 195 | ``` 196 | 197 | ##### docker container diff 198 | 199 | Muestra los archivos y directorios modificados en el sistema de archivos de un contenedor desde que se creó el contenedor. 200 | 201 | ```sh 202 | $ docker container diff CONTAINER 203 | ``` 204 | 205 | El comando equivalente es el siguiente 206 | 207 | ```sh 208 | $ docker diff CONTAINER 209 | ``` 210 | Muestra 3 estados 211 | 212 | - A: Added 213 | - D: Deleted 214 | - C: Changed 215 | -------------------------------------------------------------------------------- /5 - Trabajando con volumenes.md: -------------------------------------------------------------------------------- 1 | # Trabajando con volúmenes 2 | 3 | Los volúmenes son el mecanismo para conservar los datos generados y utilizados por los contenedores Docker. 4 | 5 | ## Comandos mas importantes 6 | 7 | #### docker volume create 8 | 9 | Crea un nuevo volumen en el que los contenedores pueden consumir y almacenar datos. Si no se especifica un nombre, Docker genera un nombre aleatorio. 10 | 11 | ```sh 12 | $ docker volume create [VOLUME] 13 | ``` 14 | 15 | #### docker volume ls 16 | 17 | Lista los volúmenes 18 | 19 | ```sh 20 | $ docker volume ls 21 | ``` 22 | 23 | #### docker volume rm 24 | 25 | Elimina uno o mas volúmenes 26 | 27 | ```sh 28 | $ docker volume rm [VOLUME...] 29 | ``` 30 | #### docker volume inspect 31 | 32 | Devuelve información sobre un volumen. 33 | 34 | ```sh 35 | $ docker volume inspect 36 | ``` 37 | 38 | ## Montando volumenes en contenedores 39 | 40 | #### Montamos un volumen en el contenedor 41 | Podemos montar un volumen mientras arrancamos un containers, si el volumen no se creo previamente este se crea, el formato usado sera "-v VOLUME_NAME:CONTAINER_PATH" 42 | 43 | ```sh 44 | docker run -v demo_volume:/app -p 8081:80 -d nginx 45 | ``` 46 | 47 | Podemos montar el mismo volumen en varios contenedores al mismo tiempo 48 | 49 | #### Montamos con una carpeta del host en el contenedor 50 | 51 | También podemos montar un volumen del contenedor y enlazarlo con una carpeta en el host, el formato usado sera "-v HOST_PATH:CONTAINER_PATH" 52 | 53 | ```sh 54 | docker run -v /home/ec2-user/environment/max:/app -p 8080:80 -d nginx 55 | ``` 56 | 57 | ## Eliminando todos los recursos creados 58 | 59 | Si deseas eliminar rapidamente todos los recursos creados (containers, networks, images), utilizaras el siguiente comando 60 | 61 | ```sh 62 | docker system prune -a 63 | ``` 64 | 65 | Si tambien quieres eliminar los volumenes, debes lanzar el siguiente comando 66 | 67 | ```sh 68 | docker system prune -a --volumes 69 | ``` 70 | -------------------------------------------------------------------------------- /6 - Copiando data.md: -------------------------------------------------------------------------------- 1 | # Copiando data 2 | 3 | Para poder copiar data entre el host y los contenedores usaremos el comando copy 4 | 5 | #### docker cp 6 | 7 | El comando cp te permitira copiar archivos, para ello usaremos el siguiente comando 8 | 9 | ```sh 10 | docker cp CONTAINER:SRC_PATH DEST_PATH 11 | docker cp SRC_PATH CONTAINER:DEST_PATH 12 | ``` 13 | -------------------------------------------------------------------------------- /7 - Enlazando contenedores.md: -------------------------------------------------------------------------------- 1 | # Enlazando contenedores 2 | 3 | Cuando trabajas con contenedores muchas veces vas a querer que exista una comunicación entre estos, para esto se utiliza el comando run mas la bandera --link 4 | 5 | #### docker run --link 6 | 7 | A continuación se va mostrar un ejemplo del uso de la bandera link para poder enlazar dos contenedores 8 | 9 | 1 Vamos a lanzar un contenedor corriendo redis 10 | 11 | ```sh 12 | docker run -d --name myredis redis 13 | ``` 14 | 15 | 2 Vamos a lanzar otro contenedor redis pero que utilize el redis-cli para poder contectarse al primero. 16 | 17 | ```sh 18 | docker run -it --link myredis redis redis-cli -h myredis 19 | ``` 20 | 21 | Para enlazar el segundo contenedor con el primero vamos a utilizar la bandera --link y luego colocar el nombre del primer contenedor "myredis". 22 | Despues de colocar la imagen redis, vamos a colocar el comando "redis-cli -h myredis" donde le decimos al contenedor que utilize el redis-cli y se contecte al host (-h) "myredis" 23 | 24 | Una vez iniciado el container vamos a lanzar los comandos mostrados en la imagen para interactuar con redis 25 | 26 |

27 | 28 |

29 | -------------------------------------------------------------------------------- /8 - Contruyendo el Dockerfile.md: -------------------------------------------------------------------------------- 1 | # Contruyendo el Dockerfile 2 | 3 | Un Dockerfile es un archivo o documento de texto simple que incluye una serie de instrucciones que se necesitan ejecutar de manera consecutiva para cumplir con los procesos necesarios para la creación de una nueva imagen. 4 | 5 | ## 1 Estructura 6 | 7 | El dockerfile puede contener los siguinetes elementos: 8 | 9 | FROM: Permite especificar la imagen base. 10 | 11 | MAINTAINER: Especifique el autor de una imagen. 12 | 13 | RUN: Ejecute comandos de compilación 14 | 15 | WORKDIR: Cambiar directorio de trabajo. 16 | 17 | COPY: Copiar archivos y directorios. 18 | 19 | ADD: Agregue archivos y directorios locales o remotos. 20 | 21 | EXPOSE: Describe en qué puertos escucha tu aplicación. 22 | 23 | VOLUME: Crea un volumen para montar. 24 | 25 | ENV: Establece variables de entorno. 26 | 27 | ARG: Utilice variables de tiempo de construcción. 28 | 29 | ENTRYPOINT: Especifica el ejecutable predeterminado. 30 | 31 | CMD: Especifique comandos predeterminados. 32 | 33 | ## 2 Ejemplo 34 | 35 | Vamos a posicionarnos en la carpeta flaskapp dentro de este repositorio. Luego vamos a lanzar el siguiente comando para empezar la construccion del contenedor 36 | 37 | ```sh 38 | $ docker build -t myapp . 39 | ``` 40 | 41 | Una vez que el build fue exitoso, vamos a lanzar el contenedor 42 | 43 | ```sh 44 | $ docker run -p 8000:8000 myapp 45 | ``` 46 | -------------------------------------------------------------------------------- /9 - Llevando el contenedor al registro.md: -------------------------------------------------------------------------------- 1 | # Llevando nuestro contenedor al registro 2 | 3 | ## Trabajando con DockerHub 4 | 5 | 1 Vamos a hacer login en: https://hub.docker.com/ 6 | 7 | 2 Luego vamos a crear un repositorio 8 | 9 |

10 | 11 |

12 | 13 | 3 Vamos a colocar el nombre myapp 14 | 15 |

16 | 17 |

18 | 19 | 4 Ahora vamos a hacer login desde nuestra maquina donde tenemos el cliente de docker corriendo 20 | 21 | ```sh 22 | docker login 23 | ``` 24 | Colocamos nuestro id de dockerhub y nuestra contraseña. 25 | 26 | 5 Vamos a colocarnos en el proyecto flaskapp y vamos a lanzar el siguiente comando 27 | 28 | ```sh 29 | docker build -t myapp . 30 | ``` 31 | 32 | Luego tenemos que colocar el nombre del repositorio y la etiqueta correspondiente 33 | 34 | ```sh 35 | docker tag myapp maxcloud101/myapp:1 36 | ``` 37 | 38 | Finalmente realizamos el push al registro 39 | 40 | ```sh 41 | docker push maxcloud101/myapp:1 42 | ``` 43 | 44 | ## Trabajando con ECR 45 | 46 | 1 Vamos al servicio de AWS ECR y vamos a crear un repositorio 47 | 48 |

49 | 50 |

51 | 52 | 2 Vamos a colocar el nombre y le damos click en "create" 53 | 54 |

55 | 56 |

57 | 58 | 3 Entramos al repositorio y le damos click en "View push commands" 59 | 60 |

61 | 62 |

63 | 64 | 4 Vamos a seguir cada una de las instrucciones para subir nuestro contenedor 65 | 66 |

67 | 68 |

69 | 70 | 5 Si todo se realizo correctamente, vamos a ver la siguiente pantalla 71 | 72 |

73 | 74 |

75 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Curso de Docker 2 | 3 | Bienvenido al curso de Docker, a travez de las siguiente 14 lecciones vas a aprender a crear contenedores y saber como llevarlos a produccion 4 | 5 | 6 | 7 | 1 - Introduccion 8 | 9 | 2 - Trabajando con docker 10 | 11 | 3 - Trabajando con imagenes 12 | 13 | 4 - Trabajando con contenedores 14 | 15 | 5 - Trabajando con volumenes 16 | 17 | 6 - Copiando data 18 | 19 | 7 - Enlazando contenedores 20 | 21 | 8 - Contruyendo el Dockerfile 22 | 23 | 9 - Llevando el contenedor al registro 24 | 25 | 10 - Ejemplos practicos 26 | 27 | 11 - Cicd-taller-1 28 | 29 | 12 - Cicd-taller-2 30 | 31 | 13 - Procesamiento de datos 32 | 33 | 14 - Contenedores para machine learning 34 | 35 | Muchas gracias! -------------------------------------------------------------------------------- /buildspec.yml: -------------------------------------------------------------------------------- 1 | version: 0.2 2 | 3 | phases: 4 | install: 5 | commands: 6 | - sudo apt update 7 | - sudo apt install software-properties-common -y 8 | - sudo add-apt-repository ppa:deadsnakes/ppa 9 | - sudo apt install Python3.10 10 | pre_build: 11 | commands: 12 | - python3 flaskapp/test.py 13 | build: 14 | commands: 15 | - echo $CODEBUILD_BUILD_NUMBER 16 | - echo $AWS_ACCOUNT_ID 17 | - echo $AWS_DEFAULT_REGION 18 | - aws ecr get-login-password --region $AWS_DEFAULT_REGION | docker login --username AWS --password-stdin $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com 19 | - rm -r flaskapp/__pycache__ 20 | - cp flaskapp/* . 21 | - docker build -t myapp . 22 | - docker tag myapp:latest $AWS_ACCOUNT_ID.dkr.ecr.us-west-2.amazonaws.com/myapp:$CODEBUILD_BUILD_NUMBER 23 | post_build: 24 | commands: 25 | - docker push $AWS_ACCOUNT_ID.dkr.ecr.us-west-2.amazonaws.com/myapp:$CODEBUILD_BUILD_NUMBER -------------------------------------------------------------------------------- /files/2023-12-01.csv: -------------------------------------------------------------------------------- 1 | user_id,item,price 2 | 1,5,10 3 | 1,6,8 4 | 1,5,10 5 | 2,5,10 6 | -------------------------------------------------------------------------------- /flaskapp/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM python:3.10.13 2 | 3 | RUN apt-get update && apt install curl 4 | 5 | WORKDIR /app 6 | 7 | COPY . . 8 | 9 | RUN pip install -r requirements.txt 10 | 11 | ENV SERVER_ENV=development 12 | 13 | EXPOSE 8000 14 | 15 | RUN chmod +x entrypoint.sh 16 | ENTRYPOINT ["./entrypoint.sh"] 17 | CMD ["python3", "main.py" ] -------------------------------------------------------------------------------- /flaskapp/entrypoint.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | echo "Starting my application..." 3 | 4 | if [ $SERVER_ENV = 'production' ]; then 5 | echo "RUNNING: production mode" 6 | else 7 | echo "RUNNING: development mode" 8 | fi; 9 | 10 | exec "$@" -------------------------------------------------------------------------------- /flaskapp/main.py: -------------------------------------------------------------------------------- 1 | from flask import Flask, request 2 | from flask import json 3 | from utils import welcome_message 4 | 5 | app = Flask(__name__) 6 | 7 | @app.route("/") 8 | def hello_world(): 9 | return welcome_message() 10 | 11 | if __name__ == '__main__': 12 | app.run(host='0.0.0.0', port=8000, debug=True) -------------------------------------------------------------------------------- /flaskapp/requirements.txt: -------------------------------------------------------------------------------- 1 | Flask==3.0.0 -------------------------------------------------------------------------------- /flaskapp/test.py: -------------------------------------------------------------------------------- 1 | import unittest 2 | from utils import welcome_message 3 | 4 | class TestStringMethods(unittest.TestCase): 5 | 6 | def test_upper(self): 7 | self.assertEqual('foo'.upper(), 'FOO') 8 | 9 | def test_welcome_message(self): 10 | self.assertEqual(welcome_message(), "

Hello, World!

") 11 | 12 | if __name__ == '__main__': 13 | unittest.main() -------------------------------------------------------------------------------- /flaskapp/utils.py: -------------------------------------------------------------------------------- 1 | def welcome_message(): 2 | return "

Hello, World!

" -------------------------------------------------------------------------------- /img/README.md: -------------------------------------------------------------------------------- 1 | images 2 | -------------------------------------------------------------------------------- /img/circleci-complete-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/circleci-complete-2.png -------------------------------------------------------------------------------- /img/circleci-complete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/circleci-complete.png -------------------------------------------------------------------------------- /img/circleci-config-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/circleci-config-1.png -------------------------------------------------------------------------------- /img/circleci-config-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/circleci-config-2.png -------------------------------------------------------------------------------- /img/circleci-config-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/circleci-config-3.png -------------------------------------------------------------------------------- /img/circleci-config-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/circleci-config-4.png -------------------------------------------------------------------------------- /img/circleci-config-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/circleci-config-5.png -------------------------------------------------------------------------------- /img/circleci1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/circleci1.png -------------------------------------------------------------------------------- /img/circleci2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/circleci2.png -------------------------------------------------------------------------------- /img/circleci3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/circleci3.png -------------------------------------------------------------------------------- /img/circleci4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/circleci4.png -------------------------------------------------------------------------------- /img/circleci5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/circleci5.png -------------------------------------------------------------------------------- /img/circleci6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/circleci6.png -------------------------------------------------------------------------------- /img/circleci7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/circleci7.png -------------------------------------------------------------------------------- /img/circleci8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/circleci8.png -------------------------------------------------------------------------------- /img/circlecifinal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/circlecifinal.png -------------------------------------------------------------------------------- /img/cloud9-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/cloud9-1.png -------------------------------------------------------------------------------- /img/cloud9-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/cloud9-2.png -------------------------------------------------------------------------------- /img/cloud9-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/cloud9-3.png -------------------------------------------------------------------------------- /img/cloud9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/cloud9.png -------------------------------------------------------------------------------- /img/codebuild1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/codebuild1.png -------------------------------------------------------------------------------- /img/codebuild10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/codebuild10.png -------------------------------------------------------------------------------- /img/codebuild11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/codebuild11.png -------------------------------------------------------------------------------- /img/codebuild12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/codebuild12.png -------------------------------------------------------------------------------- /img/codebuild13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/codebuild13.png -------------------------------------------------------------------------------- /img/codebuild14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/codebuild14.png -------------------------------------------------------------------------------- /img/codebuild15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/codebuild15.png -------------------------------------------------------------------------------- /img/codebuild16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/codebuild16.png -------------------------------------------------------------------------------- /img/codebuild17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/codebuild17.png -------------------------------------------------------------------------------- /img/codebuild18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/codebuild18.png -------------------------------------------------------------------------------- /img/codebuild2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/codebuild2.png -------------------------------------------------------------------------------- /img/codebuild3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/codebuild3.png -------------------------------------------------------------------------------- /img/codebuild4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/codebuild4.png -------------------------------------------------------------------------------- /img/codebuild5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/codebuild5.png -------------------------------------------------------------------------------- /img/codebuild6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/codebuild6.png -------------------------------------------------------------------------------- /img/codebuild7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/codebuild7.png -------------------------------------------------------------------------------- /img/codebuild8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/codebuild8.png -------------------------------------------------------------------------------- /img/codebuild9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/codebuild9.png -------------------------------------------------------------------------------- /img/codecommit1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/codecommit1.png -------------------------------------------------------------------------------- /img/codecommit2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/codecommit2.png -------------------------------------------------------------------------------- /img/codecommit3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/codecommit3.png -------------------------------------------------------------------------------- /img/codecommit4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/codecommit4.png -------------------------------------------------------------------------------- /img/codecommit5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/codecommit5.png -------------------------------------------------------------------------------- /img/codecommit6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/codecommit6.png -------------------------------------------------------------------------------- /img/codecommit7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/codecommit7.png -------------------------------------------------------------------------------- /img/codepipeline1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/codepipeline1.png -------------------------------------------------------------------------------- /img/codepipeline2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/codepipeline2.png -------------------------------------------------------------------------------- /img/codepipeline3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/codepipeline3.png -------------------------------------------------------------------------------- /img/codepipeline4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/codepipeline4.png -------------------------------------------------------------------------------- /img/codepipeline5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/codepipeline5.png -------------------------------------------------------------------------------- /img/codepipeline6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/codepipeline6.png -------------------------------------------------------------------------------- /img/codepipeline7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/codepipeline7.png -------------------------------------------------------------------------------- /img/codepipeline8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/codepipeline8.png -------------------------------------------------------------------------------- /img/docker-architecture.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/docker-architecture.webp -------------------------------------------------------------------------------- /img/dockerhub-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/dockerhub-1.png -------------------------------------------------------------------------------- /img/dockerhub-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/dockerhub-2.png -------------------------------------------------------------------------------- /img/dockerhub-final.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/dockerhub-final.png -------------------------------------------------------------------------------- /img/dockerhub1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/dockerhub1.png -------------------------------------------------------------------------------- /img/dockerhub2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/dockerhub2.png -------------------------------------------------------------------------------- /img/dynamo1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/dynamo1.png -------------------------------------------------------------------------------- /img/ecr-build.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/ecr-build.png -------------------------------------------------------------------------------- /img/ecr-new.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/ecr-new.png -------------------------------------------------------------------------------- /img/ecr-work-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/ecr-work-1.png -------------------------------------------------------------------------------- /img/ecr-work-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/ecr-work-2.png -------------------------------------------------------------------------------- /img/ecr1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/ecr1.png -------------------------------------------------------------------------------- /img/ecr2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/ecr2.png -------------------------------------------------------------------------------- /img/ecr3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/ecr3.png -------------------------------------------------------------------------------- /img/ecr4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/ecr4.png -------------------------------------------------------------------------------- /img/ecr5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/ecr5.png -------------------------------------------------------------------------------- /img/eventbridge1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/eventbridge1.png -------------------------------------------------------------------------------- /img/eventbridge2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/eventbridge2.png -------------------------------------------------------------------------------- /img/eventbridge3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/eventbridge3.png -------------------------------------------------------------------------------- /img/eventbridge4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/eventbridge4.png -------------------------------------------------------------------------------- /img/eventbridge5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/eventbridge5.png -------------------------------------------------------------------------------- /img/eventbridge6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/eventbridge6.png -------------------------------------------------------------------------------- /img/fork1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/fork1.png -------------------------------------------------------------------------------- /img/fork2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/fork2.png -------------------------------------------------------------------------------- /img/github-conf1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/github-conf1.png -------------------------------------------------------------------------------- /img/github-conf2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/github-conf2.png -------------------------------------------------------------------------------- /img/github-conf3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/github-conf3.png -------------------------------------------------------------------------------- /img/github-conf4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/github-conf4.png -------------------------------------------------------------------------------- /img/github-conf5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/github-conf5.png -------------------------------------------------------------------------------- /img/github-conf6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/github-conf6.png -------------------------------------------------------------------------------- /img/github-conf7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/github-conf7.png -------------------------------------------------------------------------------- /img/github-conf8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/github-conf8.png -------------------------------------------------------------------------------- /img/github-conf9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/github-conf9.png -------------------------------------------------------------------------------- /img/hello-world.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/hello-world.png -------------------------------------------------------------------------------- /img/nat-gateway.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/nat-gateway.png -------------------------------------------------------------------------------- /img/pa-batch1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/pa-batch1.png -------------------------------------------------------------------------------- /img/pa-batch2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/pa-batch2.png -------------------------------------------------------------------------------- /img/pa-batch3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/pa-batch3.png -------------------------------------------------------------------------------- /img/pa-batch4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/pa-batch4.png -------------------------------------------------------------------------------- /img/pa-batch5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/pa-batch5.png -------------------------------------------------------------------------------- /img/pa-cloud9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/pa-cloud9.png -------------------------------------------------------------------------------- /img/pa-dockerbuild.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/pa-dockerbuild.png -------------------------------------------------------------------------------- /img/pa-ecr1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/pa-ecr1.png -------------------------------------------------------------------------------- /img/pa-ecr2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/pa-ecr2.png -------------------------------------------------------------------------------- /img/pa-ecr3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/pa-ecr3.png -------------------------------------------------------------------------------- /img/pa-ecr4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/pa-ecr4.png -------------------------------------------------------------------------------- /img/pa-fargate1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/pa-fargate1.png -------------------------------------------------------------------------------- /img/pa-fargate2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/pa-fargate2.png -------------------------------------------------------------------------------- /img/pa-fargate3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/pa-fargate3.png -------------------------------------------------------------------------------- /img/pa-github1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/pa-github1.png -------------------------------------------------------------------------------- /img/pa-permissions1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/pa-permissions1.png -------------------------------------------------------------------------------- /img/pa-permissions2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/pa-permissions2.png -------------------------------------------------------------------------------- /img/pa-role1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/pa-role1.png -------------------------------------------------------------------------------- /img/pa-s31.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/pa-s31.png -------------------------------------------------------------------------------- /img/pa-s32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/pa-s32.png -------------------------------------------------------------------------------- /img/pa-subnet1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/pa-subnet1.png -------------------------------------------------------------------------------- /img/pa-subnet3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/pa-subnet3.png -------------------------------------------------------------------------------- /img/pa-subnet4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/pa-subnet4.png -------------------------------------------------------------------------------- /img/pa-subnet5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/pa-subnet5.png -------------------------------------------------------------------------------- /img/permissions1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/permissions1.png -------------------------------------------------------------------------------- /img/permissions2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/permissions2.png -------------------------------------------------------------------------------- /img/run-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/run-1.png -------------------------------------------------------------------------------- /img/run-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/run-2.png -------------------------------------------------------------------------------- /img/run-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/run-3.png -------------------------------------------------------------------------------- /img/run-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/run-4.png -------------------------------------------------------------------------------- /img/run-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/run-5.png -------------------------------------------------------------------------------- /img/stepfunction1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/stepfunction1.png -------------------------------------------------------------------------------- /img/stepfunction2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/stepfunction2.png -------------------------------------------------------------------------------- /img/stepfunction3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/stepfunction3.png -------------------------------------------------------------------------------- /img/stepfunction4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/stepfunction4.png -------------------------------------------------------------------------------- /img/test1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/test1.png -------------------------------------------------------------------------------- /img/test2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/test2.png -------------------------------------------------------------------------------- /img/test3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/test3.png -------------------------------------------------------------------------------- /img/test4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/test4.png -------------------------------------------------------------------------------- /img/test5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxCloud101/curso-docker/00bb5cadbafbde8a8d9d19768a0a0687e2fdfdc8/img/test5.png -------------------------------------------------------------------------------- /processapp/2023-12-01.csv: -------------------------------------------------------------------------------- 1 | user_id,item,price 2 | 1,5,10 3 | 1,6,8 4 | 1,5,10 5 | 2,5,10 6 | -------------------------------------------------------------------------------- /processapp/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM python:3.10.13 2 | 3 | RUN apt-get update 4 | 5 | WORKDIR /app 6 | 7 | COPY . . 8 | 9 | RUN pip install -r requirements.txt 10 | -------------------------------------------------------------------------------- /processapp/processor.py: -------------------------------------------------------------------------------- 1 | # This file calculate how much spend a user by date, the file contain the date 2 | import boto3 3 | import os 4 | 5 | dynamodb = boto3.resource('dynamodb') 6 | s3 = boto3.client('s3') 7 | 8 | 9 | bucket = os.environ['S3_BUCKET'] 10 | key = os.environ['S3_KEY'] 11 | 12 | print(bucket) 13 | print(key) 14 | 15 | s3.download_file(bucket, key, key) 16 | 17 | date = key.split('.') 18 | date = date[0] 19 | 20 | file1 = open(key, 'r') 21 | Lines = file1.readlines() 22 | 23 | list_user_id = [] 24 | list_spend_by_user = [] 25 | 26 | for line in Lines: 27 | 28 | if line[-1] == '\n': 29 | line = line[:-1] 30 | 31 | raw =line.split(',') 32 | 33 | if raw[0] != 'user_id': 34 | user_id = raw[0] 35 | if user_id not in list_user_id: 36 | list_user_id.append(user_id) 37 | list_spend_by_user.append(int(raw[2])) 38 | 39 | else: 40 | position = list_user_id.index(user_id) 41 | list_spend_by_user[position] = list_spend_by_user[position] + int(raw[2]) 42 | 43 | print(list_user_id) 44 | print(list_spend_by_user) 45 | 46 | table = dynamodb.Table('Sales') 47 | 48 | with table.batch_writer() as writer: 49 | for (user_id, spend_by_user) in zip(list_user_id, list_spend_by_user): 50 | print(date) 51 | 52 | writer.put_item(Item={ 53 | 'date': date, 54 | 'user_id': user_id, 55 | 'spend': spend_by_user 56 | }) 57 | -------------------------------------------------------------------------------- /processapp/requirements.txt: -------------------------------------------------------------------------------- 1 | boto3==1.34.42 --------------------------------------------------------------------------------