Docker
Contenedores de correr
Buscar..
Sintaxis
- ventana acoplable ejecutar [OPCIONES] IMAGEN [COMANDO] [ARG ...]
Corriendo un contenedor
docker run hello-world
Esto traerá la última imagen de hello-world desde Docker Hub (si aún no la tiene), creará un nuevo contenedor y ejecutarlo. Debería ver un mensaje que indica que su instalación parece estar funcionando correctamente.
Ejecutando un comando diferente en el contenedor
docker run docker/whalesay cowsay 'Hello, StackExchange!'
Este comando le dice a Docker que cree un contenedor desde la imagen de docker/whalesay
y ejecute el comando cowsay 'Hello, StackExchange!'
en eso. Debería imprimir una imagen de una ballena diciendo: Hello, StackExchange!
a tu terminal
Si el punto de entrada en la imagen es el predeterminado, puede ejecutar cualquier comando que esté disponible en la imagen:
docker run docker/whalesay ls /
Si se ha cambiado durante la creación de la imagen, debe revertirla al valor predeterminado.
docker run --entrypoint=/bin/bash docker/whalesay -c ls /
Eliminar automáticamente un contenedor después de ejecutarlo
Normalmente, un contenedor Docker persiste después de haber salido. Esto le permite ejecutar el contenedor nuevamente, inspeccionar su sistema de archivos, y así sucesivamente. Sin embargo, a veces desea ejecutar un contenedor y eliminarlo inmediatamente después de que se cierre. Por ejemplo, para ejecutar un comando o mostrar un archivo desde el sistema de archivos. Docker proporciona la opción de línea de comandos --rm
para este propósito:
docker run --rm ubuntu cat /etc/hosts
Esto creará un contenedor a partir de la imagen "ubuntu", mostrará el contenido del archivo / etc / hosts y luego eliminará el contenedor inmediatamente después de que salga. Esto ayuda a evitar tener que limpiar los contenedores después de que haya terminado de experimentar.
Nota: el indicador
--rm
no funciona junto con el--detach
-d
(--detach
) en la ventana acoplable <1.13.0.
Cuando se --rm
indicador --rm
, Docker también elimina los volúmenes asociados con el contenedor cuando se elimina el contenedor. Esto es similar a la ejecución de docker rm -v my-container
. Sólo se eliminan los volúmenes que se especifican sin un nombre .
Por ejemplo, con la docker run -it --rm -v /etc -v logs:/var/log centos /bin/produce_some_logs
, el volumen de /etc
se eliminará, pero el volumen de /var/log
no se eliminará. Los volúmenes heredados a través de --volumes-from se eliminarán con la misma lógica: si el volumen original se especificó con un nombre, no se eliminará.
Especificando un nombre
De forma predeterminada, los contenedores creados con la docker run
small_roentgen
docker run
reciben un nombre aleatorio como small_roentgen
o modest_dubinsky
. Estos nombres no son particularmente útiles para identificar el propósito de un contenedor. Es posible proporcionar un nombre para el contenedor al pasar la opción de línea de comando --name
:
docker run --name my-ubuntu ubuntu:14.04
Los nombres deben ser únicos; Si pasa un nombre que otro contenedor ya está usando, Docker imprimirá un error y no se creará ningún contenedor nuevo.
Especificar un nombre será útil al hacer referencia al contenedor dentro de una red Docker. Esto funciona tanto para contenedores Docker de fondo como de fondo.
Los contenedores en la red puente predeterminada deben estar vinculados para comunicarse por nombre.
Enlace de un puerto de contenedor al host
docker run -p "8080:8080" myApp
docker run -p "192.168.1.12:80:80" nginx
docker run -P myApp
Para poder usar los puertos en el host se han expuesto en una imagen (a través de la directiva EXPOSE
Dockerfile, o --expose
opción de línea de comandos para la docker run
--expose
docker run
), esos puertos deben vincularse al host mediante el comando -p
o -P
Opciones de línea. El uso de -p
requiere que se especifique el puerto particular (y la interfaz de host opcional). El uso de la opción de línea de comando en mayúscula -P
obligará a Docker a vincular todos los puertos expuestos en la imagen de un contenedor al host.
Política de reinicio del contenedor (iniciando un contenedor en el arranque)
docker run --restart=always -d <container>
De forma predeterminada, Docker no reiniciará los contenedores cuando se reinicie el demonio Docker, por ejemplo, después de reiniciar el sistema host. Docker proporciona una política de reinicio para sus contenedores al proporcionar la opción de línea de comandos --restart
. Suministrar --restart=always
hará que se reinicie un contenedor después de reiniciar el demonio Docker. Sin embargo, cuando ese contenedor se detiene manualmente (p. Ej., Con la docker stop <container>
), la política de reinicio no se aplicará al contenedor.
Se pueden especificar varias opciones para la opción --restart
, según el requisito ( --restart=[policy]
). Estas opciones afectan también a cómo se inicia el contenedor en el arranque.
Política | Resultado |
---|---|
no | El valor por defecto . No reiniciará el contenedor automáticamente, cuando se detiene el contenedor. |
en falla [: max-reintentos] | Reinicie solo si el contenedor sale con un error ( non-zero exit status ). Para evitar reiniciarlo indefinidamente (en caso de algún problema), se puede limitar el número de reintentos de reinicio que intenta el daemon Docker. |
siempre | Siempre reinicie el contenedor independientemente del estado de salida. Cuando especifique always , el demonio Docker intentará reiniciar el contenedor de forma indefinida. El contenedor también se iniciará siempre en el inicio del daemon, independientemente del estado actual del contenedor. |
a menos que sea detenido | Siempre reinicie el contenedor independientemente de su estado de salida, pero no lo inicie en el inicio del daemon si el contenedor se ha puesto en un estado detenido anteriormente. |
Ejecutar un contenedor en segundo plano
Para mantener un contenedor ejecutándose en segundo plano, suministre la opción de línea de comando -d
durante el inicio del contenedor:
docker run -d busybox top
La opción -d
ejecuta el contenedor en modo separado. También es equivalente a -d=true
.
Un contenedor en modo separado no puede eliminarse automáticamente cuando se detiene, esto significa que no se puede usar la opción --rm en combinación con la opción -d.
Asignar un volumen a un contenedor
Un volumen Docker es un archivo o directorio que persiste más allá de la vida útil del contenedor. Es posible montar un archivo o directorio de host en un contenedor como un volumen (sin pasar por el UnionFS).
Agregue un volumen con la opción de línea de comando -v
:
docker run -d -v "/data" awesome/app bootstrap.sh
Esto creará un volumen y lo montará en la ruta /data
dentro del contenedor.
- Nota: Puede usar la bandera
--rm
para eliminar automáticamente el volumen cuando se elimina el contenedor.
Montaje de directorios de host
Para montar un archivo o directorio host en un contenedor:
docker run -d -v "/home/foo/data:/data" awesome/app bootstrap.sh
- Al especificar un directorio de host, se debe proporcionar una ruta absoluta.
Esto montará el directorio host /home/foo/data
en /data
dentro del contenedor. Este volumen de "directorio de host montado en enlace" es lo mismo que un mount --bind
Linux mount --bind
y, por lo tanto, monta temporalmente el directorio de host en la ruta del contenedor especificada durante la vida útil del contenedor. Los cambios en el volumen desde el host o el contenedor se reflejan inmediatamente en el otro, porque son el mismo destino en el disco.
Ejemplo de UNIX montando una carpeta relativa
docker run -d -v $(pwd)/data:/data awesome/app bootstrap.sh
Nombrar volúmenes
Se puede nombrar un volumen al proporcionar una cadena en lugar de una ruta de directorio de host, la ventana acoplable creará un volumen con ese nombre.
docker run -d -v "my-volume:/data" awesome/app bootstrap.sh
Después de crear un volumen con nombre, el volumen se puede compartir con otros contenedores con ese nombre.
Configurando variables de entorno
$ docker run -e "ENV_VAR=foo" ubuntu /bin/bash
Tanto -e
como --env
se pueden usar para definir variables de entorno dentro de un contenedor. Es posible suministrar muchas variables de entorno utilizando un archivo de texto:
$ docker run --env-file ./env.list ubuntu /bin/bash
Ejemplo de archivo de variable de entorno:
# This is a comment
TEST_HOST=10.10.0.127
El --env-file
toma un nombre de archivo como argumento y espera que cada línea tenga el formato VARIABLE=VALUE
, imitando el argumento pasado a --env
. Las líneas de comentario solo tienen que estar prefijadas con #
.
Independientemente del orden de estos tres indicadores, el --env-file
se procesa primero y luego los indicadores -e
/ --env
. De esta manera, cualquier variable de entorno suministrada individualmente con -e
o --env
reemplazará las variables proporcionadas en el archivo de texto --env-var
.
Especificando un nombre de host
De forma predeterminada, los contenedores creados con la ejecución de la ventana acoplable reciben un nombre de host aleatorio. Puede darle al contenedor un nombre de host diferente pasando la marca --hostname:
docker run --hostname redbox -d ubuntu:14.04
Ejecutar un contenedor de forma interactiva.
Para ejecutar un contenedor de forma interactiva, pase las opciones -it
:
$ docker run -it ubuntu:14.04 bash
root@8ef2356d919a:/# echo hi
hi
root@8ef2356d919a:/#
-i
mantiene STDIN abierto, mientras que -t
asigna un pseudo-TTY.
Ejecutar contenedor con memoria / límites de intercambio
Establecer límite de memoria y desactivar el límite de intercambio
docker run -it -m 300M --memory-swap -1 ubuntu:14.04 /bin/bash
Establecer tanto la memoria como el límite de intercambio. En este caso, el contenedor puede usar 300M de memoria y 700M de intercambio.
docker run -it -m 300M --memory-swap 1G ubuntu:14.04 /bin/bash
Obtener un shell en un contenedor en ejecución (separado)
Inicie sesión en un contenedor en ejecución
Un usuario puede ingresar un contenedor en ejecución en un nuevo shell de bash interactivo con el comando exec
.
Supongamos que un contenedor se llama jovial_morse
luego puede obtener un shell bash pseudo-TTY interactivo ejecutando:
docker exec -it jovial_morse bash
Inicie sesión en un contenedor en ejecución con un usuario específico
Si desea ingresar un contenedor como usuario específico, puede configurarlo con el parámetro -u
o --user
. El nombre de usuario debe existir en el contenedor.
-u, --user
usuario o UID (formato:<name|uid>[:<group|gid>]
)
Este comando iniciará sesión en jovial_morse
con el usuario dockeruser
docker exec -it -u dockeruser jovial_morse bash
Inicie sesión en un contenedor en ejecución como root
Si desea iniciar sesión como root, simplemente use el parámetro -u root
. El usuario root siempre existe.
docker exec -it -u root jovial_morse bash
Iniciar sesión en una imagen
También puede iniciar sesión en una imagen con el comando de run
, pero esto requiere un nombre de imagen en lugar de un nombre de contenedor.
docker run -it dockerimage bash
Iniciar sesión en una imagen intermedia (depuración)
También puede iniciar sesión en una imagen intermedia, que se crea durante una compilación de Dockerfile.
Salida de docker build .
$ docker build .
Uploading context 10240 bytes
Step 1 : FROM busybox
Pulling repository busybox
---> e9aa60c60128MB/2.284 MB (100%) endpoint: https://cdn-registry-1.docker.io/v1/
Step 2 : RUN ls -lh /
---> Running in 9c9e81692ae9
total 24
drwxr-xr-x 2 root root 4.0K Mar 12 2013 bin
drwxr-xr-x 5 root root 4.0K Oct 19 00:19 dev
drwxr-xr-x 2 root root 4.0K Oct 19 00:19 etc
drwxr-xr-x 2 root root 4.0K Nov 15 23:34 lib
lrwxrwxrwx 1 root root 3 Mar 12 2013 lib64 -> lib
dr-xr-xr-x 116 root root 0 Nov 15 23:34 proc
lrwxrwxrwx 1 root root 3 Mar 12 2013 sbin -> bin
dr-xr-xr-x 13 root root 0 Nov 15 23:34 sys
drwxr-xr-x 2 root root 4.0K Mar 12 2013 tmp
drwxr-xr-x 2 root root 4.0K Nov 15 23:34 usr
---> b35f4035db3f
Step 3 : CMD echo Hello world
---> Running in 02071fceb21b
---> f52f38b7823e
Observe que ---> Running in 02071fceb21b
salida ---> Running in 02071fceb21b
, puede iniciar sesión en estas imágenes:
docker run -it 02071fceb21b bash
Pasando stdin al contenedor
En casos como la restauración de un volcado de base de datos, o el deseo de enviar información a través de una tubería desde el host, puede usar la -i
como un argumento para la docker run
docker exec
o la docker run
docker exec
.
Por ejemplo, suponiendo que desea colocar un volcado de base de datos que tenga en el dump.sql
en un dump.sql
, en un archivo local dump.sql
, puede ejecutar el siguiente comando:
docker exec -i mariadb bash -c 'mariadb "-p$MARIADB_PASSWORD" ' < dump.sql
En general,
docker exec -i container command < file.stdin
O
docker exec -i container command <<EOF
inline-document-from-host-shell-HEREDOC-syntax
EOF
Desprendimiento de un contenedor
Mientras está conectado a un contenedor en ejecución con un pty asignado ( docker run -it ...
), puede presionar Control P - Control Q para separar.
Anulando la directiva de punto de entrada de imagen
docker run --name="test-app" --entrypoint="/bin/bash" example-app
Este comando anulará la directiva ENTRYPOINT
de la imagen de la example-app
cuando se cree la test-app
del contenedor. La directiva CMD
de la imagen no se modificará a menos que se especifique lo contrario:
docker run --name="test-app" --entrypoint="/bin/bash" example-app /app/test.sh
En el ejemplo anterior, tanto el ENTRYPOINT
como el CMD
de la imagen se han anulado. Este proceso contenedor se convierte en /bin/bash /app/test.sh
.
Añadir entrada de host al contenedor
docker run --add-host="app-backend:10.15.1.24" awesome-app
Este comando agrega una entrada al /etc/hosts
del contenedor, que sigue el formato --add-host <name>:<address>
. En este ejemplo, el nombre de la app-backend
se resolverá a 10.15.1.24
. Esto es particularmente útil para unir programáticamente diferentes componentes de aplicaciones.
Evitar que el contenedor se detenga cuando no se ejecutan comandos
Un contenedor se detendrá si no se ejecuta ningún comando en el primer plano. El uso de la opción -t
evitará que el contenedor se detenga, incluso cuando se desconecta con la opción -d
.
docker run -t -d debian bash
Parando un contenedor
docker stop mynginx
Además, la identificación del contenedor también se puede usar para detener el contenedor en lugar de su nombre.
Esto detendrá un contenedor en ejecución enviando la señal SIGTERM y luego la señal SIGKILL si es necesario.
Además, el comando kill se puede usar para enviar inmediatamente un SIGKILL o cualquier otra señal especificada usando la opción -s
.
docker kill mynginx
Señal especificada:
docker kill -s SIGINT mynginx
Detener un contenedor no lo borra. Usa la docker ps -a
para ver tu contenedor detenido.
Ejecutar otro comando en un contenedor en ejecución
Cuando sea necesario, puede decirle a Docker que ejecute comandos adicionales en un contenedor que ya esté en ejecución usando el comando exec
. Necesitas la identificación del contenedor que puedes obtener con docker ps
.
docker exec 294fbc4c24b3 echo "Hello World"
Puede adjuntar un shell interactivo si usa la opción -it
.
docker exec -it 294fbc4c24b3 bash
Ejecutar aplicaciones GUI en un contenedor de Linux
De forma predeterminada, un contenedor Docker no podrá ejecutar una aplicación GUI.
Antes de eso, el socket X11 debe reenviarse primero al contenedor, de modo que se pueda usar directamente. La variable de entorno DISPLAY también se debe reenviar:
docker run -v /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY=unix$DISPLAY <image-name>
Esto fallará al principio, ya que no configuramos los permisos para el host del servidor X:
cannot connect to X server unix:0
La forma más rápida (pero no la más segura) es permitir el acceso directamente con:
xhost +local:root
Después de terminar con el contenedor, podemos volver al estado original con:
xhost -local:root
Otra forma (más segura) es preparar un Dockerfile que construirá una nueva imagen que utilizará nuestras credenciales de usuario para acceder al servidor X:
FROM <iamge-name>
MAINTAINER <you>
# Arguments picked from the command line!
ARG user
ARG uid
ARG gid
#Add new user with our credentials
ENV USERNAME ${user}
RUN useradd -m $USERNAME && \
echo "$USERNAME:$USERNAME" | chpasswd && \
usermod --shell /bin/bash $USERNAME && \
usermod --uid ${uid} $USERNAME && \
groupmod --gid ${gid} $USERNAME
USER ${user}
WORKDIR /home/${user}
Al invocar la docker build
desde la línea de comando, debemos pasar las variables ARG que aparecen en el Dockerfile:
docker build --build-arg user=$USER --build-arg uid=$(id -u) --build-arg gid=$(id -g) -t <new-image-with-X11-enabled-name> -f <Dockerfile-for-X11> .
Ahora, antes de generar un nuevo contenedor, tenemos que crear un archivo xauth con permiso de acceso:
xauth nlist $DISPLAY | sed -e 's/^..../ffff/' | xauth -f /tmp/.docker.xauth nmerge -
Este archivo debe montarse en el contenedor al crearlo / ejecutarlo:
docker run -e DISPLAY=unix$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix -v /tmp/.docker.xauth:/tmp/.docker.xauth:rw -e XAUTHORITY=/tmp/.docker.xauth