Notas de estudio de Docker | Comandos comunes

Directorio de artículos

Este tutorial está basado en Docker y modificado en Silicon Valley
inserte la descripción de la imagen aquí

¿Qué es Docker?

La tecnología de virtualización de contenedores que resuelve el problema del entorno operativo y el contenedor de software de configuración, facilita la integración continua y contribuye al lanzamiento general.

La configuración del entorno es tan problemática que si cambia una máquina, tiene que hacerlo todo de nuevo, lo que requiere mucho trabajo y tiempo. Mucha gente piensa, ¿se puede resolver el problema de manera fundamental y el software se puede instalar con el entorno? Es decir, al instalar, copiar exactamente el entorno original. Con Docker, los desarrolladores pueden eliminar el problema de "funciona en mi máquina" al codificar.

[Falló la transferencia de la imagen del enlace externo, el sitio de origen puede tener un mecanismo anti-leeching, se recomienda guardar la imagen y cargarla directamente (img-UgNhgjBy-1584000574509)(en-resource://database/8251:1)]

Filosofía Docker

Docker es un proyecto de código abierto en la nube basado en el lenguaje Go.

El objetivo principal de Docker es "Crear, enviar y ejecutar cualquier aplicación, en cualquier lugar", que es hacer que la aplicación del usuario (que puede ser una aplicación WEB o una aplicación de base de datos), etc.) y su entorno operativo puedan lograr "un paquete , correr por todos lados ".

La aparición de la tecnología de contenedores de Linux resuelve ese problema y Docker se desarrolla sobre la base de ello. Ejecute la aplicación en el contenedor de Docker, y el contenedor de Docker es consistente en cualquier sistema operativo, lo que permite que sea multiplataforma y multiservidor. Solo necesita configurar el entorno una vez y puede implementarlo en otra máquina con un solo clic, lo que simplifica enormemente la operación.

Qué se puede hacer

La máquina virtual (máquina virtual) es una solución con instalación de entorno.
Desventajas de las máquinas virtuales: alto uso de recursos, muchos pasos redundantes, inicio lento

Debido a estas deficiencias de la máquina virtual anterior, Linux ha desarrollado otra tecnología de virtualización: Linux Containers (Linux Containers, abreviado como LXC).

En lugar de simular un sistema operativo completo , los contenedores de Linux aíslan los procesos. Con contenedores, es posible empaquetar todos los recursos necesarios para que el software se ejecute en un contenedor aislado. A diferencia de una máquina virtual, un contenedor no necesita incluir un sistema operativo completo, sino solo los recursos de la biblioteca y la configuración necesaria para que el software funcione. De este modo, el sistema se vuelve eficiente y liviano y garantiza que el software implementado en cualquier entorno pueda ejecutarse de manera consistente.

Compare las diferencias entre Docker y los métodos de virtualización tradicionales:

  • La tecnología de máquina virtual tradicional consiste en virtualizar un conjunto de hardware, ejecutar un sistema operativo completo en él y luego ejecutar el proceso de aplicación requerido en el sistema;

  • El proceso de la aplicación en el contenedor se ejecuta directamente en el kernel del host. El contenedor no tiene su propio kernel y no hay virtualización de hardware. Por lo tanto, los contenedores son más portátiles que las máquinas virtuales tradicionales.

  • Cada contenedor está aislado entre sí y cada contenedor tiene su propio sistema de archivos. Los procesos entre contenedores no se afectarán entre sí y los recursos informáticos se pueden distinguir.

Composición básica de Docker

  • Una imagen de Docker (Imagen) es una plantilla de solo lectura. Las imágenes se pueden usar para crear contenedores Docker y una imagen puede crear muchos contenedores.

  • Docker utiliza un contenedor (Container) para ejecutar una aplicación o un grupo de aplicaciones de forma independiente. Un contenedor es una instancia en ejecución creada a partir de una imagen . Se puede iniciar, iniciar, detener, eliminar. Cada contenedor es una plataforma aislada y segura. El contenedor se puede considerar como una versión simple del entorno Linux (que incluye autoridad de usuario raíz, espacio de proceso, espacio de usuario y espacio de red, etc.) y las aplicaciones que se ejecutan en él. La definición de un contenedor es casi la misma que la de una imagen, y también es una perspectiva unificada de una pila de capas. La única diferencia es que la capa superior del contenedor se puede leer y escribir.

  • El almacén (Repositorio) es un lugar donde los archivos de imágenes se almacenan de forma centralizada.
    Existe una diferencia entre un almacén (Repositorio) y un servidor de registro de almacén (Registro). A menudo hay varios almacenes almacenados en el servidor de registro de almacenes, y cada almacén contiene varias imágenes, y cada imagen tiene una etiqueta diferente (etiqueta).
    Los almacenes se dividen en almacenes públicos (Public) y almacenes privados (Private). El repositorio público más grande es Docker Hub , que almacena una gran cantidad de imágenes para que los usuarios las descarguen. Los almacenes públicos nacionales incluyen Alibaba Cloud, NetEase Cloud, etc.

Instalar en Linux

documento oficial

documento oficial chino

Instalar Docker en CentOS 6.8

  1. yum install -y epel-release
    Docker se lanza utilizando EPEL. El sistema operativo del sistema RHEL primero debe asegurarse de que el almacén de EPEL ya esté disponible; de ​​lo contrario, primero verifique la versión del sistema operativo y luego instale el paquete EPEL correspondiente.

  2. iniciar la instalación:yum install -y docker-io

  3. Ubicación del archivo de configuración después de la instalación:/etc/sysconfig/docker

  4. Inicie el servicio en segundo plano de Docker:service docker start

  5. Verifique la versión de Docker:docker version

Instalar Docker en CentOS 7

Si no es root, anteponga el comando consudo

  1. Asegúrese de que el sistema sea CentOS7 y superior:cat /etc/redhat-release
    inserte la descripción de la imagen aquí

  2. Desinstalar la versión anterior:

 yum remove docker \
                  docker-common \
                  docker-selinux \
                  docker-engine

Si yum informa que ninguno de estos paquetes está instalado, esto es normal.

  1. Yum instala gcc relacionado:
yum -y install gcc
yum -y install gcc-c++
  1. Instalar los paquetes necesarios
yum install -y yum-utils device-mapper-persistent-data lvm2
  1. (Ignorado) Modificar la dirección espejo proporcionada en el documento oficial.

Tenga en cuenta que la dirección reflejada proporcionada en el documento oficial aún puede ser de acceso lento, por lo que debe usar la imagen reflejada de Alibaba Cloud

  1. (Ignorado) Actualizar el índice del paquete yum:yum makecache fast

  2. Instale la última versión de Docker CE:yum install docker-ce

Si la instalación falla, por favor Baidu: instalación de la imagen de la ventana acoplable

  1. O instalar una versión específica:

    1. Lista de versiones disponibles:
      yum list docker-ce.x86_64 --showduplicates | sort -r
      inserte la descripción de la imagen aquí
    2. Para instalar una versión específica, agregue la cadena de la versión al nombre del paquete, separándolos con un guión (-):
      yum install docker-ce-<VERSION>
  2. Iniciar ventana acoplable: systemctl start docker

  3. Verificar Docker: versión docker
    inserte la descripción de la imagen aquí

  4. HelloWorld: docker run hello-worldal ejecutar hello-world, Docker primero verifica si la imagen se necesita localmente y no la extrae automáticamente del almacén y la ejecuta.
    inserte la descripción de la imagen aquí

Si la carga es lenta, consulte el siguiente tutorial para configurar el acelerador del espejo

Aceleración de imagen oficial de Docker China

descripción oficial

A través de la aceleración de imágenes oficial de Docker, los usuarios en China pueden acceder rápidamente a las imágenes de Docker más populares. La imagen está alojada en China continental y los usuarios locales ahora disfrutarán de velocidades de descarga más rápidas y una mayor estabilidad, lo que permitirá un desarrollo y una entrega más ágiles de las aplicaciones dockerizadas.

Se puede acceder a la aceleración de imagen oficial de Docker China a través de registration.docker-cn.com. Este repositorio solo contiene espejos públicos populares. Las imágenes privadas aún deben extraerse del registro de EE. UU.

Puede usar el siguiente comando para extraer directamente desde la dirección de aceleración de la imagen:

docker pull registry.docker-cn.com/myname/myrepo:mytag

Por ejemplo:

docker pull registry.docker-cn.com/library/ubuntu:16.04

Nota: a menos que haya modificado los --registry-mirrorparámetros del demonio Docker (consulte a continuación), deberá especificar el nombre de la imagen oficial en su totalidad. Por ejemplo, biblioteca/ubuntu, biblioteca/redis, biblioteca/nginx.

Configure el demonio Docker con --registry-mirror

Puede configurar el demonio de Docker para usar la aceleración de imágenes oficial de Docker de forma predeterminada. De esta forma, puede acelerar la extracción de imágenes a través de la imagen oficial de forma predeterminada, en lugar de especificarla cada vez que extrae registry.docker-cn.com.

Puede pasar argumentos cuando se inicia el demonio Docker --registry-mirror:

docker --registry-mirror=https://registry.docker-cn.com daemon

Para hacer que los cambios sean permanentes, puede editar /etc/docker/daemon.jsonel archivo y agregar la clave de espejos de registro.

{
    
    
  "registry-mirrors": ["https://registry.docker-cn.com"]
}

Después de modificar y guardar, reinicie Docker para que la configuración surta efecto:systemctl restart docker

Nota: También puede usar Docker para Mac y Docker para Windows para configurarlo.

Aceleración del espejo de la nube de Alibaba

En vista del problema de la red doméstica, es muy lento extraer la imagen de Docker más adelante. Es posible que debamos configurar el acelerador para resolverlo. Utilizo la dirección de la imagen de mi propia cuenta en Alibaba Cloud (debe registrarse y tener su propia dirección del acelerador)

  1. Registre una cuenta de Aliyun (la cuenta de Taobao está disponible): https://dev.aliyun.com/search.html

  2. Busque [Servicio de duplicación de contenedores] en la consola de administración
    inserte la descripción de la imagen aquí

  3. Cree un enlace para obtener la dirección del acelerador: https://cr.console.aliyun.com/cn-hangzhou/mirrors
    inserte la descripción de la imagen aquí

  4. Configurar Docker nativo de CentOS6.8 para ejecutar el acelerador de espejo

    1. Modifique la configuración de Docker:vim /etc/sysconfig/docker
    2. Configure su propia dirección de aceleración de Alibaba Cloud enother_args="--registry-mirror=https://你自己的账号加速地址.mirror.aliyuncs.com"
      inserte la descripción de la imagen aquí
    3. Reinicie el servicio Docker:service docker restart
    4. Verifique que la configuración se haya realizado correctamente: ps -ef | grep docker. Si el siguiente enlace del acelerador aparece en el resultado, prueba que la configuración es exitosa.
      inserte la descripción de la imagen aquí
  5. Acelerador de imagen de configuración de CentOS7 : para los usuarios cuya versión del cliente de Docker sea superior a 1.10.0, puede usar el acelerador modificando el archivo de configuración del daemon /etc/docker/daemon.json

    1. Edite el archivo de configuración de Docker:vi /etc/docker/daemon.json
    2. Añadir dirección de acelerador
      inserte la descripción de la imagen aquí
    3. reiniciar ventana acoplable
systemctl daemon-reload
systemctl restart docker

¡La configuración está completa! !

principio subyacente

  • ¿como trabajar?
    Docker es un sistema con una estructura Cliente-Servidor. El daemon Docker se ejecuta en el host y se accede desde el cliente a través de una conexión Socket. El daemon acepta comandos del cliente y administra los contenedores que se ejecutan en el host. Un contenedor es un entorno de tiempo de ejecución, que es el contenedor que mencionamos anteriormente.

  • ¿Por qué Docker es más rápido que las máquinas virtuales?
  1. Docker tiene menos capas de abstracción que las máquinas virtuales. Dado que la ventana acoplable no necesita un hipervisor para realizar la virtualización de recursos de hardware, los programas que se ejecutan en el contenedor de la ventana acoplable utilizan directamente los recursos de hardware de la máquina física real. Por lo tanto, Docker tendrá ventajas obvias en eficiencia en términos de utilización de CPU y memoria.
  2. Docker utiliza el kernel de la máquina host sin necesidad de un sistema operativo invitado. Por lo tanto, al crear un nuevo contenedor, Docker no necesita recargar un kernel de sistema operativo como una máquina virtual. Aún evitando el proceso de arranque y carga del kernel del sistema operativo que requiere mucho tiempo y recursos, al crear una nueva máquina virtual, el software de la máquina virtual necesita cargar el sistema operativo invitado, y este nuevo proceso lleva unos minutos. Sin embargo, docker omite este proceso porque usa directamente el sistema operativo de la máquina host, por lo que solo toma unos segundos crear un nuevo contenedor docker.

inserte la descripción de la imagen aquí

Comandos comunes

Comienza el servicio

CentOS6: use el comando chkconfig.

Inicie el servicio: service docker start
Arranque automático: chkconfig docker on
Desactive el inicio automático:chkconfig docker off


CentOS7: use habilitar y deshabilitar en systemctl

Inicie el servicio: systemctl start docker
Arranque automático: systemctl enable docker
Desactive el inicio automático:systemctl disable docker

comando de ayuda

Comando de ayuda de Docker: docker --help
Comando detallado de Docker: docker COMMAND --help
Ver versión: docker version
Estadísticas de Docker:docker info

comando de espejo

Enumere todas las imágenes en esta máquina: imágenes

inserte la descripción de la imagen aquí

  • Descripción de cada opción:
    • REPOSITORIO: Representa la fuente del almacén duplicado
    • TAG: la etiqueta de la imagen
    • ID DE LA IMAGEN: imagen
    • IDCREATED: hora de creación de la imagen
    • TAMAÑO: tamaño de la imagen

Nota : en el comando Docker IMAGEpuede hacer referencia a REPOSITORY, IMAGE ID,REPOSITORY:TAG

La misma fuente de almacén puede tener múltiples TAG, que representan diferentes versiones de la fuente de almacén. Usamos REPOSITORY:TAGpara definir diferentes imágenes. Si no especifica una etiqueta de versión para un espejo, por ejemplo, si solo usa ubuntu, la ventana acoplable usará ubuntu:latestel espejo de forma predeterminada.

inserte la descripción de la imagen aquí

  • OPCIONES Descripción:
    -a: enumera todas las imágenes locales (incluidas las capas de imágenes intermedias)
    -q: solo muestra la identificación de la imagen.
    --digests: muestra información resumida de la imagen
    --no-trunc: muestra información completa de la imagen
Espejo de búsqueda: buscar

Buscar manualmente desde el repositorio espejo de Docker: Docker Hub

Orden:docker search [OPTIONS] 镜像名字

  • OPCIONES descripción:
    -f, --filter filter: filtrar la salida de acuerdo con las condiciones proporcionadas
    –format string: usa la plantilla Go para formatear la cadena bastante imprimir búsqueda
    –limit int: limita el número de resultados de búsqueda (predeterminado 25)
    –no-trunc: no truncar la salida
Descargar espejo: tirar

Comando: docker pull 镜像名字[:TAG]
Ejemplo:
Descargar imagen: docker pull tomat, equivalente a docker pull tomat:latest
descargar la versión especificada:docker pull tomcat:7.0

Necesita consultar la versión/ETIQUETA de la imagen, vaya a Docker Hub para buscar

Eliminar espejo por ID: rmi

Orden:docker rmi [OPTIONS] IMAGE [IMAGE...]

  • OPCIONES descripción:
    -f, --force : Forzar la eliminación del espejo
    –no-prune : No eliminar el espejo padre sin marcar

Ejemplo:
Eliminar espejos a la fuerza: docker rmi -f hello-world
Eliminar múltiples espejos docker rmi hello-world nginx:latest
Eliminar todos los espejos: docker rmi -f $(docker images -qa), de hecho, recupere todos los ID de espejo en el subcomando y luego ejecute la eliminación

comando contenedor

Hay un espejo para crear un contenedor, que es la premisa fundamental (descarga una demostración de espejo de CentOS):docker pull centos

Crear e iniciar el contenedor: ejecutar

Orden:docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

  • OPCIONES descripción (comúnmente usadas): algunas son un signo menos, otras son dos signos menos
    –name=”nuevo nombre del contenedor”: especifique un nombre para el contenedor
    -d: ejecute el contenedor en segundo plano y devuelva la ID del contenedor, es decir, inicie el contenedor daemon ;
    -i: Ejecute el contenedor en modo interactivo, generalmente se usa con -t
    -t: reasigna un terminal de pseudo-entrada para el contenedor, generalmente se usa con -i
    -P : Asignación aleatoria de puertos
    -p : Especifica la asignación de puertos, hay los siguientes cuatro formatos

    ip:hostPort:containerPort
    ip::containerPort
    hostPort:containerPort
    containerPort
    

Ejemplo:
Start tomcat: docker run -it -p 8888:8080 tomcatindica que el puerto 8888 del host está asignado al puerto 8080 del contenedor, de modo que se puede acceder al contenedor a través del puerto 8888. 主机IP:8888Es decir, puede acceder a tomcat a través del enlace:

inserte la descripción de la imagen aquí

Tenga en cuenta que los puertos correspondientes deben abrirse para que otros hosts accedan

Ejecute el contenedor centos en modo interactivo

docker run -it centos
ps -ef

El id del comando ejecutado es consistente con el id del contenedor en ejecución, indicando que está en el contenedor centos
inserte la descripción de la imagen aquí

Lista de contenedores en ejecución: ps

Orden:docker ps [OPTIONS]

  • Descripción de OPCIONES (comúnmente utilizado):
    -a: lista todos los contenedores que se están ejecutando actualmente + aquellos que se han ejecutado en el historial (sin este parámetro, significa que se están ejecutando)
    -l: muestra el contenedor creado recientemente.
    -n: muestra los últimos n contenedores creados.
    -q: Modo silencioso, solo muestra el número del contenedor.
    --no-trunc : No truncar la salida.

Ejemplo:
Mostrar contenedores creados recientemente: docker ps -l
Mostrar los últimos 3 contenedores creados:docker ps -n 3
inserte la descripción de la imagen aquí

  • Descripción de cada opción:
    • ID DEL CONTENEDOR: ID del contenedor
    • IMAGEN: nombre de la imagen
    • COMANDO: el comando a ejecutar
    • CREADO: tiempo de creación del contenedor
    • ESTADO: estado de inicio
    • PUERTOS: mapeo de puertos
    • NOMBRES: nombre del contenedor

Nota : en el comando Docker CONTAINERpuede hacer referencia a CONTAINER ID,NAMES

Salir del contenedor: salir

Cuando inicie sesión en un contenedor Docker, exitsalga y detenga el contenedor con el comando

Otra forma de salir: la tecla de acceso directo ctrl+P+Qpuede hacer que el contenedor salga sin detenerse

Ejemplo: Interactuar con el contenedor centos y salir
inserte la descripción de la imagen aquí
Salir con la tecla de acceso directo:
inserte la descripción de la imagen aquí

Si la tecla de acceso directo no funciona, verifique si la tecla de acceso directo está ocupada

Inicie el contenedor: inicio

Orden:docker start [OPTIONS] CONTAINER [CONTAINER...]

Ejemplo:docker start 容器ID或者容器名
inserte la descripción de la imagen aquí

Reiniciar el contenedor: reiniciar

Orden:docker restart [OPTIONS] CONTAINER [CONTAINER...]

Ejemplo:docker restart 容器ID或者容器名

Detener el contenedor: detener

Orden:docker stop [OPTIONS] CONTAINER [CONTAINER...]

Ejemplo:docker stop 容器ID或者容器名

Contenedor de parada forzada: matar

Orden:docker kill [OPTIONS] CONTAINER [CONTAINER...]

Ejemplo:docker kill 容器ID或者容器名

Eliminar contenedor: rm

Orden:docker rm [OPTIONS] CONTAINER [CONTAINER...]

  • Descripción de OPCIONES:
    -f : eliminar a la fuerza el contenedor en ejecución
    -l, --link : eliminar el enlace especificado
    -v, --volumes : eliminar el volumen asociado con el contenedor

Ejemplo:
eliminar un solo contenedor: docker rm 容器ID
eliminar múltiples contenedores: docker rm -f $(docker ps -a -q)
eliminar múltiples contenedores 2: docker ps -a -q | xargs docker rm: asignar el resultado de la consulta a xargs

orden importante

comando contenedor

Inicie el contenedor daemon: ejecutar

Siguiendo el contenedor de inicio anterior, use uno de sus parámetros -dpara configurarlo en modo de protección

Orden:docker run -d 容器名

Use un espejo centos:latestpara iniciar un contenedor en modo de fondo
Ejemplo: docker run -d centos【Ejemplo de error】


Pregunta : ¡Pasar docker ps -aencontrará que el contenedor ha salido!
Un punto muy importante: si desea que un contenedor Docker se ejecute en segundo plano, debe haber un proceso en primer plano.
Si los comandos que ejecuta el contenedor no son los que se han suspendido (como ejecutar top, tail), se ejecutarán automáticamente. salida.

Este es un problema de mecanismo de docker, como su contenedor web, tomamos nginx como ejemplo, en circunstancias normales, solo necesitamos iniciar el servicio correspondiente para configurar el servicio de inicio. Por ejemplo service nginx start, al hacerlo, nginx se ejecuta en el modo de proceso en segundo plano, lo que da como resultado que ninguna aplicación se ejecute en el primer plano de la ventana acoplable. Después de que dicho contenedor se inicie en segundo plano, se suicidará inmediatamente porque cree que no tiene nada que hacer. Entonces, la mejor solución es: Ejecute el programa que desea ejecutar como un proceso en primer plano:docker run -it centos

Ver registros de contenedores: registros

Orden:docker logs [OPTIONS] CONTAINER

  • OPCIONES descripción:
    --detalles: muestra detalles adicionales proporcionados al registro
    -f, --seguir: seguir la última salida del registro
    --since string: mostrar registros desde la marca de tiempo (por ejemplo: 2013-01-02T13:23:37) o Relacionado logs
    –tail string: el número de líneas que se mostrarán desde el final del registro (mostrar todo de forma predeterminada)
    -t, --timestamps: mostrar las marcas de tiempo
    –hasta cadena: mostrar los registros antes de la marca de tiempo (como 2013-01-02T13: 23:37)

Ejemplo:
Mostrar registros de contenedores: docker logs 容器ID/名称
Mostrar registros de contenedores de forma dinámica:

  1. Ejecute el contenedor y ejecute el script de shell para que no esté inactivo y no elimine el proceso:
    docker run -d centos /bin/sh -c "while true;do echo hello docker;sleep 2;done"

  2. Ver registros: solicitud para mostrar los últimos tres registros, mostrar las marcas de tiempo y la salida del registro de seguimiento
    docker logs --tail 3 -t -f 13617502c43e

Ver el proceso en ejecución en el contenedor: top

Orden:docker top CONTAINER [ps OPTIONS]

Ejemplo:docker top hungry_feistel
inserte la descripción de la imagen aquí

Ver los detalles internos del contenedor: inspeccionar

Orden:docker inspect [OPTIONS] NAME|ID [NAME|ID...]

  • OPCIONES descripción:
    -f, --format string : use la plantilla de Go dada para formatear la salida
    -s, --size : si el tipo es un contenedor, muestre el tamaño total del archivo
    –type string : devuelva JSON del tipo especificado

Ejemplo:
Ver el directorio montado con el host físico:docker inspect --format "{ {.Mounts}}" 容器ID
inserte la descripción de la imagen aquí

  • Otra forma de ver: docker inspect 容器ID | grep Mounts -A 10
    significa encontrar monturas y mostrar 10 líneas
    inserte la descripción de la imagen aquí
Ingrese un contenedor en ejecución e interactúe: adjuntar/exec

Orden:docker attach [OPTIONS] CONTAINER

Ejemplo:
reingreso al contenedor:docker attach 容器ID


Orden:docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

  • OPCIONES Descripción:
    -d, --detach: modo de desconexión: ejecutar comando en segundo plano
    --detach-keys string: anular la secuencia de teclas para el contenedor desconectado
    -e, --env list: establecer la variable de entorno
    -i, --interactive: incluso Mantener STDIN abierto incluso sin conexión
    --privileged: otorga privilegios extendidos a los comandos
    -t, --tty: asigna un pseudo-terminal
    -u, --user string: nombre de usuario o UID (en el formato: <nombre|uid>[: < group|gid>])
    -w, --workdir string : directorio de trabajo dentro del contenedor

Ejemplo: docker exec 13617502c43e ls -l: Es equivalente a ejecutar el comando en el contenedor ls -ly regresar a la máquina local


Entonces, ¿cuál es la diferencia entre adjuntar y ejecutar?

  • adjuntar ingresa directamente a la terminal del comando de inicio del contenedor y no inicia un nuevo proceso
  • exec es abrir una nueva terminal en el contenedor y comenzar un nuevo proceso

Es decir, el comando de adjuntar ingresará al contenedor, mientras que exec puede ejecutar directamente el comando y mostrar el resultado sin ingresar al contenedor.


Al mismo tiempo, los siguientes dos comandos indican ingresar al contenedor

docker attach 容器ID
docker exec -t 容器ID /bin/bash
Copie el contenedor y el archivo host: cp

Orden:
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH

Ejemplo:
docker cp 容器ID:容器内路径 目的主机路径: docker cp d641bbb4438b:/usr/test.txt ./
docker cp 目的主机路径 容器ID:容器内路径:docker cp ./test.txt d641bbb4438b:/

inserte la descripción de la imagen aquí

imagen acoplable

La imagen de Docker es un UnionFS (Union File System)

Union file system (UnionFS) es un sistema de archivos en capas, liviano y de alto rendimiento, que admite la modificación del sistema de archivos como un envío para superponer capa por capa, y puede montar diferentes directorios en el mismo sistema de archivos virtual (unir varios directorios en un solo sistema de archivos virtual).

El sistema de archivos Union es la base de las imágenes de Docker. Las imágenes se pueden heredar a través de capas. Basándose en la imagen base (sin una imagen principal), se pueden crear varias imágenes de aplicaciones específicas. Características: cargue varios sistemas de archivos al mismo tiempo, pero desde el exterior, solo se puede ver un sistema de archivos. La carga conjunta superpondrá los sistemas de archivos de cada capa, de modo que el sistema de archivos final contendrá todos los archivos y directorios subyacentes.

Principio de carga de imágenes de Docker

La imagen acoplable es un paquete de software ligero, ejecutable e independiente que se utiliza para empaquetar el entorno operativo del software y el software desarrollado en función del entorno operativo . Contiene todo lo necesario para ejecutar un determinado software, incluido el código, el tiempo de ejecución y las bibliotecas. , variables de entorno y Archivos de configuración.

El espejo en realidad está compuesto de sistemas de archivos capa por capa, esta capa del sistema de archivos UnionFS.

El bootfs (sistema de archivos de arranque) incluye principalmente el cargador de arranque y el kernel. El cargador de arranque se usa principalmente para cargar el kernel. Cuando se inicia Linux, cargará el sistema de archivos bootfs. La capa inferior de la imagen de Docker es bootfs. Esta capa es la misma que nuestro sistema Linux/Unix típico, incluido el cargador de arranque y el kernel. Cuando se completa la carga de arranque, todo el kernel está en la memoria. En este momento, el derecho a usar la memoria se ha transferido de bootfs al kernel. En este momento, el sistema también desinstalará bootfs.

rootfs (sistema de archivos raíz), además de bootfs. Contiene directorios y archivos estándar como /dev, /proc, /bin, /etc en un sistema Linux típico. Rootfs es una variedad de diferentes distribuciones de sistemas operativos, como Ubuntu, Centos, etc.
inserte la descripción de la imagen aquí

Por lo general, el CentOS que instalamos en la máquina virtual es de varios G, ¿por qué aquí solo hay 200M para Docker? ?
inserte la descripción de la imagen aquí

Para un sistema operativo optimizado, el rootfs puede ser muy pequeño y solo necesita incluir los comandos, las herramientas y las bibliotecas de programas más básicos. Debido a que la capa subyacente usa directamente el kernel del host, solo necesita proporcionar el rootfs. Se puede ver que para diferentes distribuciones de Linux, el bootfs es básicamente el mismo, pero el rootfs será diferente, por lo que diferentes distribuciones pueden compartir el bootfs.

reflejo en capas

Toma nuestro pull como ejemplo Durante el proceso de descarga, podemos ver que la imagen de la ventana acoplable parece descargarse capa por capa.
inserte la descripción de la imagen aquí


¿Por qué la imagen de Docker adopta esta estructura en capas?

Uno de los mayores beneficios es compartir recursos.

Por ejemplo, si se crean varias imágenes a partir de la misma imagen base, el host solo necesita guardar una imagen base en el disco y cargar una imagen base en la memoria para servir a todos los contenedores. Y cada capa de la imagen se puede compartir.

Características de la imagen de Docker

Las imágenes de Docker son todas de solo lectura . Cuando se inicia el contenedor, se carga una nueva capa grabable encima de la imagen. Esta capa generalmente se denomina "capa contenedora", y todo lo que se encuentra debajo de la "capa contenedora" se denomina "capa espejo".

Compromiso de copia espejo: compromiso

Cree una nueva imagen basada en los cambios del contenedor y use docker commit para enviar una copia del contenedor para convertirlo en una nueva imagen

Orden:docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

  • Descripción de OPCIONES:
    -a, --cadena de autor: establece el nombre del autor
    -c, --cambio de lista: aplica las directivas de Dockerfile a la imagen creada
    -m, --cadena de mensaje: registro de confirmación
    -p, --pausa: pausa durante la confirmación del contenedor ( predeterminado verdadero)

Ejemplo:

docker commit -m="提交的描述信息" -a="作者" 容器ID 要创建的目标镜像名:[标签名]

docker commit -a "theliang" -m "del tomcat docs" 155a8af163cf atguigu/tomcat01:1.2

docker imagesPuedes ver la imagen que acabas de crear con el comando
inserte la descripción de la imagen aquí

volumen de datos del contenedor

Primero echemos un vistazo a la filosofía de Docker:

  • Empaquete la aplicación y el entorno de ejecución en un contenedor para ejecutar, y la ejecución puede ir acompañada del contenedor, pero esperamos que el requisito de datos sea persistente.
  • Es deseable tener la posibilidad de compartir datos entre contenedores

Si los datos generados por el contenedor de Docker no se transforman en una nueva imagen a través de la confirmación de Docker, de modo que los datos se guarden como parte de la imagen, cuando se elimine el contenedor, los datos desaparecerán naturalmente. Para guardar datos en la ventana acoplable, usamos volúmenes .

Similar a los archivos rdb y aof en Redis

efecto

Un volumen es un directorio o archivo que existe en uno o más contenedores y Docker lo monta en el contenedor, pero no pertenece al sistema de archivos conjuntos, por lo que puede pasar por alto el Sistema de archivos de unión para proporcionar algunas características para el almacenamiento persistente o compartido. datos:

El propósito del diseño del volumen es la persistencia de los datos, que es completamente independiente del ciclo de vida del contenedor, por lo que Docker no eliminará el volumen de datos montado por él cuando se elimine el contenedor.

Características:

  1. Los volúmenes de datos pueden compartir o reutilizar datos entre contenedores
  2. Los cambios en el volumen pueden tener efecto directamente
  3. Los cambios en el volumen de datos no se incluirán en la actualización del espejo
  4. El ciclo de vida de un volumen de datos dura hasta que no haya contenedores que lo utilicen.

volumen de datos

Agregue volumen de datos directamente: ejecute -v

Orden:docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名

Ejemplo: docker run -it -v /myDataVolume:/dataVolumeContainer centos
significa: asociar la carpeta myDataVolume en el directorio raíz del host con el directorio dataVolumeContainer en el directorio raíz del contenedor (la carpeta se creará automáticamente después de ejecutar el comando)

  • Compruebe si el volumen de datos se montó correctamente:docker inspect 容器ID
    inserte la descripción de la imagen aquí

    • La nueva versión comprueba si el volumen de datos se montó correctamente:
      inserte la descripción de la imagen aquí
  • Otros métodos de visualización: docker inspect --format "{ {.Config.Volumes}}" 容器ID
    la información que se muestra aquí es solo la información del volumen de datos local del contenedor docker y la información de ubicación del directorio de montaje del host físico asociado con él. Utilice la siguiente información para ver:
    docker inspect -f "{ {.Mounts}}" 容器ID

  • También se muestra usando grep:docker inspect 容器ID | grep Mounts -A 10

  • Intercambio de datos entre contenedores y hosts:
    inserte la descripción de la imagen aquí

  • Después de que el contenedor se detenga y salga, si los datos del host se sincronizan después de la modificación: Sí
    inserte la descripción de la imagen aquí


Ejemplo: comando con permiso:
docker run -it -v /宿主机绝对路径目录:/容器内目录:ro 镜像名
aquí hay un :rosolo lectura adicional, lo que significa que el contenedor solo tiene permiso de solo lectura y no puede modificar el archivo.
inserte la descripción de la imagen aquí

Creación de Dockerfile: construir

Rol: Cree una imagen desde Dockerfile
Comando:docker build [OPTIONS] PATH | URL | -

  • OPCIONES descripción:
    -f, --file string: especifique Dockerfile, el archivo llamado Dockerfile en PATH se usará de manera predeterminada
    -t, --tag list: nombre y etiqueta (opcional), formato:name:tag

En aras de la portabilidad y el uso compartido , -v 主机目录:容器目录este método no se puede implementar directamente en Dockerfile.

Dado que el directorio del host depende de un host específico, no se puede garantizar que dicho directorio específico exista en todos los hosts.

Ejemplo: De acuerdo con los centos de la imagen, agregue dos volúmenes de datos (envueltos con una capa) para generar una nueva imagen

  1. Cree un archivo en el directorio raíz: /mydocker/dockerfile1, con el siguiente contenido:
    inserte la descripción de la imagen aquí
# volume test
FROM centos
VOLUME ["/dataVolumeContainer1","/dataVolumeContaioner2"]
CMD ECHO "finished,----------success1"
CMD /bin/bash
  1. Ejecutando una orden:docker build -f /mydocker/dockerfile1 --tag liang/centos .
    inserte la descripción de la imagen aquí

Tenga en cuenta que hay un punto en el comando, que indica la posición actual

  1. Puede ver la nueva imagen generada a través de imágenes acoplables
    inserte la descripción de la imagen aquí

Al mismo tiempo, puede notar que después de ejecutar el comando de compilación, se generará una ID DE IMAGEN, que es la ID de imagen generada final.
inserte la descripción de la imagen aquí

  1. Iniciar una nueva imagen: puede ver que se han creado dos volúmenes de datos en el contenedor
    inserte la descripción de la imagen aquí

A través de los pasos anteriores, ya se conoce la dirección del directorio del volumen en el contenedor, pero ¿dónde está la dirección del directorio del host correspondiente?
Solución: puede ver los detalles del contenedor a través de inspeccionar, y las operaciones detalladas inspect示例、直接添加数据卷示例se dan en

inserte la descripción de la imagen aquí

Entonces, después de abrir la dirección predeterminada del host, puede operar en el archivo
inserte la descripción de la imagen aquí

Observaciones: Docker monta el directorio host Aparece el acceso a Docker
cannot open directory .: Permission denied
Solución: agregue un --privileged=trueparámetro más después de montar el directorio
docker run -it -v /myDataVolume:/dataVolumeContainer --privileged=true centos

contenedor de volumen de datos

El contenedor nombrado monta el volumen de datos, y otros contenedores realizan el intercambio de datos montando este (contenedor principal).El contenedor que monta el volumen de datos se llama contenedor de volumen de datos.

En otras palabras, el disco duro activo se monta en el disco duro activo para realizar la dependencia transitiva de los datos.

Compartir entre contenedores: ejecutar --volumes-from

Orden:dockeer run -it --name 子容器ID --volumes-from 父容器ID 容器名

Ejemplo: Para crear un contenedor de volumen de datos

  1. Primero cree un contenedor principal, podemos usar el creado en el ejemplo anterior liang/centoscomo plantilla:
    docker run -it --name dc01 theliang/centos

  2. Cree contenedores secundarios (dc02 y dc03), heredándolos de dc01
    docker run -it --name dc02 --volumes-from dc01 liang/centos

En este punto, los dos volúmenes de datos en el contenedor dc01 pueden ser compartidos por sus subcontenedores y los datos pueden compartirse entre ellos a través de los volúmenes de datos.


punto importante:

  • Después de eliminar el contenedor principal dc01, después de modificar dc02, dc03 aún puede acceder al volumen de datos
  • Después de eliminar dc02, dc03 aún puede acceder al volumen de datos
  • Cree dc04 para heredar dc03 y luego elimine dc03, dc04 aún puede acceder al volumen de datos

Resumen: Para la transferencia de información de configuración entre contenedores, el ciclo de vida del volumen de datos continúa hasta que ningún contenedor lo utiliza .

Relacionado con la red Docker

Modo de red de Docker

Docker actualmente admite los siguientes 5 modos de red:

Cuando docker run crea un contenedor Docker, puede usar la opción -net para especificar el modo de red del contenedor.

  • modo host: se usa -net=hostpara especificar. La red se comparte con el host. En este momento, el contenedor no utiliza el espacio de nombres de la red. Todos los dispositivos del host, como Dbus, estarán expuestos al contenedor, por lo que existen riesgos de seguridad.
  • modo contenedor: se usa -net=container:NAME_or_IDpara especificar. Especifica compartir la red con una instancia de contenedor.
  • modo ninguno: se utiliza -net=nonepara especificar. Si no se configura ninguna red, significa que no hay una tarjeta de red configurada en el contenedor y el usuario puede configurarla manualmente.
  • modo puente: se utiliza para -net=bridgeespecificar la configuración predeterminada. En este momento, el motor de la ventana acoplable creará un par veth, un extremo está conectado a la instancia del contenedor y se denomina eth0, y el otro extremo está conectado al puente especificado (como docker0), por lo que la instancia del contenedor en el mismo host es conectados al mismo puente, pueden comunicarse entre sí. Cuando se crea el contenedor, se crea automáticamente una regla SNAT para la comunicación entre el contenedor y el mundo exterior. Si el usuario utiliza el puerto -p o -Pe, también se creará una regla de asignación de puerto correspondiente.
  • Modo personalizado: use una red personalizada, puede usarla para docker network createcrear y admitir una variedad de controladores de red de forma predeterminada, los usuarios pueden crear libremente una red puente o una red superpuesta.

El modo predeterminado es el modo puente y la dirección de red es 172.17.0.0/16. Las instancias de contenedor en el mismo host pueden comunicarse, pero no entre hosts.

modo anfitrión

Si se utiliza el modo de host al iniciar el contenedor, el contenedor no obtendrá un espacio de nombres de red independiente, sino que compartirá un espacio de nombres de red con el host. El contenedor no virtualizará su propia tarjeta de red, configurará su propia IP, etc., sino que utilizará la IP y el puerto del host.

modo contenedor

Este modo especifica que un contenedor recién creado comparte un espacio de nombres de red con un contenedor existente en lugar de compartirlo con el host. El contenedor recién creado no creará su propia tarjeta de red, ni configurará su propia IP, sino que compartirá la IP, el rango de puertos, etc. con un contenedor específico. De manera similar, además de los aspectos de red de los dos contenedores, otras cosas, como los sistemas de archivos y las listas de procesos, aún están aisladas. Los procesos de los dos contenedores pueden comunicarse a través del dispositivo de la tarjeta de red.

ningún modo

Este modo es diferente a los dos anteriores. En este modo, el contenedor de Docker tiene su propio espacio de nombres de red; sin embargo, no se realiza ninguna configuración de red para el contenedor de Docker. Es decir, este contenedor Docker no tiene tarjeta de red, IP, enrutamiento y otra información. Necesitamos agregar una tarjeta de red, configurar IP, etc. para el contenedor Docker por nosotros mismos.

Modo Puente

El modo puente es la configuración de red predeterminada de Docker. Este modo asignará el espacio de nombres de la red, establecerá la IP, etc. para cada contenedor y conectará un contenedor Docker en un host a un puente de red virtual.

Cuando se inicie el servidor Docker, se creará un puente de red virtual llamado docker0 en el host y el contenedor Docker iniciado en este host se conectará a este puente virtual. El modo de trabajo del puente virtual es similar al de un conmutador físico, de modo que todos los contenedores del host están conectados a una red de capa 2 a través del conmutador.

El siguiente paso es asignar una IP al contenedor, Docker seleccionará una dirección IP y una subred diferente de la máquina host del segmento de red IP privado definido por RFC1918 para asignar a docker0, y el contenedor conectado a docker0 se seleccionará desde este subred Se utiliza una IP desocupada. En general, Docker usará el segmento de red 172.17.0.0/16 y asignará 172.17.42.1/16 al puente docker0 (puede ver docker0 usando el comando ifconfig en el host, y puede considerarse como la interfaz de administración del puente.Se utiliza como una tarjeta de red virtual en la máquina host)

Cuando se crea un contenedor Docker, se crean un par de interfaces de pares veth al mismo tiempo (cuando se envía un paquete de datos a una interfaz, la otra interfaz también puede recibir el mismo paquete de datos). Un extremo de este par de interfaces está en el contenedor, es decir, eth0, el otro extremo es local y está montado en el puente docker0, y el nombre comienza con veth (por ejemplo, vethAQI2QT). De esta forma, el host puede comunicarse con el contenedor y los contenedores pueden comunicarse entre sí. Docker crea una red virtual compartida entre el host y todos los contenedores.

inserte la descripción de la imagen aquí

Comunicación entre diferentes contenedores en el mismo host

Aquí, la comunicación entre diferentes contenedores en el mismo host utiliza principalmente el modo Docker bridge (Puente). La interfaz del puente se ejecuta localmente en un host Docker separado y es el mecanismo detrás de los tres métodos de conexión que mencionamos más adelante.

$ ifconfig docker0
docker0   Link encap:Ethernet  HWaddr 56:84:7a:fe:97:99  
          inet addr:172.17.42.1  Bcast:0.0.0.0  Mask:255.255.0.0
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
Método de conexión
  • Método 1: puede comunicarse utilizando la dirección IP del contenedor. Este método resultará en la codificación de la dirección IP, lo cual es un inconveniente para la migración, y la dirección IP puede cambiar después de reiniciar el contenedor, a menos que se use una dirección IP fija.
  • Método 2: puede comunicarse a través de la IP del host y el número de puerto expuesto por el contenedor. Este método es relativamente simple y solo puede depender de que el proceso escuche en el puerto expuesto para una comunicación limitada.
  • Método 3: puede usar el nombre del contenedor para comunicarse a través del mecanismo de enlace de Docker. De esta manera, el mecanismo de enlace de la ventana acoplable puede comunicarse con otro contenedor a través de un nombre. El mecanismo de enlace facilita que el contenedor descubra otros contenedores y puede transferir de forma segura cierta información de conexión a otros contenedores. Use el nombre para darle al contenedor un alias para facilitar su memoria y uso. Incluso si el contenedor se reinicia y la dirección cambia, no afectará la conexión entre los dos contenedores.
# 查看容器的内部IP
$ docker inspect --format='{
    
    {.NetworkSettings.IPAddress}}' $CONTAINER_ID
