Entorno de desarrollo PHP basado en Docker

Una soluciĂłn que le permitirá crear un entorno de desarrollo PHP universal en una computadora local   en  30 - 40 minutos .

¿Por qué Docker?

  • Docker no es un sistema VM, no modela el hardware de una computadora. Con Docker obtendrá un consumo mĂ­nimo de recursos. Los contenedores de Docker interactĂşan directamente con el kernel de su computadora (o kernel de host), pero tambiĂ©n aĂ­slan el programa a nivel de proceso.

  • Rápida velocidad de implementaciĂłn. Puede usar imágenes de Docker prediseñadas que se instalan y ejecutan en segundos.

  • Las aplicaciones dentro de los contenedores de Docker se pueden ejecutar en cualquier máquina con Docker instalado, con el mismo entorno.

  • Posibilidad de segregaciĂłn simple de datos de usuario y servicios de contenedor. Si rompe o borra el contenedor de la ventana acoplable, los datos no se perderán, ya que no pertenecerán al contenedor. El contenedor solo sirve como un servicio y no almacena datos que no se puedan perder entre ejecuciones.

  • Puede agregar nuevos contenedores muy rápidamente, cambiar su configuraciĂłn, ejecutar diferentes versiones de bases de datos en la misma máquina.

Requisitos

  • Git.

  • Docker engine 19.xy posterior.

Capacidades y caracterĂ­sticas del entorno de desarrollo 

  • Varias versiones de  PHP: 7.3 y 7.1  con un conjunto de las extensiones más populares.

  • La capacidad de utilizar diferentes versiones de PHP para proyectos web  .

  • Supervisor Process Monitor listo para funcionar  .

  • Servidor web Nginx preconfigurado .

  • Bases de datos:  MySQL 5.7MySQL 8PostgreSQL  (más reciente),  MongoDB 4.2Redis (más reciente).

  •  .env.

  •  docker-compose.yml.

  •  docker-compose.yml.

  • docker- .

  •  Dockerfile   PHP.

  • docker-, .

, —  Docker .

https://github.com/drandin/docker-php-workspace

 

.

├── .env-example
├── .gitignore
├── .ssh
├── README.md
├── docker-compose.yml
├── mongo
├── mysql-5.7
├── mysql-8
├── nginx
├── php-ini
├── php-workers
├── php-workspace
├── postgres
├── projects
└── redis

.gitkeep. , Git.

.gitkeep â€” , , .

.env-example 

.

#  
WORKSPACE_TIMEZONE='Europe/Moscow'

# XDEBUG
DOCKER_PHP_ENABLE_XDEBUG='on'

#  Nginx
# ,   
#     
NGINX_PORT=80

#  Redis
# ,   
#     
REDIS_PORT=6379
#  Postgres
POSTGRES_DB=test
POSTGRES_USER=pg_user
POSTGRES_PASSWORD=secret
POSTGRES_PORT=54322

#    MySQL 8.x  MySQL 5.7.x
MYSQL_ROOT_PASSWORD=secret
MYSQL_DATABASE=test

#  MySQL 8.x
# ,   
#     
MYSQL_8_PORT=4308

#  MySQL 5.7.x
# ,   
#     
MYSQL_5_7_PORT=4307

#  MongoDB
# ,   
#     
MONGO_PORT=27017

#  PHP 7.3
#  ,    
PHP_7_3_PORT=9003

#  PHP 7.1
#  ,    
PHP_7_1_PORT=9001

.gitignore

, , ssh- . gitignore.

.ssh 

ssh-.

readme.md 

.

docker-compose.yml 

 YML,  Docker. web-.

mongo 

MongoDB.

├── configdb
│   └── mongo.conf
├── db
└── dump

mongo.conf â€”  MongoDB. , MongoDB .

db â€” MongoDB.

dump â€” .

mysql-5.7 

MySQL 5.7.

├── conf.d
│   └── config-file.cnf
├── data
├── dump
└── logs

config-file.cnf â€” . , MySQL 5.7 .

data â€” MySQL 5.7.

dump â€” .

logs â€” .

mysql-8 

MySQL 8.

├── conf.d
│   └── config-file.cnf
├── data
├── dump
└── logs

config-file.cnf â€” . , MySQL 8 .

data â€” MySQL 8.

