Categoría: DevOps

Crear contenedor desde archivo

Como ya lo hemos mencionado, las imágenes de los contenedores las podemos encontrar en el repositorio Docker Hub. Sin embargo; en ocasiones querremos usar nuestras propias aplicaciones o simplemente adaptarlo a nuestras necesidades.

Para hacer eso requerimos crear un Dockerfile, el siguiente archivo nos ayudara a crear un contenedor que ejecutara un archivo bash.

FROM ubuntu

LABEL maintainer="Tusysadmin.net"

USER root

COPY ./primer_archivo.bash /

RUN apt -y update
RUN apt -y install curl bash
RUN chmod 755 /primer_archivo.bash

USER nobody

ENTRYPOINT [ "/primer_archivo.bash" ]

La palabra FROM es para indicar que imagen utilizaremos, sino esta descargada la descargara del repositorio. LABEL, es solo la «etiqueta» que usamos como descripción; USER, es el usuario que ejecutará los comandos que le siguen. COPY y RUN serán las comandos que correrá nuestro usuario root.

El archivo primer_archivo.bash sera copiado al contenedor, al encontrarse en la misma ruta de Dockerfile no es necesario especificar una ruta diferente. RUN, actualiza el contenedor, instala curl y bash y otorga permisos al archivo copiado, es importante usar el gestor de paquetes correspondiente de la imagen sino mostrará error.

Construyamos la imagen.

[tusysadmin@local contenedores]$ ls
Dockerfile  primer_archivo.bash

[tusysadmin@local contenedores]$ docker build -t primer_imagen .
[+] Building 0.5s (10/10) FINISHED
 => [internal] load build definition from Dockerfile                                                                                      0.0s
 => => transferring dockerfile: 334B                                                                                                      0.0s
 => [internal] load .dockerignore                                                                                                         0.0s
 => => transferring context: 2B                                                                                                           0.0s
 => [internal] load metadata for docker.io/library/ubuntu:latest                                                                          0.4s
 => [internal] load build context                                                                                                         0.0s
 => => transferring context: 99B                                                                                                          0.0s
 => [1/5] FROM docker.io/library/ubuntu@sha256:ec050c32e4a6085b423d36ecd025c0d3ff00c38ab93a3d71a460ff1c44fa6d77                           0.0s
 => => resolve docker.io/library/ubuntu@sha256:ec050c32e4a6085b423d36ecd025c0d3ff00c38ab93a3d71a460ff1c44fa6d77                           0.0s
 => CACHED [2/5] COPY ./primer_archivo.bash /                                                                                             0.0s
 => CACHED [3/5] RUN apt -y update                                                                                                        0.0s
 => CACHED [4/5] RUN apt -y install curl bash                                                                                             0.0s
 => CACHED [5/5] RUN chmod 755 /primer_archivo.bash                                                                                       0.0s
 => exporting to image                                                                                                                    0.0s
 => => exporting layers                                                                                                                   0.0s
 => => writing image sha256:ea88c13fe6d7ac18e8032717deaaf4ed18f049c4b887dcf21312c14874018151                                              0.0s
 => => naming to docker.io/library/primer_imagen

Esta es la forma mas simple de construir una imagen. Si tuvieramos un archivo con un nombre diferente a Dockerfile tendriamos que usar la opción -f seguida del nombre del archivo. Usamos un punto al final para especificar que usaremos el repositorio local.

[tusysadmin@local contenedores]$ docker images
REPOSITORY      TAG       IMAGE ID       CREATED             SIZE
primer_imagen   latest    ea88c13fe6d7   About an hour ago   116MB

[tusysadmin@local contenedores]$ docker run primer_imagen
Este es tu primer contenedor construido con Dockerfile
[tusysadmin@local contenedores]$

Como puede observarse la imagen ha sido creada y cuando se ejecuta hace lo único para lo cual ha sido construida, es decir ejecutar nuestro primer_archivo.bash.

Redes con docker

Al igual que en las maquinas virtuales, los contenedores pueden conectarse entre ellos y a través del host anfitrión para crear redes internas y/o publicar servicios.

Para ilustrar como funcionan los puertos, creemos un contender de ubuntu con los puertos 55678 y 55679 abiertos.

docker run --rm -ti -p 55678:55678 -p 55679:55679 --name echo-server ubuntu:14.04 bash

Este comando abre los mencionados puertos tanto de entrada como de salida, para ilustrar lo que estamos haciendo usemos el comando Netcat.

