Skip to content

Build php development & production environment based on Docker

License

Notifications You must be signed in to change notification settings

iMacken/DevDock

Repository files navigation

DevDock

非常感谢 laradockDevDock 是简化定制之后的产物,方便学习使用。

支持的软件 (镜像)

  • 数据库引擎
    • 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 镜像

  1. 找到你想修改的镜像的 dockerfile , 例如: mysqlmysql/Dockerfile.
  2. 按你所要的编辑文件.
  3. 重新构建镜像:

如果你做任何改变 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_DRIVERSESSION_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) 来进行清理。