Imágenes y su primer docker run
Buena parte de las dudas de la primera semana con Docker vienen de mezclar imagen y contenedor.
Imagen y contenedor
Una imagen es una plantilla de solo lectura: archivos mínimos, la aplicación y la instrucción de arranque. Un contenedor es una instancia en ejecución de esa imagen. Con una sola imagen puede levantar diez contenedores idénticos, y borrar los diez no toca la imagen.
Las imágenes se descargan de un registro; el público por defecto es Docker Hub. Cada una tiene nombre y etiqueta (tag):
nginx:1.27-alpine
| |
| +-- etiqueta: versión 1.27 sobre Alpine Linux
+--------- nombre del repositorioSin etiqueta, Docker usa latest, que cambia sin aviso. Fije siempre una versión: el día que latest salte de versión mayor, mejor enterarse por las notas que por un servicio caído. Por dentro, la imagen son capas compartidas; cada contenedor agrega una capa delgada de escritura y la imagen nunca cambia.
Ficha de docker y docker run
- Nombre: docker es "estibador", quien carga contenedores en un puerto. run es "ejecutar".
- Qué hace:
dockeres el cliente que le da órdenes al daemon;runcrea un contenedor desde una imagen y lo arranca, descargándola si falta.
Sintaxis
docker SUBCOMANDO [OPCIONES] [ARGUMENTOS]
docker run [OPCIONES] IMAGEN[:ETIQUETA] [COMANDO]| Subcomando | Qué hace | Ejemplo |
|---|---|---|
run | Crea y arranca un contenedor | docker run hello-world |
pull | Solo descarga una imagen | docker pull alpine:3.20 |
images | Lista las imágenes locales | docker images |
ps | Lista contenedores (-a: también los detenidos) | docker ps -a |
Opciones principales de run
| Opción | Qué hace | Ejemplo |
|---|---|---|
-d | Segundo plano (detached) | docker run -d nginx:1.27-alpine |
--name | Nombre fijo | --name web |
-p | Publica un puerto | -p 8080:80 |
--rm | Borra el contenedor al terminar | docker run --rm hello-world |
-it | Sesión interactiva con terminal | docker run -it alpine:3.20 sh |
Su primer docker run
En una terminal (PowerShell en Windows, Terminal en macOS o Linux):
$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
c1ec31eb5944: Pull complete
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.Docker no tenía la imagen, la descargó del espacio library de Docker Hub (el de las imágenes oficiales), creó un contenedor, el programa imprimió su mensaje y terminó. Un contenedor vive mientras vive su proceso principal; cuando ese proceso sale, el contenedor se detiene.
Ver imágenes y contenedores
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest d2c94e258dcb 18 months ago 13.3kB
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS NAMES
4f2a9c1e7b3d hello-world "/hello" 30 seconds ago Exited (0) 29 seconds ago jolly_turingjolly_turing lo inventó Docker porque usted no dio nombre. Exited (0) quiere decir que terminó sin error. Ese contenedor detenido sigue ocupando espacio hasta que lo borre.
Errores frecuentes
Unable to find image 'helo-world:latest' locally
docker: Error response from daemon: pull access denied for helo-world, repository does not exist or may require 'docker login'.Parece de permisos, pero casi siempre es un nombre mal escrito (o una imagen privada).
docker: Error response from daemon: manifest for nginx:9.9 not found: manifest unknown.La imagen existe, pero esa etiqueta no. Revise las etiquetas en su página oficial.