# Elasticsearch容器
$ docker inspect --format='{
    
    {.NetworkSettings.IPAddress}}' 4d5e7a1058de
172.17.0.2
# Kibana容器
$ docker inspect --format='{
    
    {.NetworkSettings.IPAddress}}' 4f26e64bfe82
172.17.0.4

Método 1: use la dirección IP del contenedor para comunicarse

# 进入Kibana容器
$ docker exec -it 4f26e64bfe82 /bin/bash
# 在Kibana容器使用ES容器的IP地址来访问ES服务
$ curl -XGET 'http://172.17.0.2:9200/_cat/health?pretty'
1493707223 06:40:23 ben-es yellow 1 1 11 11 0 0 11 0 - 50.0%

Método 2: use la IP del host más el número de puerto expuesto por el contenedor para comunicarse

# 进入Kibana容器
$ docker exec -it 4f26e64bfe82 /bin/bash
# 在Kibana容器使用宿主机的IP地址来访问ES服务(我这里本机的IP地址是10.10.1.129)
$ curl -XGET 'http://10.10.1.129:9200/_cat/health?pretty'
1493707223 06:40:23 ben-es yellow 1 1 11 11 0 0 11 0 - 50.0%

Método 3: use el mecanismo de enlace de Docker para comunicarse

# 先启动ES容器,并且使用--name指定容器名称为:elasticsearch_2.x_yunyu
$ docker run -itd -p 9200:9200 -p 9300:9300 --name elasticsearch_2.x_yunyu birdben/elasticsearch_2.x:v2
# 启动Kibana容器,并且使用--link指定关联的容器名称为ES的容器名称:elasticsearch_2.x_yunyu
$ docker run -itd -p 5601:5601 --link elasticsearch_2.x_yunyu --name kibana_4.x_yunyu birdben/kibana_4.x:v2
# 查看运行的容器
$ docker ps
CONTAINER ID        IMAGE                               COMMAND                  CREATED             STATUS              PORTS
4f26e64bfe82        birdben/kibana_4.x:v2               "docker-entrypoint..."   25 hours ago        Up 15 minutes       0.0.0.0:5601->5601/tcp                                                       kibana_4.x_yunyu
4d5e7a1058de        birdben/elasticsearch_2.x:v2        "docker-entrypoint..."   26 hours ago        Up 19 hours         0.0.0.0:9200->9200/tcp, 0.0.0.0:9300->9300/tcp                               elasticsearch_2.x_yunyu
# 在Kibana容器使用--link的容器名称来访问ES服务
$ curl -XGET 'http://elasticsearch_2.x_yunyu:9200/_cat/health?pretty'
1493707223 06:40:23 ben-es yellow 1 1 11 11 0 0 11 0 - 50.0%

