DevDock
DevDock copied to clipboard
Build php development & production environment based on Docker
DevDock
非常感谢 laradock, DevDock 是简化定制之后的产物,方便学习使用。
支持的软件 (镜像)
-
数据库引擎
- Mysql
- Mongo
-
Mysql 管理工具
- adminer
-
缓存引擎:
- Redis
- Memcached
-
搜索引擎
- elasticsearch
-
PHP 服务器
- Nginx
-
PHP 进程管理
- php-worker
-
PHP 编译工具
- php-fpm
-
WebSocket 服务
- laravel-echo-server
-
工具: - Workspace (PHP7-CLI, SOAP, xDebug, Composer, Git, Node, YARN, Gulp, SQLite, Vim, Nano, cURL...)
如果你找不到你需要的软件,构建它然后把它添加到这个列表。
安装
克隆 DevDock
仓库:
在你系统的任意位置(建议在你的工作目录):
git clone https://github.com/RystLee/DevDock.git
cd DevDock
cp .env.example .env
查看 .env 文件你会发现很多环境配置项,在这里可以自行配置开发环境。
启动
进入到 DevDock 目录中
例如 Nginx 和 Mysql:
查看 docker-compose.yml 文件:
docker-in-docker:
image: docker:dind
privileged: true
volumes:
- ${APP_CODE_LOCAL_PATH}:${APP_CODE_CONTAINER_PATH}
DevDock 默认将同级目录下的所有文件映射到数据卷容器 docker-in-docker 中。其实可以你完全可以灵活配置,添加多个映射,例如:
volumes:
- ../project1:/var/www
- ../../project2:/var/www
创建网站配置文件 参考 nginx/sites/default.conf (不要使用 default.conf,它会在容器中被删除)
server_name laravel.dev;
root /var/www/laravel/public;
创建初始数据库信息,在 docker-compose.yml 文件中 (多个数据库请通过 phpmyadmin 或 手动进入到 mysql 容器中创建):
environment:
MYSQL_DATABASE: homestead
MYSQL_USER: homestead
MYSQL_PASSWORD: secret
MYSQL_ROOT_PASSWORD: root
然后运行:
docker-compose up -d nginx mysql
你可以从以下列表选择你自己的容器组合:
nginx, php-fpm, php-worker, mysql, redis, memcached, elasticsearch, workspace
将配置文件中的各种服务的 host 改为相应的容器名称,如:DB_HOST: mysql
说明: workspace 和 php-fpm 将运行在大部分实例中, 所有不用在命令中 up 加上它们.
进入 Workspace 容器, 执行像 (Artisan, Composer, Gulp, ...)等命令
docker-compose exec -it -u devdock workspace bash
增加 --user=devdock (例如 docker-compose exec --user=devdock workspace bash) 作为您的主机的用户创建的文件. (你可以从 docker-compose.yml 修改 PUID (User id) 和 PGID (group id) 值 )。
使用
灵活配置开发环境
在 docker-compose.yml 中,引用了很多环境变量,可自行在 .env 进行配置。典型的,我已经将 nginx 目录下 的 sites 目录映射到 nginx 容器,所以当你修改 nginx 网站配置文件后,只要重启 nginx 容器即可:
docker-compose restart nginx
常用命令
- 列出正在运行的所有容器
docker ps
- 你也可以使用以下命令查看当前 DevDock 启动的容器
docker-compose ps
- 关闭所有容器
docker-compose stop
- 停止某个容器:
docker-compose stop {container_name}
- 删除服务容器
docker-compose down {container_name}
- 该命令不会删除你的数据卷容器,如果你重新创建服务容器,服务容器默认仍会使用上次创建的数据卷容器
* 如果不加 {容器名称} ,命令会删除所有服务容器。
- 列出所有数据卷容器
docker volume ls
- 删除数据卷容器
docker volume rm <VOLUME NAME>
- 删除所有数据卷容器
docker volume rm $(docker volume ls -q)
- 删除所有未被使用的数据卷容器
docker volume rm $(docker volume ls -qf dangling=true)
- 查看容器日志
Nginx 的日志在 logs/nginx 目录 查看其它容器日志 (Mysql, php-fpm, …) 你可以运行:
docker-compose logs {image-name}
编辑 Docker 镜像
- 找到你想修改的镜像的
dockerfile
, 例如:mysql
在mysql/Dockerfile
. - 按你所要的编辑文件.
- 重新构建镜像:
如果你做任何改变 Dockerfile 确保你运行这个命令,可以让所有修改更改生效:
docker-compose build
选择你可以指定哪个镜像 (而不是重建所有的镜像):
docker-compose build {image-name}
如果你想重新创建整个镜像,你需要使用 --no-cache 选项
docker-compose build --no-cache {container-name}
增加更多镜像
为了增加镜像(软件), 编辑 docker-compose.yml 添加容器细节, 你需要熟悉 docker compose 文件语法.
使用 Redis
-
docker-compose up -d redis
- 以 Laravel 为例,打开 .env 文件,然后配置 REDIS_HOST
...
REDIS_HOST=redis
...
如果在你的 .env 文件没有找到 REDIS_HOST 变量。打开数据库配置文件 config/database.php 然后用 redis 替换默认 IP 127.0.0.1 ,例如:
'redis' => [
'cluster' => false,
'default' => [
'host' => 'redis',
'port' => 6379,
'database' => 0,
],
],
- 启用 Redis 缓存或者开启 Session 管理也在
.env
文件中用redis
替换默认file
设置CACHE_DRIVER
和SESSION_DRIVER
CACHE_DRIVER=redis
SESSION_DRIVER=redis
- Compose 安装 “predis/predis”:
composer require predis/predis:^1.0
- 你可以用以下代码在 Laravel 中手动测试:
\Cache::store('redis')->put('DevDock', 'Awesome', 10);
使用 PHP
- PHP 扩展
PHP 的扩展 FPM 和 CLI 分别安装在 php-fpm 和 workspace 镜像当中,如果需要定制,请分别到 php-fpm/Dockerfile-xx 和 workspace/Dockerfile 文件中编辑。
默认运行 php-fpm 7.1 版本,如需其他版本可以参考 laradock 自行添加。
supervisor 进程管理工具安装在 php-worker 容器中,修改配置重启容器即可生效。
使用自定义域名
假定你的自定义域名是 laravel.dev
- 打开 /etc/hosts 文件,映射 laravel.dev 到 127.0.0.1
127.0.0.1 laravel.test
- 打开你的浏览器访问
http://laravel.test
你可以在 nginx 配置文件自定义服务器名称,如下:
server_name laravel.test;
使用 Elasticsearch
进入到 elasticsearch 目录下,config 和 plugins 分别放置了配置文件和插件,可根据需要修改和添加,完成之后重建镜像
docker-compose build elasticsearch
安装全局 Composer 命令
为启用全局 Composer Install 在容器构建中允许你安装 composer 的依赖,然后构建完成后就是可用的。
-
打开 docker-compose.yml 文件
-
在 workspace 项中找到 COMPOSER_GLOBAL_INSTALL 选项并设置为 true
-
重建容器
docker-compose build workspace
安装 Node + NVM
在 workspace 容器安装 NVM 和 Nodejs
-
打开
docker-compose.yml
文件 -
在 workspace 项中找到 INSTALL_NODE 选项设为 true
-
重建容器
docker-compose build workspace
安装 xDebug
-
打开
docker-compose.yml
文件 -
在 php-fpm 和 workspace 项中分别找到 INSTALL_NODE 选项设为 true
-
重建容器
docker-compose build workspace php-fpm
Debug
- 看到包含 address already in use 的错误:
确保你想运行的服务端口 (80, 3306, etc.) 不是已经被其他程序使用,例如 apache/httpd 服务或其他安装的开发工具
- 容器报类似 Connection refused 的错误:
将配置文件中服务的 host 改为相应的容器名称,如 mysql
-
如遇到 Elasticsearch 等内存消耗大的容器莫名其妙挂掉,而且查看日志无果,请打开 Docker App > Preferences > Advanced 提高系统给予 docker 的内存大小
-
如果 Elasticsearch 启动报错,可能是之前未被清理掉的 volumes 中已存在的 node 导致的。所以,每次销毁容器时都需要清理掉响应的 volume,可以执行命令
docker volume rm $(docker volume ls -qf dangling=true)
来进行清理。