Cree rápidamente un entorno LNMP basado en Docker

TOC
https://docs.docker.com/

Prólogo

¿Qué es Docker?

Docker es un proyecto de software de código abierto que permite automatizar las aplicaciones implementadas en contenedores de software, proporcionando así una capa adicional de abstracción de software en el sistema operativo Linux y un mecanismo de gestión automática para la virtualización de la capa del sistema operativo . Docker utiliza el mecanismo de separación de recursos en el núcleo de Linux, como cgroups y el espacio de nombres del núcleo de Linux, para establecer contenedores de software independientes. Esto puede operar bajo una sola entidad de Linux, evitando la carga adicional de iniciar una máquina virtual.

Docker VS VM

El demonio Docker puede comunicarse directamente con el sistema operativo principal y asignar recursos para cada contenedor Docker; también puede aislar el contenedor del sistema operativo principal y aislar cada contenedor entre sí. La máquina virtual VM es el hipervisor principal del sistema operativo que virtualiza los recursos de hardware para crear un sistema suboperativo independiente, y los recursos no se comparten.

¿Por qué usar Docker?

1. Asegúrese de que el entorno de desarrollo fuera de línea, el entorno de prueba y el entorno de producción en línea sean consistentes.
2. En comparación con VM, tiene una velocidad de inicio rápida, una alta tasa de utilización de recursos y una baja sobrecarga de rendimiento.
3. DevOps
4. Microservicios . Un servicio solo hace una cosa.
5. Ejecuta automáticamente tareas repetitivas de configuración y configuración del entorno de desarrollo para facilitar el desarrollo. Las personas pueden centrarse en lo importante: crear un excelente software.

Conceptos relacionados con Docker

Imagen de la estatua

La imagen de Docker es una plantilla de solo lectura. Las imágenes se pueden usar para crear contenedores Docker.
Docker proporciona un mecanismo muy simple para crear una imagen o actualizar una imagen existente. Los usuarios pueden incluso descargar una imagen ya preparada directamente de otros y usarla directamente.
Espejo = OS + + entorno operativo software del programa de usuario
, por ejemplo: un espejo puede comprender un entorno de sistema operativo ubuntu completa, que sólo se instala Apache u otra aplicación requerida por el usuario.

Podemos crear una imagen escribiendo un Dockerfile.

Contenedor

Docker usa contenedores para ejecutar aplicaciones.
Un contenedor es una instancia en ejecución creada a partir de una imagen. Se puede iniciar, iniciar, detener y eliminar. Cada contenedor es una plataforma aislada que garantiza la seguridad.
Puede pensar en el contenedor como una versión simple del entorno Linux (incluidos los permisos de usuario raíz, el espacio de proceso, el espacio de usuario, el espacio de red, etc.) y las aplicaciones que se ejecutan en él.
Nota: La imagen es de solo lectura, el contenedor crea una capa grabable como la capa superior cuando se inicia .

Volumen de datos

Los volúmenes de datos le permiten conservar datos sin verse afectado por el ciclo de vida del contenedor.
El cambio de pensamiento que debe hacerse cuando se usa docker: el contenedor debe ser de corta duración y único.

Cuando se inicia el contenedor, se le asignará una IP privada aleatoria, y otros contenedores pueden usar esta dirección IP para comunicarse con él. Esto es importante por dos razones: una es que proporciona un canal para la comunicación mutua durante Rong, y la otra es que los contenedores compartirán una red local.
Para habilitar la comunicación entre contenedores, Docker le permite hacer referencia a otros contenedores existentes al crear un nuevo contenedor. El contenedor al que se hace referencia en el contenedor que acaba de crear obtendrá un alias (que usted especifica). Dijimos que los dos contenedores están unidos entre sí.
Por lo tanto, si el contenedor de base de datos ya se está ejecutando, podemos crear un contenedor de servidor web y hacer referencia al contenedor de base de datos al crearlo, dándole un alias, como dbapp. En este contenedor de servidor web recién creado, puedo usar el nombre de host dbapp para comunicarme con el contenedor de base de datos en cualquier momento.

Repositorio