De hecho, el mecanismo -link consiste en agregar una resolución de nombre de contenedor ES al archivo /etc/hosts en el contenedor Docker. Con esta resolución de nombres, puede comunicarse con el contenedor de destino sin usar IP. Además, cuando el contenedor de destino se reinicie, Docker se encargará de actualizar el archivo /etc/hosts, para que no tenga que preocuparse por la dirección IP. cambiando después de que el contenedor se reinicie Resuelva el problema que no puede tener efecto.

El archivo /etc/hosts para el contenedor Kibana

127.0.0.1       localhost
::1     localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.2      4d5e7a1058de

Archivo /etc/hosts para el contenedor ES

127.0.0.1       localhost
::1     localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.2      elasticsearch_2.x_yunyu 4d5e7a1058de
172.17.0.4      4f26e64bfe82

Cuando Docker introduce nuevas funciones de red, el mecanismo de enlace se vuelve algo redundante, pero para ser compatible con versiones anteriores, la función del mecanismo de enlace en la red predeterminada permanece sin cambios. Después de que Docker introduce nuevas funciones de red, un DNS incorporado Servidor, pero solo Este servidor DNS funcionará solo después de que el usuario cree una red personalizada.

Comunicación entre diferentes contenedores a través de hosts

(continuará)

Uso de composición de Docker