dump â€” .

logs â€” .

nginx 

Nginx .

├── conf.d
│   ├── default.conf
│   └── vhost.conf
└── logs

default.conf â€” , .

vhost.conf â€” web-.

 vhost.conf :

server {
    listen 80;
    index index.php index.html;
    server_name project-1.localhost;
    error_log /var/log/nginx/project-1.error.log;
    access_log /var/log/nginx/project-1.access.log combined if=$loggable;
    root /var/www/project-1.ru;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass php-7.3:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_script_name;
    }
}

server {
    listen 80;
    index index.php index.html;
    server_name project-2.localhost;
    error_log /var/log/nginx/project-2.error.log;
    access_log /var/log/nginx/project-2.access.log combined if=$loggable;
    root /var/www/project-2.ru;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass php-7.1:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_script_name;
    }
}

  web- — project-1.localhost  project-2.localhost.

, docker-.

,  project-1.localhost :

fastcgi_pass php-7.3:9000;

php-7.3 â€” docker-,  9000 â€” . , docker-compose.yml.

php-ini 

PHP.

├── 7.1
│   └── php.ini
└── 7.3
    └── php.ini

 PHP â€” .

php-workers 

 Supervisor.

├── 7.1
│   └── supervisor.d
│       
└── 7.3
    └── supervisor.d

PHP — .

php-workspace 

, , docker- PHP.

└── Dockerfile

Dockerfile â€” , , PHP.

postgres

 PostgreSQL.

├── .gitkeep
├── data
└── dump

data â€” PostgreSQL.

dump â€” .

projects 

web-.

, web-.

:

project-1.ru
project-2.ru 
...

projects php-7.1 php-7.3.

php-7.1 php-7.3, /var/www , projects .

redis 

key-value Redis.

├── conf
└── data

conf â€” .

data â€” , Redis .

docker- PHP 

,  php-7.x  php-workspace/Dockerfile.

, :

  • bash

  • htop

  • curl

  • Git

  • omposer

  • make

  • wget

  • NodeJS

  • Supervisor

  • npm

 

1.  .

git clone https://github.com/drandin/docker-php-workspa

, . .

2.  .env-example  .env

cp .env-example .env

,  .env. .

3. web- projects.

, ,  2 :

project-1.ru
project-2.ru

project-1.ru â€”  PHP 7.3,  project-2.ru â€”  PHP 7.1.

4.  Nginx.

 ./nginx/conf.d/.

5. ( ) web- .

web-  hosts  .

 hosts  web-  IP docker- Nginx.

 Mac  Linux   /etc/hosts.  Windows   C:\Windows\System32\drivers\etc\hosts.

, , :

127.0.0.1   project-1.localhost
127.0.0.1   project-2.localhost

, ,  Nginx, docker-,  127.0.0.1  web-  80.

.dev  . — .localhost  .test.

6[, ]  web-.

Web- http- .

docker- php-7.1 web- â„– X  web- â„– Y, docker- php-7.3. ,  /etc/hosts  .

 /etc/hosts.

—  extra_hosts  php-7.1  php-7.3  docker-compose.yml.

:

...  
  php-7.1:  
  ...
    extra_hosts:
      - 'project-1.localhost:IP_HOST_MACHINE'
      - 'project-2.localhost:IP_HOST_MACHINE'
  ...

IP_HOST_machine â€” IP , docker- .

 Mac, docker-  docker.for.mac.localhost.

 IP   Mac  , :

docker run -it alpine ping docker.for.mac.localhost

, - :

PING docker.for.mac.localhost (192.168.65.2): 56 data bytes
64 bytes from 192.168.65.2: seq=0 ttl=37 time=0.286 ms
64 bytes from 192.168.65.2: seq=1 ttl=37 time=0.504 ms
64 bytes from 192.168.65.2: seq=2 ttl=37 time=0.801 ms

, IP-,  extra_hosts  php-7.1  php-7.3  docker-compose.yml.

...  
  php-7.1:  
  ...
    extra_hosts:
      - 'project-1.localhost:192.168.65.2'
      - 'project-2.localhost:192.168.65.2'
  ...

8. .

, docker- php-7.1  php-7.3  :

MySQL 5.7

mysql-5.7

3308

MySQL 8

mysql-8

3308

PostgreSQL

postgres

