Introducción
Docker es un programa que simplifica la gestión de procesos de aplicaciones en contenedores. Los contenedores permiten ejecutar aplicaciones en procesos con recursos aislados. Son similares a las máquinas virtuales, pero son más portátiles, consumen menos recursos y dependen menos del sistema operativo host.
Para obtener una introducción detallada a los diferentes componentes de un contenedor Docker, consulte El ecosistema de Docker: una introducción a los componentes comunes.
En este tutorial, instalarás y usarás Docker Community Edition (CE) en Ubuntu 20.04. Instalarás Docker, trabajarás con contenedores e imágenes, y subirás una imagen a un repositorio de Docker.
Nota
Este artículo te guiará en la instalación de Docker en un servidor Ubuntu. Si buscas una forma sencilla de implementar una aplicación Docker en un servidor en vivo, consulta la plataforma de aplicaciones DigitalOcean.
Requisitos previos
Para seguir este tutorial necesitarás lo siguiente:
- Se configuró un servidor Ubuntu 20.04 siguiendo la guía de configuración inicial del servidor Ubuntu 20.04, incluido un usuario sudo no root y un firewall.
- Como se muestra en los pasos 7 y 8, necesitará tener una cuenta de Docker Hub si desea crear sus propias imágenes y enviarlas a Docker Hub.
Paso 1 – Instalar Docker
El paquete de instalación de Docker disponible en el repositorio oficial de Ubuntu podría no ser la última versión. Para garantizar que obtenga la última versión, instalaremos Docker desde el repositorio oficial. Para ello, agregaremos una nueva fuente de paquete, agregaremos la clave GPG de Docker para garantizar que las descargas sean válidas y, a continuación, instalaremos el paquete.
Primero, actualice su lista de paquetes disponibles:
sudo apt update
A continuación, instale algunos paquetes de requisitos previos que permitirán que apt use paquetes a través de HTTPS:
sudo apt install apt-transport-https ca-certificates curl software-properties-common
Luego agregue la clave GPG del repositorio oficial de Docker a su sistema:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
Agregue el repositorio de Docker a las fuentes de APT:
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable"
Esto también actualizará nuestra base de datos de paquetes con paquetes Docker del repositorio recién agregado.
Asegúrate de que estás instalando desde el repositorio de Docker en lugar del repositorio predeterminado de Ubuntu:
apt-cache policy docker-ce
Verá un resultado como este, aunque el número de versión de Docker puede ser diferente:
docker-ce:
Installed: (none)
Candidate: 5:19.03.9~3-0~ubuntu-focal
Version table:
5:19.03.9~3-0~ubuntu-focal 500
500 https://download.docker.com/linux/ubuntu focal/stable amd64 PackagesTenga en cuenta que docker-ce no está instalado, pero es un candidato para su instalación desde el repositorio de Docker para Ubuntu 20.04 (canónico).
Por último, instala Docker:
sudo apt install docker-ce
Docker ya debería estar instalado, el demonio iniciado y el proceso habilitado para iniciarse al arrancar. Compruebe que se esté ejecutando:
sudo systemctl status docker
La salida debería ser similar a la siguiente, indicando que el servicio está en funcionamiento:
Output
● docker.service - Docker Application Container Engine
Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
Active: active (running) since Tue 2020-05-19 17:00:41 UTC; 17s ago
TriggeredBy: ● docker.socket
Docs: https://docs.docker.com
Main PID: 24321 (dockerd)
Tasks: 8
Memory: 46.4M
CGroup: /system.slice/docker.service
└─24321 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sockAhora, al instalar Docker, no solo obtiene el servicio Docker (daemon), sino también la herramienta de línea de comandos o cliente Docker. En el resto de este tutorial, veremos cómo usar el comando docker.
Paso 2: Ejecutar el comando Docker sin sudo (opcional)
De forma predeterminada, el comando docker solo puede ser ejecutado por el usuario root o por un usuario del grupo docker, que se crea automáticamente durante la instalación de Docker. Si intenta ejecutar el comando docker sin prefijarlo con sudo o sin pertenecer al grupo docker, obtendrá un resultado como el siguiente:
Output
docker: Cannot connect to the Docker daemon. Is the docker daemon running on this host?.
See 'docker run --help'.Si desea evitar escribir sudo al ejecutar el comando docker, agregue su nombre de usuario al grupo docker:
sudo usermod -aG docker ${USER}
Para aplicar la nueva membresía del grupo, cierre la sesión del servidor y vuelva a iniciarla, o escriba lo siguiente:
su - ${USER}
Para continuar, se le pedirá que ingrese su contraseña de usuario.
Verifique que su usuario ahora esté agregado al grupo Docker escribiendo:
groups
sammy sudo docker
Si necesita agregar un usuario al grupo de Docker con el que no ha iniciado sesión, declare ese nombre de usuario explícitamente usando:
sudo usermod -aG docker usernameEl resto de este artículo asume que estás ejecutando el comando docker como usuario del grupo docker. Si no lo deseas, añade los comandos con sudo.
A continuación examinaremos el comando docker.
Paso 3 – Uso del comando Docker
Usar Docker implica pasar una cadena de opciones y comandos seguidos de argumentos. La sintaxis es la siguiente:
docker [option] [command] [arguments]
Para ver todos los subcomandos disponibles, escriba:
dockerA partir de Docker 19, la lista completa de subcomandos disponibles incluye:
Output
attach Attach local standard input, output, and error streams to a running container
build Build an image from a Dockerfile
commit Create a new image from a container's changes
cp Copy files/folders between a container and the local filesystem
create Create a new container
diff Inspect changes to files or directories on a container's filesystem
events Get real time events from the server
exec Run a command in a running container
export Export a container's filesystem as a tar archive
history Show the history of an image
images List images
import Import the contents from a tarball to create a filesystem image
info Display system-wide information
inspect Return low-level information on Docker objects
kill Kill one or more running containers
load Load an image from a tar archive or STDIN
login Log in to a Docker registry
logout Log out from a Docker registry
logs Fetch the logs of a container
pause Pause all processes within one or more containers
port List port mappings or a specific mapping for the container
ps List containers
pull Pull an image or a repository from a registry
push Push an image or a repository to a registry
rename Rename a container
restart Restart one or more containers
rm Remove one or more containers
rmi Remove one or more images
run Run a command in a new container
save Save one or more images to a tar archive (streamed to STDOUT by default)
search Search the Docker Hub for images
start Start one or more stopped containers
stats Display a live stream of container(s) resource usage statistics
stop Stop one or more running containers
tag Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE
top Display the running processes of a container
unpause Unpause all processes within one or more containers
update Update configuration of one or more containers
version Show the Docker version information
wait Block until one or more containers stop, then print their exit codes
Para ver las opciones disponibles para un comando específico, escriba:
docker docker-subcommand --help
Para ver información de todo el sistema sobre Docker, utilice lo siguiente:
docker info
Exploremos algunos de estos comandos. Empezaremos trabajando con imágenes.
Paso 4: Trabajar con imágenes Docker
Los contenedores Docker se crean a partir de imágenes de Docker. Por defecto, Docker obtiene estas imágenes de Docker Hub, un registro de Docker administrado por Docker, la empresa que gestiona el proyecto Docker. Cualquiera puede alojar sus propias imágenes de Docker en Docker Hub, por lo que la mayoría de las aplicaciones y distribuciones de Linux que necesite tendrán imágenes alojadas allí.
Para comprobar si puede acceder y descargar imágenes desde Docker Hub, escriba:
docker run hello-world
La salida muestra que Docker está funcionando correctamente:
Output
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
0e03bdcc26d7: Pull complete
Digest: sha256:6a65f928fb91fcfbc963f7aa6d57c8eeb426ad9a20c7ee045538ef34847f44f1
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
...Inicialmente, Docker no pudo encontrar la imagen de "hola-mundo" localmente, por lo que la descargó de Docker Hub, el repositorio predeterminado. Tras descargarla, Docker creó un contenedor a partir de ella y la aplicación dentro del contenedor se ejecutó, mostrando el mensaje.
Puedes buscar imágenes en Docker Hub usando el comando docker con el subcomando "search". Por ejemplo, para buscar una imagen de Ubuntu, escribe:
docker search ubuntu
El script rastrea Docker Hub y devuelve una lista de todas las imágenes cuyos nombres coinciden con la cadena de búsqueda. En este caso, el resultado será similar a este:
Output
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
ubuntu Ubuntu is a Debian-based Linux operating sys… 10908 [OK]
dorowu/ubuntu-desktop-lxde-vnc Docker image to provide HTML5 VNC interface … 428 [OK]
rastasheep/ubuntu-sshd Dockerized SSH service, built on top of offi… 244 [OK]
consol/ubuntu-xfce-vnc Ubuntu container with "headless" VNC session… 218 [OK]
ubuntu-upstart Upstart is an event-based replacement for th… 108 [OK]
ansible/ubuntu14.04-ansible Ubuntu 14.04 LTS with
...
En la columna OFICIAL, "OK" indica una imagen creada y respaldada por la empresa responsable del proyecto. Una vez identificada la imagen que desea usar, puede descargarla a su computadora con el subcomando "pull".
Ejecute el siguiente comando para descargar la imagen oficial de Ubuntu a su computadora:
docker pull ubuntu
Verá el siguiente resultado:
Output
Using default tag: latest
latest: Pulling from library/ubuntu
d51af753c3d3: Pull complete
fc878cd0a91c: Pull complete
6154df8ff988: Pull complete
fee5db0ff82f: Pull complete
Digest: sha256:747d2dbbaaee995098c9792d99bd333c6783ce56150d1b11e333bbceed5c54d7
Status: Downloaded newer image for ubuntu:latest
docker.io/library/ubuntu:latestDespués de descargar una imagen, puede ejecutar un contenedor usando la imagen descargada con el subcomando "run". Como vio en el ejemplo de "hola-mundo", si no se descarga una imagen al ejecutar docker con el subcomando "run", el cliente Docker primero descarga la imagen y luego ejecuta un contenedor usándola.
Para ver las imágenes descargadas a su computadora, escriba:
docker images
La salida será similar a la siguiente figura:
Output
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest 1d622ef86b13 3 weeks ago 73.9MB
hello-world latest bf756fb1ae65 4 months ago 13.3kBComo verá más adelante en este tutorial, las imágenes que utiliza para ejecutar contenedores se pueden modificar y usar para producir nuevas imágenes, que pueden cargarse en Docker Hub u otros registros de Docker (ese es el término técnico).
Exploremos cómo funcionan los contenedores con más detalle.
Paso 5: Ejecutar un contenedor Docker
El contenedor "hello-world" que ejecutaste en el paso anterior es un ejemplo de un contenedor que se ejecuta y finaliza tras enviar un mensaje de prueba. Los contenedores pueden ser mucho más útiles y pueden ser interactivos. Al fin y al cabo, son similares a las máquinas virtuales, solo que consumen menos recursos.
Por ejemplo, ejecutemos un contenedor con la imagen más reciente de Ubuntu. La combinación de las opciones -i y -t proporciona acceso interactivo al contenedor a través del shell:
docker run -it ubuntu
Su línea de comando debería cambiar para reflejar el hecho de que ahora está trabajando dentro de un contenedor y debería verse así:
Output
root@d9b100f2f636:/#Anote el ID del contenedor en la línea de comandos. En este ejemplo, es d9b100f2f636. Lo necesitará más adelante para identificarlo cuando desee eliminarlo.
Ahora puedes ejecutar cualquier comando dentro del contenedor. Por ejemplo, actualicemos la base de datos de paquetes dentro del contenedor. No necesitas prefijar ningún comando con sudo, ya que estás ejecutando como usuario root dentro del contenedor:
apt updateLuego, instala cualquier aplicación. Instalemos Node.js:
apt install nodejs
Se instalará Node.js desde el repositorio oficial de Ubuntu. Una vez completada la instalación, compruebe que Node.js esté instalado:
node -v
Verás el número de versión en tu terminal:
Output
v10.19.0Cualquier cambio que realice dentro de un contenedor solo se aplicará a ese contenedor.
Para salir del contenedor, escriba exit en el símbolo del sistema.
A continuación veamos cómo administrar contenedores en nuestro sistema.
Paso 6: Administrar contenedores Docker
Después de usar Docker durante un tiempo, tendrá muchos contenedores activos (en ejecución) e inactivos en su computadora. Para ver los activos, use:
docker ps
Verá un resultado similar al siguiente:
Output
CONTAINER ID IMAGE COMMAND CREATED
En este tutorial, iniciaste dos contenedores: uno desde la imagen de hello-world y el otro desde la imagen de Ubuntu. Ambos contenedores ya no se ejecutan, pero aún existen en tu sistema.
Para ver todos los contenedores (activos e inactivos), ejecute docker ps con el modificador -a:
docker ps -a
Verá un resultado similar a este:
1c08a7a0d0e4 ubuntu "/bin/bash" 2 minutes ago Exited (0) 8 seconds ago quizzical_mcnulty
a707221a5f6c hello-world "/hello" 6 minutes ago Exited (0) 6 minutes ago youthful_curie
Para ver el último contenedor que creaste, pásale el interruptor -l:
docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1c08a7a0d0e4 ubuntu "/bin/bash" 2 minutes ago Exited (0) 40 seconds ago quizzical_mcnulty
Para iniciar un contenedor detenido, use docker start seguido del ID o el nombre del contenedor. Iniciemos el contenedor basado en Ubuntu con el ID 1c08a7a0d0e4:
docker start 1c08a7a0d0e4docker start 1c08a7a0d0e4
El contenedor se iniciará y podrás usar docker ps para ver su estado:
Output
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1c08a7a0d0e4 ubuntu "/bin/bash" 3 minutes ago Up 5 seconds quizzical_mcnulty
Para detener un contenedor en ejecución, use docker stop seguido del ID o nombre del contenedor. En esta ocasión, usaremos el nombre que Docker le asignó al contenedor, que es quizical_mcnulty:
docker stop quizzical_mcnulty
Cuando decida que ya no necesita el contenedor, elimínelo con el comando docker rm, usando nuevamente el ID o el nombre del contenedor. Use el comando docker ps -a para encontrar el ID o el nombre del contenedor asociado a la imagen "hello-world" y elimínelo.
docker rm youthful_curie
Puedes crear un nuevo contenedor y asignarle un nombre con la opción –name. También puedes usar la opción –rm para crear un contenedor que se elimine automáticamente al detenerse. Para obtener más información sobre estas y otras opciones, consulta el comando docker run help.
Los contenedores se pueden convertir en imágenes que puedes usar para crear nuevos contenedores. Veamos cómo funciona.
Paso 7: Realizar cambios en un contenedor en una imagen de Docker
Al iniciar una imagen de Docker, puedes crear, modificar y eliminar archivos como si fuera una máquina virtual. Los cambios que realices se aplican solo a ese contenedor. Puedes iniciarlo y detenerlo, pero al destruirlo con el comando docker rm, los cambios se perderán para siempre.
Esta sección le muestra cómo guardar el estado de un contenedor como una nueva imagen de Docker.
Tras instalar Node.js en un contenedor de Ubuntu, ahora dispone de un contenedor en ejecución a partir de una imagen, pero este contenedor es diferente de la imagen que utilizó para crearlo. Sin embargo, es posible que desee usar este contenedor de Node.js como base para nuevas imágenes más adelante.
Luego, realice los cambios en una nueva instancia de imagen de Docker utilizando el siguiente comando.
docker commit -m "What you did to the image" -a "Author Name" container_id repository/new_image_name
La opción -m se utiliza para enviar un mensaje de confirmación que te ayuda a ti y a otros usuarios a saber qué cambios has realizado, mientras que -a se usa para especificar el autor. El container_id es el que especificaste anteriormente en el tutorial al iniciar la sesión interactiva de Docker. A menos que hayas creado repositorios adicionales en Docker Hub, este suele ser tu nombre de usuario de Docker Hub.
Por ejemplo, para el usuario sammy, con ID de contenedor d9b100f2f636, el comando sería el siguiente:
docker commit -m "added Node.js" -a "sammy" d9b100f2f636 sammy/ubuntu-nodejs
Al subir una imagen, esta se guarda localmente en tu ordenador. Más adelante en este tutorial, aprenderás a subir una imagen a un registro de Docker, como Docker Hub, para que otros usuarios puedan acceder a ella.
Al volver a listar las imágenes de Docker, se mostrará la nueva imagen así como la imagen anterior de la que se derivó:
docker images
Verás el resultado así:
Output
REPOSITORY TAG IMAGE ID CREATED SIZE
sammy/ubuntu-nodejs latest 7c1f35226ca6 7 seconds ago 179MB
...
En este ejemplo, ubuntu-nodejs es una nueva imagen derivada de la imagen de Ubuntu existente de Docker Hub. La diferencia de tamaño indica los cambios realizados. En este ejemplo, el cambio fue la instalación de NodeJS. Así, la próxima vez que necesite ejecutar un contenedor en Ubuntu con NodeJS preinstalado, podrá usar la nueva imagen.
También puedes crear imágenes desde un Dockerfile, lo que te permite automatizar la instalación de software en una nueva imagen. Sin embargo, esto queda fuera del alcance de este tutorial.
Ahora compartamos la nueva imagen con otros para que puedan crear contenedores a partir de ella.
Paso 8: Transferir imágenes de Docker al repositorio de Docker
El siguiente paso lógico tras crear una imagen a partir de una existente es compartirla con algunos amigos, con todo el mundo en Docker Hub o con otros registros de Docker a los que tengas acceso. Para enviar una imagen a Docker Hub o a cualquier otro registro de Docker, necesitas tener una cuenta.
Esta sección te muestra cómo subir una imagen de Docker a Docker Hub. Para aprender a crear tu propio registro privado de Docker, consulta Cómo configurar un registro privado de Docker en Ubuntu 18.04.
Para enviar su imagen, primero inicie sesión en Docker Hub.
docker login -u docker-registry-username
Se le solicitará que se autentique con su contraseña de Docker Hub. Si especificó la contraseña correcta, la autenticación debería ser correcta.
Nota: Si el nombre de usuario del registro de Docker es diferente del nombre de usuario local que usó para crear la imagen, deberá etiquetarla con el nombre de usuario del registro. Para el ejemplo del paso anterior, escriba:
docker tag sammy/ubuntu-nodejs docker-registry-username/ubuntu-nodejs
Luego puedes recortar tu imagen usando:
docker push docker-registry-username/docker-image-name
Para enviar la imagen de ubuntu-nodejs al repositorio Sami, el comando sería el siguiente:
docker push sammy/ubuntu-nodejs
El proceso puede tardar un poco con la carga de imágenes, pero una vez completado, el resultado se verá así:
Output
The push refers to a repository [docker.io/sammy/ubuntu-nodejs]
e3fbbfb44187: Pushed
5f70bf18a086: Pushed
a3b5c80a4eba: Pushed
7f18b442972b: Pushed
3ce512daaf78: Pushed
7aae4540b42d: Pushed
...Después de enviar una imagen a un registro, debería aparecer en el panel de su cuenta, como se muestra en la imagen a continuación.
Si el intento de inserción genera este tipo de error, probablemente no haya iniciado sesión:
Output
The push refers to a repository [docker.io/sammy/ubuntu-nodejs]
e3fbbfb44187: Preparing
5f70bf18a086: Preparing
a3b5c80a4eba: Preparing
7f18b442972b: Preparing
3ce512daaf78: Preparing
7aae4540b42d: Waiting
unauthorized: authentication requiredInicia sesión en tu cuenta de Docker e intenta la transferencia de nuevo. Luego, comprueba que esté disponible en la página del repositorio de Docker Hub.
Ahora puedes usar docker pull sammy/ubuntu-nodejs para extraer la imagen a una nueva máquina y usarla para ejecutar un nuevo contenedor.
Resultado
En este tutorial, instalaste Docker, trabajaste con imágenes y contenedores, y subiste una imagen modificada a Docker Hub. Ahora que conoces los conceptos básicos, explora otros tutoriales de Docker en la comunidad de DigitalOcean.