(continuará)

Dockerfile

Dockerfile es un archivo de compilación que se usa para crear una imagen de Docker y es un script compuesto por una serie de comandos y parámetros.

inserte la descripción de la imagen aquí

Construye tres pasos

  1. Escribir Dockerfile
  2. compilación de la ventana acoplable
  3. ejecución de la ventana acoplable

Tomemos como ejemplo el contenedor centos Imágenes oficiales de Docker
inserte la descripción de la imagen aquí

inserte la descripción de la imagen aquí

Análisis del proceso de compilación de DockerFile

reglas básicas:

  1. Cada instrucción de palabra reservada debe estar en mayúsculas y seguida de al menos un parámetro
  2. Las instrucciones se ejecutan secuencialmente de arriba a abajo
  3. #Representa comentarios
  4. Cada comando crea una nueva capa de imagen y confirma la imagen

Docker ejecuta el proceso general de Dockerfile

  1. docker ejecuta un contenedor desde una imagen base
  2. Ejecutar una instrucción y realizar cambios en el contenedor.
  3. docker commitConfirme una nueva capa de imagen haciendo algo como
  4. docker ejecuta un nuevo contenedor basado en la imagen que acaba de enviar
  5. Ejecute la siguiente instrucción en el dockerfile hasta que se ejecuten todas las instrucciones