La terminal de la derecha es el contenedor que es quien inicia Netcat. Mientras tanto, lo escrito en la parte superior izquierda aparece en la terminal inferior por la conexión que se hace a través del contenedor.

Este escaneo es estático ya que establecimos los puertos de entrada y de salida, es posible establecer unicamente los de entrada y los de salida serán dinámicos.

[tusysadmin@local ~]$ docker run --rm -ti -p 55678 -p 55679 --name echo-server ubuntu:14.04 bash

Para saber los puertos utilizados usamos la opción port.

[tusysadmin@local ~]$ docker port echo-server
55679/tcp -> 0.0.0.0:49153
55679/tcp -> :::49153
55678/tcp -> 0.0.0.0:49154
55678/tcp -> :::49154

En este caso los puertos a los que tenemos que hacer la conexión son 49153 y 49154.

Para saber las redes con las que contamos.

[tusysadmin@local ~]$ docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
2acddd4abdcd   bridge    bridge    local
8e60720c5590   host      host      local
b6c7de3fbd09   none      null      local

Estas tres redes son creadas al momento por default al momento de iniciar el servicio docker; sino se especifica lo contrario la red bridge es usada por todos los contenedores, host es para aislar contenedores a una red y none es para especificar que los contenedores no tienen red.

Crearemos un nueva red para conectar algunos contenedores.

[tusysadmin@local ~]$ docker network create taller
51ba550801cff8cf879630bb1925266d9ea45da375d6336c73f2b6e9a779926b

Creamos dos contenedores conectados a esa red.

[tusysadmin@local ~]$ docker run --rm -ti --network taller --name front ubuntu:14.04 bash
[tusysadmin@local ~]$ docker run --rm -ti --network taller --name back ubuntu:14.04 bash

Ping entre contenedores

Image 1 De 2

Como se observa en estas imágenes, existe una conexión entre contenedores solo con usar la misma red al momento de la declaración y es a través del nombre que pueden conectarse. Hagamos la cosas mas interesantes agregando un nueva red que solo pueda conectarse al back.

[tusysadmin@local ~]$ docker network create backsonly
a8f856b310666d071249bef328df3bbfbd2fa3e183923320cbb2425713f12720

[tusysadmin@local ~]$ docker network connect backsonly back

Crearemos un tercer contenedor que solo esté conectado a esta red el cual podrá hacer ping a back pero no a front.

Red separada

Image 1 De 1

El contenedor back por estar en ambas redes puede conectarse a ambos contenedores, pero entre ellos no es posible la conexión.

Usando contenedores

Una vez que tenemos instalado docker en nuestro sistema operativo, comenzamos con los comandos básicos de administración. En nuestra interfaz; al igual que otras utilidades de Linux, docker tiene una opción de ayuda.

[tusysadmin@local ~]$ docker --help

Usage:  docker [OPTIONS] COMMAND

A self-sufficient runtime for containers

Common Commands:
  run         Create and run a new container from an image
  exec        Execute a command in a running container
  ps          List containers
  build       Build an image from a Dockerfile
  pull        Download an image from a registry
  push        Upload an image to a registry
  images      List images
  login       Log in to a registry
  logout      Log out from a registry
  search      Search Docker Hub for images
  version     Show the Docker version information
  info        Display system-wide information

Buscar una imagen.

