Saltar al contenido
Lectura9 minPreview

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 repositorio

Sin 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: docker es el cliente que le da órdenes al daemon; run crea un contenedor desde una imagen y lo arranca, descargándola si falta.

Sintaxis

docker SUBCOMANDO [OPCIONES] [ARGUMENTOS]
docker run [OPCIONES] IMAGEN[:ETIQUETA] [COMANDO]
SubcomandoQué haceEjemplo
runCrea y arranca un contenedordocker run hello-world
pullSolo descarga una imagendocker pull alpine:3.20
imagesLista las imágenes localesdocker images
psLista contenedores (-a: también los detenidos)docker ps -a

Opciones principales de run

OpciónQué haceEjemplo
-dSegundo plano (detached)docker run -d nginx:1.27-alpine
--nameNombre fijo--name web
-pPublica un puerto-p 8080:80
--rmBorra el contenedor al terminardocker run --rm hello-world
-itSesión interactiva con terminaldocker 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_turing

jolly_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.