Desde la perspectiva del software de aplicación, Dockerfile, Docker image y Docker container representan tres etapas diferentes del software:

  • Dockerfile es la materia prima del software
  • Las imágenes de Docker son productos de software
  • El contenedor Docker se puede considerar como el estado de ejecución del software.

El Dockerfile está orientado al desarrollo, la imagen de Docker se convierte en el estándar de entrega y el contenedor de Docker implica la implementación, operación y mantenimiento. Los tres son indispensables y trabajan juntos para servir como la piedra angular del sistema Docker.
inserte la descripción de la imagen aquí

  1. Dockerfile, debe definir un Dockerfile, que define todo lo que necesita el proceso. El contenido involucrado en Dockerfile incluye la ejecución de código o archivos, variables de entorno, paquetes dependientes, entorno de tiempo de ejecución, biblioteca de enlaces dinámicos, distribución del sistema operativo, proceso de servicio y proceso del kernel (cuando el proceso de la aplicación necesita lidiar con los servicios del sistema y los procesos del kernel, esta necesidad para considerar cómo diseñar el control de permisos del espacio de nombres) y así sucesivamente;
  2. Imagen de Docker, después de definir un archivo con Dockerfile, se generará una imagen de Docker durante la compilación de Docker, y cuando se ejecute la imagen de Docker, en realidad comenzará a proporcionar servicios;
  3. Contenedores Docker, los contenedores brindan servicios directamente.