[tusysadmin@local ~]$ docker search hello-world | head -5
NAME                                       DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
hello-world                                Hello World! (an example of minimal Dockeriz…   2081      [OK]
rancher/hello-world                                                                        4
okteto/hello-world                                                                         0
golift/hello-world                         Hello World Go-App built by Go Lift Applicat…   0

Descargar una imagen.

[tusysadmin@local ~]$ docker image pull ubuntu
Using default tag: latest
latest: Pulling from library/ubuntu
db76c1f8aa17: Pull complete
Digest: sha256:ec050c32e4a6085b423d36ecd025c0d3ff00c38ab93a3d71a460ff1c44fa6d77
Status: Downloaded newer image for ubuntu:latest

Listar imágenes.

[tusysadmin@local ~]$ docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
ubuntu       latest    a2f229f811bf   12 days ago   69.2MB

Recordemos que las imágenes de los contenedores se encuentran en un repositorio, al usar image pull estamos descargando la última versión de la imagen de ubuntu, cuando queramos iniciar un contenedor con esta imagen usamos el comando run y algunos parámetros extras en caso de ser necesario.

[tusysadmin@local ~]$ docker run -d -ti ubuntu bash
bc31db28981c73f1c112e2e23f35d843730aac35f6e46620de80d2f9953562fb

[tusysadmin@local ~]$ docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED          STATUS          PORTS     NAMES
bc31db28981c   ubuntu    "bash"    32 minutes ago   Up 32 minutes             eloquent_goldberg

Lo que hicimos con este comando es lanzar un contenedor con la imagen de ubuntu. El contenedor está corriendo y así seguirá hasta que sea detenido con el comando run o entrando al contenedor internamente lo terminemos. Para entrar al contenedor podemos usar attach.

[tusysadmin@local ~]$ docker attach eloquent_goldberg

root@bc31db28981c:/# cat /etc/issue
Ubuntu 22.04 LTS \n \l

root@bc31db28981c:/# ls
bin  boot  dev  etc  home  lib  lib32  lib64  libx32  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

Estando dentro del contenedor y escribir exit termina con el contenedor. Si quisiera salir del contenedor sin terminarlo tendría que usar las teclas Ctrl +p seguidas de Ctrl +q.

root@bc31db28981c:/# exit
exit
[tusysadmin@local ~]$ docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

Otra forma para ingresar a un contenedor es usando la opción exec, en este caso; al escribir exit el contenedor no dejara de ejecutarse.

[tusysadmin@local ~]$ docker run -d -ti ubuntu bash
0681487d52deaa363911203bb8094646d4c55d08cb2a095a4d56e759e4f07125

[tusysadmin@local ~]$ docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED         STATUS         PORTS     NAMES
0681487d52de   ubuntu    "bash"    7 seconds ago   Up 5 seconds             determined_wescoff

[tusysadmin@local ~]$ docker exec -ti  determined_wescoff bash

root@0681487d52de:/# ls 
bin  boot  dev  etc  home  lib  lib32  lib64  libx32  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

root@0681487d52de:/# exit
exit
[tusysadmin@local ~]$ docker ps 
CONTAINER ID   IMAGE     COMMAND   CREATED          STATUS          PORTS     NAMES
0681487d52de   ubuntu    "bash"    16 minutes ago   Up 16 minutes             determined_wescoff

Para terminar el contenedor de forma definitiva usamos el comando kill.

[tusysadmin@local ~]$ docker kill determined_wescoff
determined_wescoff

[tusysadmin@local ~]$ docker ps -l
CONTAINER ID   IMAGE     COMMAND   CREATED        STATUS                        PORTS     NAMES
0681487d52de   ubuntu    "bash"    12 hours ago   Exited (137) 14 seconds ago             determined_wescoff

Instalar Docker en Fedora 36

Docker es un proyecto de código abierto que permite desplegar aplicaciones dentro de contenedores. Al hacerlo de esta manera y no por maquinas virtuales se evita la sobrecarga de recursos.

Comencemos con la instalación y configuración del repositorio.

[tusysadmin@local ~]$ sudo dnf -y install dnf-plugins-core
[tusysadmin@local ~]$ sudo dnf config-manager \
    --add-repo \
    https://download.docker.com/linux/fedora/docker-ce.repo

tusysadmin@local ~]$ sudo dnf config-manager --set-enabled docker-ce-nightly

Instalamos los paquetes e iniciamos el servicio .

~]$ sudo dnf install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin

[tusysadmin@local ~]$ sudo systemctl start docker

[tusysadmin@local ~]$ sudo docker version 
Client: Docker Engine - Community
 Version:           20.10.16
 API version:       1.41
 Go version:        go1.17.10
 Git commit:        aa7e414
 Built:             Thu May 12 09:16:46 2022
 OS/Arch:           linux/amd64
 Context:           default
 Experimental:      true

Probemos que docker está funcionando.

[tusysadmin@local ~]$ sudo docker run hello-world

Para una administración gráfica y practica podemos instalar docker-desktop, bastará con descargar el paquete rpm de la pagina. Una vez descargado, procedemos a instalar.

]$ sudo dnf install -y docker-desktop-*.rpm

El paquete funciona igual que otro servicio, así que bastará con iniciarse y si así se desea habilitarse.

]$ systemctl --user start docker-desktop

Y con estos sencillos pasos ya tenemos docker instalado en nuestro Fedora 36, listo para empezar a desplegar contenedores.

© 2025

Tema por Anders NorenArriba ↑