Crie rapidamente o ambiente LNMP com base no Docker

TOC
https://docs.docker.com/

Prefácio

O que é o Docker?

O Docker é um projeto de software de código aberto que permite a automatização de aplicativos em contêineres de software, fornecendo uma camada adicional de abstração de software no sistema operacional Linux e um mecanismo de gerenciamento automático para virtualização da camada do sistema operacional . O Docker usa o mecanismo de separação de recursos no núcleo do Linux, como cgroups e o espaço de nome do núcleo do Linux, para estabelecer contêineres de software independentes. Isso pode operar em uma única entidade Linux, evitando o ônus extra de iniciar uma máquina virtual.

Docker VS VM

O daemon do Docker pode se comunicar diretamente com o sistema operacional principal e alocar recursos para cada contêiner do Docker; também pode isolar o contêiner do sistema operacional principal e isolar cada contêiner. A máquina virtual VM é o principal sistema operacional Hypervisor que virtualiza os recursos de hardware para criar um sub-sistema independente e os recursos não são compartilhados.

Por que usar a janela de encaixe

1. Verifique se o ambiente de desenvolvimento offline, o ambiente de teste e o ambiente de produção online são consistentes.
2. Comparado com a VM, possui alta velocidade de inicialização, alta taxa de utilização de recursos e baixo custo de desempenho
3. DevOps
4. Microsserviços . Um serviço faz apenas uma coisa
5. Executa automaticamente tarefas repetidas de instalação e configuração do ambiente de desenvolvimento para desenvolvimento As pessoas podem se concentrar no importante: criar um ótimo software.

Conceitos relacionados ao Docker

Imagem da estátua

A imagem do Docker é um modelo somente leitura. Imagens podem ser usadas para criar contêineres do Docker.
O Docker fornece um mecanismo muito simples para criar ou atualizar uma imagem existente.Os usuários podem até baixar uma imagem já preparada diretamente de outras pessoas e usá-la diretamente.
Espelho = OS + + ambiente operacional software do programa do usuário
, por exemplo: um espelho pode compreender um ambiente de sistema operacional Ubuntu completa, que só Apache ou outro aplicativo exigido pelo usuário está instalado.

Podemos criar uma imagem escrevendo um Dockerfile.

Container

O Docker usa contêineres para executar aplicativos.
Um contêiner é uma instância em execução criada a partir de uma imagem. Pode ser iniciado, iniciado, parado e excluído. Cada contêiner é uma plataforma isolada que garante segurança.
Você pode pensar no contêiner como uma versão simples do ambiente Linux (incluindo permissões de usuário raiz, espaço de processo, espaço de usuário, espaço de rede etc.) e aplicativos em execução nele.
Nota: A imagem é somente leitura, o contêiner cria uma camada gravável como a camada superior quando é iniciada .

Volume de dados

Os volumes de dados permitem que você persista os dados sem ser afetado pelo ciclo de vida do contêiner.
A mudança de pensamento que deve ser feita ao usar a janela de encaixe: o contêiner deve ter vida curta e pontual.

Quando o contêiner é iniciado, ele recebe um IP privado aleatório e outros contêineres podem usar esse endereço IP para se comunicar com ele. Isso é importante por dois motivos: um é que ele fornece um canal para comunicação mútua durante o Rong e o outro é que os contêineres compartilharão uma rede local.
Para habilitar a comunicação entre contêineres, a janela de encaixe permite que você se refira a outros contêineres existentes ao criar um novo contêiner.O referenciado no contêiner que você acabou de criar receberá um alias (que você especificar). Dissemos que os dois contêineres estão interligados.
Portanto, se o contêiner de banco de dados já estiver em execução, podemos criar um contêiner de servidor da web e fazer referência ao contêiner de banco de dados ao criá-lo, fornecendo um alias, como dbapp. Nesse contêiner de servidor da Web recém-criado, posso usar o nome do host dbapp para me comunicar com o contêiner do DB a qualquer momento.

Repositório