Arquitectura DockerFile (instrucciones de palabras reservadas)

ADD: copie los archivos del directorio del host en la imagen y el comando ADD procesará automáticamente la URL y descomprimirá el archivo tar
CMD: especifique un comando para ejecutar cuando se inicie el contenedor. Puede haber varias instrucciones CMD en el Dockerfile, pero solo la última uno tiene efecto CMD será reemplazado por los parámetros después de ejecutar la ventana acoplable
COPY: similar a AGREGAR, copiar archivos y directorios a la imagen. Copie el archivo/directorio desde la <ruta de origen> en el directorio de contexto de compilación a la ubicación de la <ruta de destino> en la imagen de la nueva capa
Arquitectura de DockerFile (instrucción de palabra reservada)
ENTRYPOINT: especifique un comando para ejecutar cuando se inicia un contenedor, ENTRYPOINT de El propósito es el mismo que CMD, que es especificar el programa de inicio del contenedor y los parámetros
ENV: se utiliza para establecer la variable de entorno durante el proceso de creación de la imagen
EXPOSE: el puerto expuesto por el contenedor actual
FROM: la imagen base, qué imagen es la nueva imagen actual basado en
MAINTAINER: el nombre y la dirección de correo electrónico del mantenedor de la imagen
ONBUILD: ejecute el comando al crear un Dockerfile heredado, la creación de la imagen principal se activa después de ser heredada por el hijo:
RUNel comando que debe ejecutarse cuando se crea el contenedor
VOLUME: el contenedor volumen de datos, utilizado para el trabajo de conservación y persistencia de datos
WORKDIR: después de crear el contenedor, el terminal iniciará sesión en el directorio de trabajo de forma predeterminada, un punto de apoyo