Un almacén es un lugar donde los archivos de imágenes se almacenan centralmente. A veces, el almacén y el servidor de registro de almacén (Registro) están confundidos y no se distingue estrictamente. De hecho, múltiples almacenes a menudo se almacenan en el servidor de registro de almacén, y cada almacén contiene múltiples espejos, y cada espejo tiene una etiqueta diferente.
El almacén se divide en dos formas: almacén público (público) y almacén privado (privado).
El almacén público más grande es Docker Hub, que almacena una gran cantidad de imágenes para que los usuarios las descarguen. Los depósitos públicos nacionales incluyen Docker Pool, etc., que pueden proporcionar un acceso más estable y rápido para los usuarios del continente.
Por supuesto, los usuarios también pueden crear un almacén privado en la red local.
Después de que los usuarios creen su propia imagen, pueden usar el comando push para cargarla en un almacén público o privado, de modo que la próxima vez que usen esta imagen en otra máquina, solo necesiten sacarla del almacén.
Nota: El concepto del almacén Docker es similar a Git, y el servidor de registro puede entenderse como un servicio de alojamiento como GitHub.

Crear entorno LNMP basado en Docker

Descargar espejo

https://hub.docker.com/

docker pull bitnami/php-fpm    #下载最新php-fpm镜像,里面自带了最新版的php
docker pull nginx                      #下载最新nginx镜像
docker pull mysql                     #下载最新mysql镜像

Crea un disco de datos

https://docs.docker.com/storage/volumes/

imagen

Nota:
1. Si crea directamente, el archivo será administrado por el contenedor; de lo contrario, debe montar el directorio especificado
2. Los estudiantes que usan mac deben prestar atención, encontrará que esta ruta no se puede encontrar en la máquina, porque Mac Docker realmente se está ejecutando en el virtual en la máquina, por lo que necesita para entrar en la vista de la máquina virtual de estibador
screen ~/Library/Containers/com.docker.docker/Data/vms/0/tty
en este momento cd /var/lib/docker/volumes/learn/_data/se crea el volumen.
Si le resulta problemático, Mac puede omitir este paso

docker volume create learn
Aquí creamos directamente un disco de datos, y encontrará que la ruta real está en el directorio relacionado con la ventana acoplable

~/Documents/code/learn » docker volume inspect learn 
[
    {
        "CreatedAt": "2020-04-15T11:07:22Z",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/learn/_data",
        "Name": "learn",
        "Options": {},
        "Scope": "local"
    }
]

Crear una red

https://docs.docker.com/engine/reference/commandline/network_create/

Docker tiene los siguientes tipos de red:
puente: se utiliza para la comunicación entre contenedores independientes
host: utiliza directamente la red del host, y el puerto también utiliza la
superposición del host : cuando hay varios hosts docker,
macvlan de comunicación de contenedor entre hosts: cada uno contenedor tiene una dirección MAC virtual
ninguno: desactivar la red
por defecto, estibador crea una red de puente, cuando se crea un nuevo contenedor para llevar a cabo docker runcuando el puente se conectará automáticamente a la red, no se puede eliminar la red por defecto, Pero puedes crear uno nuevo.
Por defecto, Docker establecerá un puente, un host y una red ninguno:

~ » docker network ls
NETWORK ID NAME DRIVER SCOPE
a0bf815f3cb0 bridge bridge local
836b8a7368f8 host host local
8f2915cdc31a none null local


docker network create --subnet=172.54.0.0/24 lnmp #创建B类划分子网络,方便配置文件中直接使用容器名称

Crea php-fpm, nginx, mysql mirror

https://docs.docker.com/engine/reference/commandline/run/

docker run -d --name php -v learn:/var/www --net lnmp --restart=always bitnami/php-fpm
docker run -d --name nginx -p 80:80 -v learn:/var/www --net lnmp --restart=always nginx
docker run -d --name mysql --restart=always -p3306:3306 -e MYSQL_ROOT_PASSWORD=123456 --net lnmp mysql

Bajo mac:

docker run -d --name php -v /Users/lixin/Documents/code/learn:/var/www --net lnmp --restart=always bitnami/php-fpm
docker run -d --name nginx -p 80:80 -v /Users/lixin/Documents/code/learn:/var/www --net lnmp --restart=always nginx
docker run -d --name mysql --restart=always -p3306:3306 -e MYSQL_ROOT_PASSWORD=123456 --net lnmp mysql