5432

MongoDB

mongo

27017

Redis

redis

6379

web-.

:

  • — 127.0.0.1.

  • —  .env.

7. .

:

docker-compose build && docker-compose up -d

. 10 30 . . .

, . 

 Docker Dashboard  :

8. SSH-.

web- SSH-, ,  Composer  .

SSH- :

ssh-keygen -f ./.ssh/id_rsa -t rsa -b 2048 -C "your-name@example.com"

 your-name@example.com   Email.

 .ssh/   2  â€” .

9. docker-.

:

docker ps

, :

CONTAINER ID        IMAGE                          COMMAND                  CREATED             STATUS              PORTS                               NAMES
8d348959c475        docker-php-workspace_php-7.1   "docker-php-entrypoi…"   6 minuts ago        Up 54 seconds       0.0.0.0:9001->9000/tcp              php-7.1
a93399727ff6        docker-php-workspace_php-7.3   "docker-php-entrypoi…"   6 minuts ago        Up 53 seconds       0.0.0.0:9003->9000/tcp              php-7.3
5cd80ac95388        nginx:stable-alpine            "/docker-entrypoint.…"   6 minuts ago        Up 51 seconds       0.0.0.0:80->80/tcp                  nginx
70182bc9e44c        mysql:5.7                      "docker-entrypoint.s…"   6 minuts ago        Up 54 seconds       33060/tcp, 0.0.0.0:4307->3306/tcp   mysql-5.7
46f2766ec0b9        mysql:8.0.21                   "docker-entrypoint.s…"   6 minuts ago        Up 53 seconds       33060/tcp, 0.0.0.0:4308->3306/tcp   mysql-8
a59e7f4b3c61        mongo:4.2                      "docker-entrypoint.s…"   6 minuts ago        Up 54 seconds       0.0.0.0:27017->27017/tcp            mongo
eae8d62ac66e        postgres:alpine                "docker-entrypoint.s…"   6 minuts ago        Up 53 seconds       0.0.0.0:54322->5432/tcp             postgres
bba24e86778a        redis:latest                   "docker-entrypoint.s…"   6 minuts ago        Up 54 seconds       0.0.0.0:6379->6379/tcp              redis

10. web-.

web- ,  Composer  NPM, .

 php-7.1  php-7.3   Composer  NPM.

 php-7.1:

docker exec -it php-7.1 bash

php-7.3:

docker exec -it php-7.3 bash

web- .

,  Composer  :

composer install

 

.

docker-? 

:

docker exec -it container_name bash

container_name â€” .

, ? 

docker-compose down

docker ps -a

docker-? 

docker inspect containername

containername â€” .

PHP, php-7.3? 

 php-7.3 , :

docker exec -it php-7.3 php -m

:

docker rm -v $(docker ps -aq)

:

docker rm -v $(docker ps -q)

:

docker rm -v $(docker ps -aq -f status=exited)

MySQL, PostgreSQL MongoDB

web- , .

PostgreSQL? 

:

docker exec -i postgres psql --username user_name database_name < /path/to/dump/pgsql-backup.sql

postgres :

psql --username user_name database_name < /path/to/dump/pgsql-backup.sql

user_name â€” . postgres_USER (. .env).

database_name â€” . postgres_DB (. .env).

MySQL? 

.

1

, .

 mysql/conf.d/config-file.cnf   slow_query_log=0   long_query_time, 1000.

 gzip, :

gunzip databases-dump.sql.gz

, :

docker exec -i mysql mysql --user=root --password=secret --force < databases-dump.sql

— , .

MySQL  :

mysql: [Warning] Using a password on the command line interface can be insecure

 --force  MySQL, . , .

2

 Percona XtraBackup.

Percona XtraBackup â€” MySQL.

,  XtraBackup  : https://medium.com/@drandin/---mysql----xtrabackup-26bd3f843075

ÂżCĂłmo implementar un volcado de MongoDB? 

  • Copie los archivos de volcado en el directorio  mongo / dump .

  • Ingrese al contenedor  mongo :

docker exec -it mongo sh

Ejecute el siguiente comando para expandir la base de datos de volcado  database_name ' :

mongorestore -d database_name /dump/databases/database_nam

Repositorio de proyectos Git: https://github.com/drandin/docker-php-workspace




All Articles