Um armazém é um local onde os arquivos de imagem são armazenados centralmente. Às vezes, o armazém e o servidor de registro do armazém (Registro) ficam confusos e não são estritamente distintos. De fato, vários armazéns costumam ser armazenados no servidor de registro do armazém, e cada armazém contém vários espelhos e cada espelho possui uma etiqueta diferente.
O armazém é dividido em duas formas: armazém público (público) e armazém privado (privado).
O maior armazém público é o Docker Hub, que armazena um grande número de imagens para download dos usuários. Os armazéns públicos domésticos incluem o Docker Pool, etc., que podem fornecer acesso mais estável e rápido aos usuários do continente.
Obviamente, os usuários também podem criar um armazém privado na rede local.
Depois que os usuários criam sua própria imagem, eles podem usar o comando push para carregá-la em um armazém público ou privado, para que na próxima vez que usarem essa imagem em outra máquina, eles precisem apenas retirá-la do armazém.
Nota: O conceito de armazém do Docker é semelhante ao Git, e o servidor de registro pode ser entendido como um serviço de hospedagem como o GitHub.

Criar ambiente LNMP com base no Docker

Download espelho

https://hub.docker.com/

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

Crie um disco de dados

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

imagem

Nota:
1. Se você criar diretamente, o arquivo será gerenciado pelo contêiner, caso contrário, você precisará montar o diretório especificado
2. Os alunos que usam mac precisam prestar atenção, descobrirá que esse caminho não pode ser encontrado na máquina, porque o docker de Mac está realmente executando no virtual na máquina, então você precisa para entrar na exibição da máquina virtual janela de encaixe
screen ~/Library/Containers/com.docker.docker/Data/vms/0/tty
neste momento cd /var/lib/docker/volumes/learn/_data/o volume é criado.
Se você achar problemático, o Mac pode pular esta etapa

docker volume create learn
Criamos diretamente um disco de dados aqui e você descobrirá que o caminho real está no diretório relacionado ao docker

~/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"
    }
]

Crie uma rede

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

O Docker possui os seguintes tipos de rede:
ponte: usada para comunicação entre o
host de contêineres independentes : use diretamente a rede do host e a porta também usa a
sobreposição do host : quando houver vários hosts de docker, a comunicação de contêiner entre
hosts macvlan: cada recipiente tem um virtual MAC endereço
none: desativar rede
por padrão, janela de encaixe cria uma rede ponte, quando você cria um novo recipiente para executar docker runquando a ponte será automaticamente conectado à rede, você não pode excluir a rede padrão, Mas você pode criar um novo.
Por padrão, o Docker estabelecerá uma ponte, um host e uma rede none:

~ » 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类划分子网络,方便配置文件中直接使用容器名称

Criar espelho php-fpm, nginx, mysql

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

Em 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 arquivo de configuração

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

O exemplo de modificação é o seguinte.

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;
    }
}

Em seguida, reinicie o nginx
docker restart nginx

Crie uma página de teste

<?php
phpinfo();
?>

No Linux:
Mova o arquivo para o diretório de volume de dados (o diretório raiz da web está nesse diretório)
mv index.php /var/lib/docker/volumes/webpage/_data/

Em mac:
crie arquivos diretamente no diretório mount.

Então visite localhost

Conecte-se ao MySQL

Criar arquivo de teste

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

Após a visita, você encontrará o erro: [Não foi possível conectar: A pedido do servidor de autenticação método desconhecido para o cliente ]
Isso ocorre porque a criptografia de autenticação plug-ajustado após MySQL8.0, mas não suporta a biblioteca de vínculo php ( referência aqui , e aqui )

Solução:
1. Digite o container
2. Efetue login no mysql
3. Execute ALTER USER 'root' IDENTIFIED WITH mysql_native_password BY '123456';Redefina a senha uma vez com o plug-in 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 com sucesso

Docker-Compose cria ambiente LNMP