inserte la descripción de la imagen aquí


Algunos ejemplos:
ENV MY_PATH /usr/mytestEsta variable de entorno se puede usar en cualquier comando EJECUTAR posterior, al igual que el prefijo de la variable de entorno se especifica delante del comando; estas variables de entorno también se pueden usar directamente en otros comandos, como:WORKDIR $MY_PATH

COPY src dest| COPY ["src","dext"]Copie desde el directorio de contexto de compilación src a la ubicación dest en el espejo de la nueva capa

Comando de inicio de CMD:
el formato especificado por CMD es similar a EJECUTAR, y también hay dos formatos:

  • formato de concha:CMD <命令>
  • formato excel:CMD ["可执行文件","参数1","参数2"...]
  • Formato de lista de parámetros: CMD ["参数1","参数2"...]. Después de especificar el comando ENTERYPOINT, use CMD para especificar parámetros específicos

el caso

Imagen base: cero

El 99 % de las imágenes en Docker Hub se crean instalando y configurando el software necesario en la imagen base.

FROM scratch
inserte la descripción de la imagen aquí

Espejo personalizado: mycentos
  1. Imagen de CentOS predeterminada del concentrador
    inserte la descripción de la imagen aquí

Entonces, al personalizar la imagen de mycentos, tiene: ruta predeterminada después de iniciar sesión, editor vim, visualización de la configuración de red soporte ifconfig

  1. Cree y edite Dockerfile (la ruta de almacenamiento y el nombre del archivo pueden ser diferentes)
    inserte la descripción de la imagen aquí
    inserte la descripción de la imagen aquí
FROM centos                             # 基于CentOS镜像
MAINTAINER zzyy<[email protected]>       # 镜像维护者姓名和邮箱

ENV MYPATH /usr/local               # 设置环境变量
WORKDIR $MYPATH                  # 引用环境变量为默认工作目录

RUN yum -y install vim              # 构建时运行的命令:安装 vim
RUN yum -y install net-tools        # 构建时运行的命令:安装 net-tools,使之支持ifconfig

EXPOSE 80                               # 对外暴露的端口

CMD echo $MYPATH                    # 输出环境变量
CMD echo "success----------------OK"    # 输出提示信息
CMD /bin/bash                           # 执行 /bin/bash
  1. Construir: docker build -f /mydocker/Dockerfile -t 新镜像名字:TAG .. Nota: hay un punto al final del comando que indica la ruta actual. Si hay un archivo llamado Dockerfile en la ruta actual, puede omitirlo -fy sus parámetros
    inserte la descripción de la imagen aquí

inserte la descripción de la imagen aquí

  1. Ejecutar: docker run -it 新镜像名字:TAG
    como puede ver, nuestra nueva imagen ya es compatible con el comando vim/ifconfig y la extensión es exitosa.

inserte la descripción de la imagen aquí

  1. Enumere el historial de cambios de una imagen:docker history 镜像名

inserte la descripción de la imagen aquí

Caja espejo CMD/ENTRYPOINT

Ambos especifican el comando para ejecutar cuando se inicia un contenedor

  • CMD : puede haber varias instrucciones CMD en el Dockerfile, pero solo la última tiene efecto y CMD será reemplazada por los parámetros después de la ejecución de la ventana acoplable. Por ejemplo, el comando de ejecución predeterminado de tomcat es: CMD ["catalina.sh", "run"], si se agrega el comando al ejecutar: docker run -it -p 8888:8080 tomcat ls -l, el comando original se invalidará y no se iniciará.

  • PUNTO DE ENTRADA : docker runlos parámetros subsiguientes se pasarán a PUNTO DE ENTRADA como parámetros y luego formarán una nueva combinación de comandos


Ejemplo: hacer una versión CMD de un contenedor que pueda consultar información de IP

FROM centos
RUN yum install -y curl
CMD [ "curl", "-s", "https://www.ip.cn" ]

Tres pasos para construir El ejemplo anterior ya existe, así que no entraré en detalles aquí

inserte la descripción de la imagen aquí

explicación del comando crul:

  • El comando curl se puede usar para realizar operaciones como descargar, enviar varias solicitudes HTTP y especificar encabezados HTTP. Si el sistema no tiene curl, puede usarlo para yum install curlinstalarlo.
  • curl es enviar el archivo descargado a stdout
    usando el comando: curl http://www.baidu.com
    después de la ejecución, el código fuente html de www.baidu.com se mostrará en la pantalla

Este es el método más fácil de usar. Use este comando para obtener la página a la que apunta http://curl.haxx.se De manera similar, si la URL aquí apunta a un archivo o una imagen, se puede descargar directamente al local. Si la descarga es un documento HTML, de forma predeterminada solo se mostrará el encabezado del archivo, es decir, el encabezado del documento HTML. Para mostrar todo, agregue parámetros-i

inserte la descripción de la imagen aquí

Luego viene el problema, si queremos mostrar la información del encabezado HTTP, necesitamos agregar -iel parámetro, podemos ver el error de que no se puede encontrar el archivo ejecutable, archivo ejecutable no encontrado. Como dijimos antes, el comando sigue al nombre de la imagen y el valor predeterminado de CMD se reemplazará en tiempo de ejecución. Así que aquí -ireemplaza el CMD original, en lugar de agregarlo curl -s https://www.ip.cndespués del original. Y -ino es una orden en absoluto, por lo que, naturalmente, no se puede encontrar.

Si queremos agregar el parámetro -i, debemos volver a ingresar el comando por completo:
docker run myip curl -s https://www.ip.cn -i

Pero también podemos usar ENTROYPOINT para hacer un contenedor para consultar información de IP

FROM centos
RUN yum install -y curl
ENTRYPOINT [ "curl", "-s", "https://www.ip.cn" ]

En este punto, puede agregar parámetros directamente a la ejecución de la ventana acoplable

inserte la descripción de la imagen aquí

ejemplo ONBUILD

Ejecute el comando cuando construya un Dockerfile heredado, la creación de la imagen principal se activa después de que la imagen principal sea heredada por el hijo

FROM centos
RUN yum install -y curl
ENTRYPOINT [ "curl", "-s", "https://www.ip.cn" ]
ONBUILD RUN echo "now,build action is ok========="

Construye un espejo myip:

inserte la descripción de la imagen aquí

Cree un subcontenedor que herede del contenedor myip

FROM myip
RUN yum install -y curl
ENTRYPOINT [ "curl", "-s", "https://www.ip.cn" ]

inserte la descripción de la imagen aquí

Ejemplo de Tomcat: COPIAR/AÑADIR
  1. Crear un directorio:mkdir -p /zzyyuse/mydockerfile/tomcat9
  2. Hay los siguientes archivos en el directorio: Obtener por usted mismo, no es necesario

inserte la descripción de la imagen aquí

FROM centos
MAINTAINER zzyy<[email protected]>
# 把宿主机当前上下文的c.txt拷贝到容器/usr/local/路径下
COPY c.txt /usr/local/cincontainer.txt
# 把java与tomcat添加到容器中
ADD jdk-8u171-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.8.tar.gz /usr/local/
# 安装vim编辑器
RUN yum -y install vim
#设置工作访问时候的WORKDIR路径,登录落脚点
ENV MYPATH /usr/local
WORKDIR $MYPATH
# 配置java与tomcat环境变量
ENV JAVA_HOME /usr/local/jdk1.8.0_171
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.8
ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.8
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
# 容器运行时监听的端口
EXPOSE  8080
# 启动时运行tomcat
# ENTRYPOINT ["/usr/local/apache-tomcat-9.0.8/bin/startup.sh" ]
# CMD ["/usr/local/apache-tomcat-9.0.8/bin/catalina.sh","run"]
CMD /usr/local/apache-tomcat-9.0.8/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.8/bin/logs/catalina.out
  1. Construcción: preste atención al papel de AGREGAR y COPIAR en este proceso

inserte la descripción de la imagen aquí

inserte la descripción de la imagen aquí

  1. correr

inserte la descripción de la imagen aquí

