-
Notifications
You must be signed in to change notification settings - Fork 17
/
docker.Rmd
207 lines (134 loc) · 4.7 KB
/
docker.Rmd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
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
---
title: "La línea de comandos"
author:
- "Adolfo De Unánue T."
- "Revisado y actualizado por: Andrea Fernández"
date: "`r format(Sys.time(), '%Y-%m-%d')`"
output:
html_document:
toc: yes
toc_float: yes
---
```{r setup, include=FALSE}
knitr::opts_chunk$set(eval = FALSE)
```
# Producto de datos: Ambiente
## ¿Por qué es importante?
- *Reproducibilidad*
- *Documentación*
- *Aislamiento*
## ¿Cómo lo puedo hacer?
| Característica | Docker | AMI | ~python virtualenv~ | Ubuntu Juju |
|----------------------------+--------+-----+---------------------+-------------|
| Cross-platform | ✓ | ✗ | ✗ | ✓ |
| Portable | ✓ | ✗ | ✗ | ✓ |
| ¿Se puede compartir? | ✓ | ✓ | ✗ | ✓ |
| ¿Se puede usar como lego? | ✓ | ✓ | ✗ | ✓ |
| ¿Soporte de la comunidad? | ✓ | ✓ | ✗ | ✓ |
| Multi-lenguaje | ✓ | ✓ | ✗ | ✓ |
# Docker Engine
![](img/docker-engine.png)
Puedes pensar que *Docker* es como una laptop construida para un único propósito
## Docker Engine vs Virtual Machines
![](./img/VM.png)
## Docker Engine vs Virtual Machines
![](./img/docker-containers.png)
## Docker Engine vs Virtual Machines
- Los contenedores de Docker son más rápidos que una VM, ya que no tienen tanto
/overhead/
- Es como ejecutar un binario en lugar de ejecutar todo un SO
- Toda la especificación de una imagen de Docker, está especificada en un
archivo de texto llamado =Dockerfile=, el cual puede estar junto a tu
aplicación,
## Docker Engine: Componentes
- /Docker daemon/
- /Docker CLI/
# Checklist
- Si no lo instalaron:
- https://docs.docker.com/engine/installation/
- Si ya lo instalaron, verifiquen:
```{bash}
docker --version
```
- ¿Funcionó?
- Algo para tener a mano:
- https://github.com/wsargent/docker-cheat-sheet
# Conceptos importantes
- *Imagen*
- Son como los planos de un proyecto =(+ ó -)=
- Los planos de la laptop
- *Contenedor*
- Es la cosa "construida" =(+ ó -)=
- Es como la laptop que mencionábamos antes
# Comandos útiles
Revisar las imágenes
```{bash}
sudo su
docker images | head
```
Revisar los contenedores
```{bash}
docker ps -a | head
```
Descargar la imagen desde =dockerhub=
```{bash}
docker pull ubuntu
```
*NOTA* Cambiar =push= por =pull=, hace que suban la imagen a =dockerhub=
Crear un contenedor a partir de una imagen, ejecutarlo y al salir destruir el contenedor
```{bash}
docker run -it --rm ubuntu /bin/bash
```
*NOTA* Si la imagen no existe localmente, este comando descarga la imagen también.
Crear un contenedor a partir de una imagen, ejecutarlo y asignarle un nombre (no
destruye el contenedor al salir)
```{bash}
docker run -it --name test-ubuntu ubuntu /bin/bash
```
Ejecutar un contenedor ya existente
```{bash}
docker start -i test-ubuntu
```
Detener un contedor ya existente
```{bash}
docker stop test-ubuntu
```
Ver los =logs= o los procesos (prendelo y abre otra terminal)
```{bash}
docker logs test-ubuntu
docker top test-ubuntu
```
Y por último (importante para "/debuggear/"), conectarse a un contenedor "vivo"
```{bash}
docker exec -it test-ubuntu /bin/bash
```
*NOTA* El comando =attach= hace que tu terminal se convierta en la del
contenedor ejecutándose. Esto te permitirá ver lo que sucede, pero
ten cuidado de no presionar =C-c= o detendrás el contenedor.
# Banderas
- =-i= Activa el modo =i= nteractivo.
- También puedes usar =-a= pero este modo no es interactivo (es un /attach/).
- =-rm= borra el contenedor cuando se apaga
- =-v= /liga/ una carpeta de tu compu con una carpeta en el
contenedor.
- =-p= /liga/ los puertos de tu compu con los puertos del contenedor.
# ¿Cómo hago mi propio contenedor?
- En un archivo ~Dockerfile~, en cual contiene todos los pasos de la
instalación.
## DockerHub
- Docker image registry with a nice-ish web front end
- DockerHub:Docker :: GitHub:Git
## ¿Microservicios?
Por construcción (y filosofía de diseño) las imágenes de ~docker~ sólo
ejecutan una cosa a la vez
- Es decir, se construyen como *microservicios* y estos son
*inmutables*.
- Obviamente es posible darle la vuelta a esta restricción pero en esta clase no
lo haremos.
# ¿Y cómo hago un producto de datos?
- Lamentablemente son más complejos que un sólo contenedor, involucran
varios contenedores
- =docker= permite /linkear/ varios contenedor
es (con la bandera
~link~), pero las líneas de comandos resultantes, se vuelven
inmanejables (o por lo menos muy difíciles de /debuggear/).