基于Docker的PHP开发环境

一种解决方案,使您可以 在 30至40分钟内在本地计算机上创建通用的PHP开发环境 

为什么选择Docker?

  • Docker不是VM系统,它不对计算机的硬件建模。使用Docker,您将获得最少的资源消耗。Docker容器与您计算机的内核(或主机内核)直接交互,但它们也在进程级别隔离程序。

  • 部署速度快。您可以使用可在几秒钟内安装并运行的预构建docker映像。

  • Docker容器中的应用程序可以在安装了Docker且具有相同环境的任何计算机上运行。

  • 简单分离用户数据和容器服务的可能性。如果您中断或删除Docker容器,则数据不会丢失,因为它不属于该容器。容器仅用作服务,不存储在两次运行之间不会丢失的数据。

  • 您可以非常快速地添加新容器,更改其配置,并在同一台计算机上运行不同版本的数据库。

要求

  • 吉特

  • Docker引擎19.x及更高版本。

开发环境功能 

  • 几个PHP版本 -7.3和7.1, 带有一组最受欢迎的扩展。

  • 对Web项目使用不同PHP版本的能力 

  • 主管流程监视器已准备就绪 

  • 预先配置的Nginx Web服务器

  • 数据库:  MySQL 5.7,  MySQL 8,  PostgreSQL  (最新),  MongoDB 4.2,  Redis(最新)。

  •  .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

如何部署MongoDB转储? 

  • 将转储文件复制到mongo / dump目录 

  • 输入mongo容器 

docker exec -it mongo sh

运行以下命令以部署database_name转储 

mongorestore -d database_name /dump/databases/database_nam

Git项目存储库:https : //github.com/drandin/docker-php-workspace




All Articles