Modificar archivo de configuración

#导出文件
docker cp default.conf nginx:/etc/nginx/conf.d/default.conf
#导入文件
docker cp nginx:/etc/nginx/conf.d/default.conf default.conf

El ejemplo de modificación es el siguiente.

server {
    listen 80;
    server_name localhost;


    location / {
        root /var/www;
        index index.html index.htm index.php;
    }


    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
        root /usr/share/nginx/html;
    }


    location ~ \.php$ {
        root /var/www;
        fastcgi_pass php:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

Luego reinicie nginx
docker restart nginx

Crea una página de prueba

<?php
phpinfo();
?>

En Linux:
mueva el archivo al directorio de volumen de datos (el directorio raíz web está debajo de este directorio)
mv index.php /var/lib/docker/volumes/webpage/_data/

En mac:
cree archivos directamente en el directorio de montaje.

Entonces visita localhost

Conéctese a MySQL

Crear archivo de prueba

<?php
$link = mysqli_connect('mysql', 'root', '123456');
if (!$link) {
 die('Could not connect: ' . mysqli_connect_error());
}
echo 'Connected successfully';
mysqli_close($link);
?>

Después de la visita se dará cuenta de error: [No se puede conectar: El servidor solicitado autenticación método para el cliente desconocido ]
Esto es debido a que el cifrado de autenticación ajustar-tapón después MySQL8.0, pero no es compatible con la biblioteca de vínculos php ( referencia aquí , y aquí )

Solución:
1. Ingrese al contenedor
2. Inicie sesión en mysql
3. Ejecute ALTER USER 'root' IDENTIFIED WITH mysql_native_password BY '123456';Restablezca la contraseña una vez con el complemento original.

~ » docker exec -it mysql /bin/sh;exit
# mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 10
Server version: 8.0.19 MySQL Community Server - GPL


Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.


Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.


Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.


mysql> ALTER USER 'root' IDENTIFIED WITH mysql_native_password BY '123456';
Query OK, 0 rows affected (0.01 sec)


mysql>

刷新 : Conectado exitosamente

Docker-Compose crea un entorno LNMP

El proyecto Docker-Compose es el proyecto oficial de código abierto de Docker, que es responsable de la rápida orquestación del clúster de contenedores Docker.
Docker-Compose divide el contenedor administrado en tres capas, que son proyecto, servicio y contenedor. Todos los archivos en el directorio de ejecución de Docker-Compose (docker-compose.yml, extiende archivos o archivos de variables de entorno, etc.) constituyen un proyecto, y el nombre del proyecto es el nombre del directorio actual si no hay una designación especial. Un proyecto puede contener múltiples servicios, cada servicio define la imagen, los parámetros y las dependencias de la operación del contenedor. Un servicio puede incluir varias instancias de contenedor. Docker-Compose no resuelve el problema del equilibrio de carga, por lo que debe utilizar otras herramientas para lograr el descubrimiento del servicio y el equilibrio de carga.
El archivo de configuración del proyecto Docker-Compose tiene como valor predeterminado docker-compose.yml, y el archivo de configuración se puede personalizar mediante la variable de entorno COMPOSE_FILE o el parámetro -f, que define múltiples servicios dependientes y los contenedores que ejecuta cada servicio.
El uso de un archivo de plantilla Dockerfile permite a los usuarios definir fácilmente un contenedor de aplicaciones separado. En el trabajo, a menudo nos encontramos con situaciones que requieren que varios contenedores cooperen entre sí para completar una determinada tarea. Por ejemplo, para implementar un proyecto web, además del contenedor del servicio web en sí, a menudo es necesario agregar un contenedor de servicio de base de datos de fondo e incluso incluir un contenedor de equilibrio de carga.
Compose permite a los usuarios definir un conjunto de contenedores de aplicaciones asociadas como un proyecto a través de un archivo de plantilla docker-compose.yml separado (formato YAML).
El proyecto Docker-Compose está escrito en Python y llama a la API proporcionada por el servicio Docker para administrar el contenedor. Por lo tanto, siempre que la plataforma que opere sea compatible con la API de Docker, puede usar Compose en ella para la gestión de la orquestación.

https://docs.docker.com/compose/
https://docs.docker.com/compose/install/
https://docs.docker.com/compose/gettingstarted/
https://docs.docker.com/ compose / compose-file /
Nota:
1. La versión de escritorio de Docker para mac viene con compose, por lo que no es necesario instalarlo.

2. También puedes considerar usardocker stack

Si a menudo necesita crear un entorno en una nueva máquina, es muy problemático crear uno por uno cada vez que se indica lo anterior. En este momento, puede usar docker-compose para definir servicios de software a través de YAML, y finalmente solo necesita un comando para crear Y permitir todos los servicios definidos.
Compse se usa generalmente en base a los siguientes tres pasos:

  • Defina el entorno de ejecución del programa basado en dockerfile, para que pueda reutilizarlo en cualquier situación. (Si no necesita compilar, este paso se puede ignorar, use la imagen preparada directamente)
  • Defina servicios basados ​​en docker-compose.yml para que puedan ejecutarse simultáneamente en un entorno aislado.
  • Ejecute docker-compose para crear y ejecutar todo el programa.
    Se puede utilizar en entornos de desarrollo, pruebas automatizadas e implementación independiente.

El archivo de muestra es el siguiente:

version: '3'
services:
  php:
    container_name: php
    image: "bitnami/php-fpm"
    networks:
      - lnmp
    volumes:
       - /Users/lixin/Documents/code/learn:/var/www
    restart: always
  nginx:
    container_name: nginx
    image: "nginx"
    ports:
      - "80:80"
    volumes:
       - /Users/lixin/Documents/code/learn:/var/www
    networks:
      - lnmp
    restart: always
  mysql:
    container_name: mysql
    image: "mysql"
    ports:
      - "3306:3306"
    networks:
      - lnmp
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: "123456"
networks:
  lnmp:
    ipam:
      driver: default
      config:
        - subnet: "172.54.0.0/24"

Luego guárdelo para docker-compose.ymlcolocar el archivo en un directorio relacionado con la composición especialmente almacenado y ejecute el comando

~/Documents/code/learn » docker-compose up -d
Starting php ... done
Starting nginx ... done
Starting mysql ... done

Nota: El contenedor creado en base a componer se colocará bajo docker-compose.ymlel grupo de contenedores con el nombre del directorio

El problema de que nginx no inicie sesión en el contenedor

Durante el uso, encontrará que aunque el registro de acceso y el registro de errores están configurados en nginx conf, no está escrito en el archivo correspondiente.
Esto se debe a que el valor predeterminado oficial de nginx se configuró para que salga directamente al recopilador de registros de Docker.

FROM debian:jessie


MAINTAINER NGINX Docker Maintainers "[email protected]"


ENV NGINX_VERSION 1.11.5-1~jessie


RUN apt-key adv --keyserver hkp://pgp.mit.edu:80 --recv-keys 573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62 \
 && echo "deb http://nginx.org/packages/mainline/debian/ jessie nginx" >> /etc/apt/sources.list \
 && apt-get update \
 && apt-get install --no-install-recommends --no-install-suggests -y \
      ca-certificates \
      nginx=${NGINX_VERSION} \
      nginx-module-xslt \
      nginx-module-geoip \
      nginx-module-image-filter \
      nginx-module-perl \
      nginx-module-njs \
      gettext-base \
 && rm -rf /var/lib/apt/lists/*


# forward request and error logs to docker log collector
RUN ln -sf /dev/stdout /var/log/nginx/access.log \
 && ln -sf /dev/stderr /var/log/nginx/error.log


EXPOSE 80 443


CMD ["nginx", "-g", "daemon off;"]

: : La imagen oficial de nginx crea un enlace simbólico desde /var/log/nginx/access.log a / dev / stdout, y crea otro enlace simbólico desde /var/log/nginx/error.log a / dev / stderr, sobrescribiendo los archivos de registro y el envío de registros al dispositivo especial correspondiente. Ver el Dockerfile.

Supongo que te gusta

Origin www.cnblogs.com/leestar54/p/12707648.html
Recomendado
Clasificación