一种解决方案,使您可以 在 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