inserte la descripción de la imagen aquí

  1. Publique la prueba del servicio web probado en combinación con el volumen del contenedor mencionado anteriormente: cree archivos web.xml y jsp

inserte la descripción de la imagen aquí

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns="http://java.sun.com/xml/ns/javaee"
  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
  id="WebApp_ID" version="2.5">
  
  <display-name>test</display-name>
</web-app>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
  </head>
  <body>
    -----------welcome------------
    <%="i am in docker tomcat self "%>
    <br>
    <br>
    <% System.out.println("=============docker tomcat self");%>
  </body>
</html>
  1. prueba

inserte la descripción de la imagen aquí

inserte la descripción de la imagen aquí

inserte la descripción de la imagen aquí

Operaciones comunes de contenedores

  1. Espejos de búsqueda:docker search NAME
  2. Saca la imagen:docker pull IMAGES
  3. Mira el espejo:docker images
  4. Inicie la imagen:docker run -d IMAGES
  5. Detener el contenedor:docker stop CONTAINER_ID
  6. Quitar contenedor:docker rm CONTAINER_ID

instalar centos

  1. Saca la imagen:docker pull centos
  2. Inicie el contenedor:docker run -itd --name CENTOS_NAME centos /bin/bash
  3. en el contenedor:docker exec CENTOS_NAME /bin/bash
  4. Salga del contenedor:ctrl + p + q

instalar tomcat

  1. Saca la imagen:docker pull tomcat:7
  2. Inicie el contenedor:docker run -d -p 8080:8080 tomcat:7

instalar mysql

  1. Saca la imagen:docker pull mysql:5.6
  2. Inicie el contenedor:docker run -d -p 3306:3306 mysql:5.6

Comience con un volumen de datos:

docker run -d -p 3306:3306 --name mysql \
-v /root/mysql/conf:/etc/mysql/conf.d \
-v /root/mysql/logs:/logs \
-v /root/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql:5.6

copias de seguridad:

docker exec myql服务容器ID 
sh -c ' exec mysqldump --all-databases -uroot -p"root" ' 
> /root/all-databases.sql

instalar redis

  1. Saca la imagen:docker pull redis

  2. Inicie el contenedor: docker run -d -p 6379:6379 redis redis-server --appendonly yes

  3. Ejecute el cliente redis:docker exec -it [运行着Rediis服务的容器ID] redis-cli

Comience con un volumen de datos:

docker run -d -p 6379:6379 \
-v /root/myredis/data:/data \
-v /root/myredis/conf/redis.conf:/usr/local/etc/redis/redis.conf \ 
redis redis-name /usr/local/etc/redis/redis.conf \
--appendonly yes

/root/myredis/conf/redis.confCree un nuevo archivo redis.conf en el directorio del host

vim /root/myredis/conf/redis.conf/redis.conf

Escriba el archivo de configuración redis.conf, la configuración no se proporcionará aquí y se completará después del inicio

instalar zookeeper

Zookeeper es un subproyecto de Apacahe Hadoop.Es un servicio de directorio tipo árbol que soporta change push.Es adecuado como centro de registro para los servicios de Dubbo.Tiene alta potencia industrial y puede ser utilizado en entornos de producción y es recomendable.

Por lo tanto, se requiere instalar las imágenes de zookeeper y dubbo-admin, y al mismo tiempo establecer una conexión entre estos dos contenedores.

  1. Saca la imagen:docker pull zookeeper
  2. Inicie el contenedor:
docker run -d \
--name zookeeper_name \
--restart always \
-p 2181:2181 \
-p 2888:2888 \
-p 3888:3888 \
zookeeper
  • --restart always: Como zookeeper "falla rápido", es mejor reiniciarlo siempre .
  • Esta imagen incluye EXPOSE 2181 2888 3888(puerto de cliente de zookeeper, seguir puerto, seleccionar puerto), por lo que la vinculación de contenedores estándar hará que esté disponible automáticamente para los contenedores vinculados.

Instalar dubbo-admin

Para permitir a los usuarios administrar y monitorear mejor muchos servicios de dubbo, el oficial proporciona un programa de monitoreo visual dubbo-admin, pero este monitoreo no afectará el uso incluso si no está instalado.

  1. Saca la imagen:docker pull chenchuxin/dubbo-admin
  2. Inicie el contenedor:
docker run -d \
-p 8080:8080 \
-e admin.registry.address=zookeeper://192.168.222.130:2181 \
-e dubbo.admin.root.password=root \
-e dubbo.admin.guest.password=guest \
--link [name:alias] \
chenchuxin/dubbo-admin 
  1. Prueba: Enlace de acceso: http://host IP:8080, ingrese la contraseña de la cuenta raíz

--link list: cuando se utiliza el método --link, el contenedor como cliente puede acceder al contenedor a través de la red privada. Al mismo tiempo, Docker establecerá algunas variables de entorno en el contenedor del cliente para registrar la IP y el PUERTO vinculados. En otras palabras, es equivalente a hacer los dos contenedores en la misma red.

Instalar RabbitMQ

  1. Saca la imagen:docker pull rabbitmq:3-management
  2. Inicie el contenedor:
docker run -d \
-p 5672:5672 \
-p 15672:15672 \
--name myrabbitmq \
rabbitmq:3-management
  • -managementTAG con una interfaz web
  • 5672 corresponde al puerto RabbitMQ
  • 15672 corresponde al puerto de acceso de la interfaz web de administración de RabbitMQ

Al acceder a: http://IP:15672, el nombre de usuario y la contraseña songuest

Instalar ElasticSearch

  1. Saca la imagen:docker pull elasticsearch
  2. Inicie el contenedor:
docker run -d \
-e ES_JAVA_OPTS="-Xms256m -Xmx256m" \
-p 9200:9200 \
-p 9300:9300 \
--name ES_name \
elasticsearch
  • -e ES_JAVA_OPTS: Indica la modificación de la memoria de la máquina virtual JVM para evitar el desbordamiento de memoria
  • 9200: puerto de comunicación http
  • 9300: Al crear un elasticsearch distribuido, el puerto de comunicación entre cada nodo

Las versiones superiores a 6.0 requieren espacio de memoria 2G de forma predeterminada.Si el sistema se ejecuta sin memoria 2G, se informará un error:

max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
elasticsearch用户拥有的内存权限太小,至少需要262144;

Solución:

  • correr:sysctl -w vm.max_map_count=262144
  • Ver resultados: sysctl -a|grep vm.max_map_count, se mostrarávm.max_map_count = 262144
  • Modificación permanente: /etc/sysctl.confagregue una línea al final del archivo vm.max_map_count=262144para realizar una modificación permanente

Publicar la imagen local en Alibaba Cloud

inserte la descripción de la imagen aquí

  1. Generación de imágenes: puedes usar el método anterior de Dockerfile. También puede usar el método de confirmación, como se muestra en el siguiente
    docker commit [OPTIONS] 容器ID [REPOSITORY[:TAG]]
    ejemplo:docker commit -a theliang -m "new mycentos 1.4 from 1.3 " 45e4aa594e06 mycentos:1.4

inserte la descripción de la imagen aquí

  1. Ingrese a la plataforma de desarrollo de Alibaba Cloud , cree una imagen de almacén y vincule la fuente del código (Github)

inserte la descripción de la imagen aquí

inserte la descripción de la imagen aquí

inserte la descripción de la imagen aquí

  1. Administre el almacén espejo, que contiene la guía de operación

inserte la descripción de la imagen aquí

  1. Establezca la contraseña de autorización de inicio de sesión (en el primer paso de la guía de operación, la contraseña utilizada para el aviso se establece aquí, ¡tenga en cuenta que no es su contraseña de inicio de sesión!)

inserte la descripción de la imagen aquí

  1. Inicio de sesión: siga el primer paso de la guía de operación y luego ingrese la contraseña establecida para iniciar sesión correctamente

inserte la descripción de la imagen aquí

  1. Empuje la imagen al Registro: [número de versión de la imagen] puede ser diferente de la ID de la IMAGEN

inserte la descripción de la imagen aquí
Después de seguir las instrucciones:

inserte la descripción de la imagen aquí
Puedes ver la imagen después de empujar en el almacén local

inserte la descripción de la imagen aquí
También se puede encontrar en la nube pública :

inserte la descripción de la imagen aquí
También es posible en [Consola] - [Mirror Library] - [Mirror Search]:

inserte la descripción de la imagen aquí

  1. Extraiga la imagen del Registro: abra la imagen que desea descargar en la búsqueda de imágenes, seleccione una dirección espejo y use el docker pullcomando para extraer la imagen

inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/the_liang/article/details/104821768
Recomendado
Clasificación