O projeto Docker-Compose é o projeto oficial de código aberto do Docker, responsável pela orquestração rápida do cluster de contêineres do Docker.
O Docker-Compose divide o contêiner gerenciado em três camadas, que são projeto, serviço e contêiner. Todos os arquivos no diretório em execução do Docker-Compose (docker-compose.yml, estende arquivos ou arquivos de variáveis ​​de ambiente etc.) constituem um projeto e o nome do projeto é o nome do diretório atual se não houver designação especial. Um projeto pode conter vários serviços, cada serviço define a imagem, parâmetros e dependências da operação do contêiner. Um serviço pode incluir várias instâncias de contêiner.O Docker-Compose não resolve o problema do balanceamento de carga, portanto, você precisa usar outras ferramentas para obter a descoberta de serviço e o balanceamento de carga.
O arquivo de configuração do projeto Docker-Compose assume como padrão docker-compose.yml e o arquivo de configuração pode ser customizado por meio da variável de ambiente COMPOSE_FILE ou do parâmetro -f, que define vários serviços dependentes e os contêineres executados por cada serviço.
O uso de um arquivo de modelo do Dockerfile permite que os usuários definam facilmente um contêiner de aplicativo separado. No trabalho, geralmente encontramos situações que exigem que vários contêineres cooperem entre si para concluir uma determinada tarefa. Por exemplo, para implementar um projeto da Web, além do próprio contêiner de serviço da Web, muitas vezes é necessário adicionar um contêiner de serviço de banco de dados de back-end e até incluir um contêiner de balanceamento de carga.
Compor permite que os usuários definam um conjunto de contêineres de aplicativos associados como um projeto por meio de um arquivo de modelo docker-compose.yml separado (formato YAML).
O projeto Docker-Compose é escrito em Python e chama a API fornecida pelo serviço Docker para gerenciar o contêiner. Portanto, desde que a plataforma que você opera ofereça suporte à API do Docker, você pode usar o Compose para gerenciar a orquestração.

https://docs.docker.com/compose/
https://docs.docker.com/compose/install/
https://docs.docker.com/compose/gettingstarted/
https://docs.docker.com/ compor / compor-arquivo /
Nota:
1. A versão para desktop do Docker para mac é fornecida com compor, portanto, não é necessário instalá-lo.

2. Você também pode considerar usardocker stack

Se você costuma criar um ambiente em uma nova máquina, é muito problemático criar um por um sempre, como o descrito acima.Neste momento, você pode usar o docker-compose para definir serviços de software por meio do YAML e, finalmente, precisar apenas de um comando para criar E permita todos os serviços definidos.
O compse é geralmente usado com base nas três etapas a seguir:

  • Defina o ambiente de execução do programa com base no dockerfile, para que você possa reutilizá-lo em qualquer situação. (Se você não precisa construir, esta etapa pode ser ignorada, use a imagem pronta diretamente)
  • Defina serviços com base no docker-compose.yml para que eles possam executar simultaneamente em um ambiente isolado.
  • Execute o docker-compondo para criar e executar o programa inteiro.
    Pode ser usado em ambiente de desenvolvimento, testes automatizados e implantação autônoma.

O arquivo de amostra é o seguinte:

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"

Em seguida, salve-o para docker-compose.ymlcolocar o arquivo em um diretório relacionado à composição especialmente armazenado e execute o comando

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

Nota: O contêiner criado com base na composição será colocado no docker-compose.ymlgrupo de contêineres nomeado após o diretório

O problema do nginx não fazer logon no contêiner

Durante o uso, você descobrirá que, embora o log de acesso e o log de erros estejam definidos no nginx conf, ele não é gravado no arquivo correspondente.
Isso ocorre porque o padrão oficial do nginx foi definido para saída diretamente no coletor de log do 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;"]

: : A imagem oficial do nginx cria um link simbólico de /var/log/nginx/access.log para / dev / stdout e cria outro link simbólico de /var/log/nginx/error.log para / dev / stderr, substituindo os arquivos de log e fazendo com que os logs sejam enviados para o dispositivo especial relevante. Veja o Dockerfile.

Acho que você gosta

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