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


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow