├── .gitignore ├── docker ├── files │ ├── proxy │ │ ├── docker-entrypoint.sh │ │ └── Dockerfile │ └── cgi │ │ ├── docker-entrypoint.sh │ │ └── Dockerfile └── config │ └── proxy │ └── conf.d │ └── default.conf ├── docs ├── 如何安装Yaf扩展.md ├── 如何安装Swoole扩展.md └── 如何新建一个站点.md ├── docker-compose.yml ├── docker-compose-fast.yml └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | .idea -------------------------------------------------------------------------------- /docker/files/proxy/docker-entrypoint.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # @auther 3 | 4 | echo "info: nginx non-daemon startup" 5 | nginx -c /etc/nginx/nginx.conf 6 | tail -f /dev/null -------------------------------------------------------------------------------- /docker/files/cgi/docker-entrypoint.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # @auther 3 | 4 | /usr/sbin/init 5 | /usr/sbin/crond 6 | echo "info: starting php-fpm.." 7 | /usr/sbin/php-fpm -c /etc/php.ini -y /etc/php-fpm.conf 8 | tail -f /dev/null -------------------------------------------------------------------------------- /docker/files/proxy/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM centos:7.2.1511 2 | 3 | RUN yum install -y epel-release &&\ 4 | rpm -ivh https://mirrors.tuna.tsinghua.edu.cn/remi/enterprise/remi-release-7.rpm &&\ 5 | yum install -y --enablerepo=remi wget gcc gcc-c++ make 6 | 7 | RUN wget http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm &&\ 8 | rpm -ivh nginx-release-centos-7-0.el7.ngx.noarch.rpm &&\ 9 | yum -y install nginx &&\ 10 | mkdir -p /data/www 11 | 12 | # COPY ./Yii2.conf /etc/nginx/conf.d/default.conf 13 | 14 | COPY docker-entrypoint.sh /usr/local/bin/ 15 | 16 | RUN chmod +x /usr/local/bin/docker-entrypoint.sh 17 | 18 | CMD ["docker-entrypoint.sh"] -------------------------------------------------------------------------------- /docs/如何安装Yaf扩展.md: -------------------------------------------------------------------------------- 1 | # 如何安装 Yaf 扩展 2 | 3 | #### 安装 Yaf 扩展 4 | 5 | ```shell 6 | # 进入 PHP 容器 7 | [root@localhost Docker-LNMP]# docker exec -it cgi bash 8 | 9 | # 下载、安装 10 | wget http://pecl.php.net/get/yaf-3.0.8.tgz &&\ 11 | tar -zxvf yaf-3.0.8.tgz &&\ 12 | cd yaf-3.0.8 &&\ 13 | phpize &&\ 14 | ./configure &&\ 15 | make && make install &&\ 16 | sed -i '$a \\n[yaf]\nextension=yaf.so\nyaf.environ=product' /etc/php.ini &&\ 17 | cd ../ && rm -rf yaf-3.0.8.tgz yaf-3.0.8 18 | 19 | # 退出 PHP 容器 20 | [root@510d01c199f5 /]# exit 21 | exit 22 | 23 | # 重启 PHP 容器 24 | [root@localhost Docker-LNMP]# docker restart cgi 25 | ``` 26 | 27 |
28 | -------------------------------------------------------------------------------- /docker/config/proxy/conf.d/default.conf: -------------------------------------------------------------------------------- 1 | server { 2 | 3 | listen 80; 4 | 5 | server_name localhost; 6 | root /data/www; 7 | index index.php index.html index.htm; 8 | 9 | location / { 10 | # Redirect everything that isn't a real file to index.php 11 | try_files $uri $uri/ /index.php$is_args$args; 12 | } 13 | 14 | # deny accessing php files for the /assets directory 15 | location ~ ^/assets/.*\.php$ { 16 | deny all; 17 | } 18 | 19 | location ~ \.php$ { 20 | include fastcgi_params; 21 | fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 22 | fastcgi_pass cgi:9000; 23 | try_files $uri =404; 24 | } 25 | 26 | location ~* /\. { 27 | deny all; 28 | } 29 | 30 | } 31 | -------------------------------------------------------------------------------- /docs/如何安装Swoole扩展.md: -------------------------------------------------------------------------------- 1 | # 如何安装 Swoole 扩展 2 | 3 | #### 如何安装 Swoole 扩展 4 | 5 | ```shell 6 | # 进入 PHP 容器 7 | [root@localhost Docker-LNMP]# docker exec -it cgi bash 8 | 9 | # 解决 gcc 版本过低的问题 10 | yum -y install centos-release-scl 11 | yum -y install devtoolset-7 12 | scl enable devtoolset-7 bash 13 | 14 | # 下载、安装 15 | wget https://github.com/swoole/swoole-src/archive/v4.2.1.tar.gz &&\ 16 | tar -zxvf v4.2.1.tar.gz &&\ 17 | cd swoole-src-4.2.1 &&\ 18 | phpize &&\ 19 | ./configure &&\ 20 | make && make install &&\ 21 | sed -i '$a \\n[swoole]\nextension=swoole.so' /etc/php.ini &&\ 22 | cd ../ && rm -rf v4.2.1.tar.gz swoole-src-4.2.1 23 | 24 | # 退出 PHP 容器 25 | [root@510d01c199f5 /]# exit 26 | exit 27 | 28 | # 重启 PHP 容器 29 | [root@localhost Docker-LNMP]# docker restart cgi 30 | ``` 31 | 32 | ![swoole](https://raw.githubusercontent.com/duiying/img/master/swoole.png) 33 | 34 | -------------------------------------------------------------------------------- /docs/如何新建一个站点.md: -------------------------------------------------------------------------------- 1 | # 如何新建一个站点 2 | 3 | 比如部署一个 Lumen 项目,并且可以通过 http://lumen-app.com 访问: 4 | 5 | **1、配置 Nginx** 6 | 7 | Docker-LNMP/docker/config/proxy/conf.d 目录下新建一个配置文件 lumen-app.conf,lumen-app.conf 内容如下: 8 | 9 | ``` 10 | server { 11 | listen 80; 12 | server_name lumen-app.com; 13 | 14 | root /data/www/lumen-app/public; 15 | index index.html index.htm index.php; 16 | 17 | location / { 18 | try_files $uri $uri/ /index.php?$query_string; 19 | } 20 | 21 | location ~ \.php$ { 22 | fastcgi_pass cgi:9000; 23 | fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 24 | include fastcgi_params; 25 | try_files $uri =404; 26 | } 27 | } 28 | ``` 29 | 30 | **2、安装 Lumen 项目** 31 | 32 | ```shell 33 | # Docker-LNMP/www 目录下安装 Lumen 框架,安装过程如下: 34 | 35 | $ cd www 36 | $ ls 37 | index.php 38 | $ composer create-project laravel/lumen lumen-app "5.7.*" 39 | ``` 40 | 41 | **3、修改本地 hosts** 42 | 43 | ``` 44 | # 这里本地用的是 Macbook,所以这里填的是 127.0.0.1,如果你用的是虚拟机,需要将 127.0.0.1 改成虚拟机的 IP 地址 45 | 127.0.0.1 lumen-app.com 46 | ``` 47 | 48 | **4、重启 Nginx** 49 | 50 | ```shell 51 | $ docker restart proxy 52 | proxy 53 | ``` 54 | 55 | **5、浏览器访问** 56 | 57 | 访问 http://lumen-app.com ,可以看到页面显示出下面欢迎内容: 58 | 59 | ``` 60 | Lumen (5.7.8) (Laravel Components 5.7.*) 61 | ``` 62 | 63 | 至此,一个 Lumen 项目部署完成。 -------------------------------------------------------------------------------- /docker/files/cgi/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM centos:7.2.1511 2 | 3 | RUN yum install -y epel-release &&\ 4 | rpm -ivh https://mirrors.tuna.tsinghua.edu.cn/remi/enterprise/remi-release-7.rpm 5 | 6 | RUN yum install -y --enablerepo=remi --enablerepo=remi-php72 \ 7 | php \ 8 | php-opcache \ 9 | php-devel \ 10 | php-mbstring \ 11 | php-xml \ 12 | php-zip \ 13 | php-cli \ 14 | php-fpm \ 15 | php-mcrypt \ 16 | php-mysql \ 17 | php-pdo \ 18 | php-curl \ 19 | php-gd \ 20 | php-mysqld \ 21 | php-bcmath \ 22 | php-redis \ 23 | php-process \ 24 | wget \ 25 | gcc \ 26 | gcc-c++ \ 27 | make \ 28 | unzip \ 29 | cronie \ 30 | crontabs &&\ 31 | mkdir /run/php-fpm/ &&\ 32 | yum clean all 33 | 34 | RUN curl -sSL https://getcomposer.org/installer | php &&\ 35 | mv composer.phar /usr/local/bin/composer &&\ 36 | composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ &&\ 37 | composer global require fxp/composer-asset-plugin v1.4.2 -vvv 38 | 39 | RUN sed -i 's/listen = 127.0.0.1:9000/listen = [::]:9000/p' /etc/php-fpm.d/www.conf &&\ 40 | sed -i '/listen.allowed_clients = 127.0.0.1/d' /etc/php-fpm.d/www.conf 41 | 42 | RUN wget https://github.com/edenhill/librdkafka/archive/v1.0.0-RC8.tar.gz &&\ 43 | tar -zxvf v1.0.0-RC8.tar.gz &&\ 44 | cd librdkafka-1.0.0-RC8 &&\ 45 | ./configure &&\ 46 | make && make install &&\ 47 | cd ../ && rm -rf v1.0.0-RC8.tar.gz librdkafka-1.0.0-RC8 48 | 49 | RUN wget https://github.com/arnaud-lb/php-rdkafka/archive/3.0.5.tar.gz &&\ 50 | tar -zxvf 3.0.5.tar.gz &&\ 51 | cd php-rdkafka-3.0.5 &&\ 52 | phpize &&\ 53 | ./configure &&\ 54 | make && make install &&\ 55 | sed -i '$a \\n[rdkafka]\nextension=rdkafka.so' /etc/php.ini &&\ 56 | cd ../ && rm -rf 3.0.5.tar.gz php-rdkafka-3.0.5 57 | 58 | COPY docker-entrypoint.sh /usr/local/bin/ 59 | 60 | RUN chmod +x /usr/local/bin/docker-entrypoint.sh 61 | 62 | RUN sed -i '/session required pam_loginuid.so/c\#session required pam_loginuid.so' /etc/pam.d/crond 63 | 64 | CMD ["docker-entrypoint.sh"] 65 | -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3' 2 | 3 | services: 4 | cgi: 5 | container_name: cgi 6 | build: ./docker/files/cgi 7 | tty: true 8 | restart: always 9 | expose: 10 | - "9000" 11 | volumes: 12 | - ./www:/data/www 13 | - ./docker/log/cgi:/var/log/php-fpm 14 | depends_on: 15 | - mysql 16 | - redis 17 | links: 18 | - mysql:mysql 19 | - redis:redis 20 | proxy: 21 | container_name: proxy 22 | build: ./docker/files/proxy 23 | tty: true 24 | restart: always 25 | ports: 26 | - "80:80" 27 | - "443:443" 28 | volumes: 29 | - ./www:/data/www 30 | - ./docker/config/proxy/conf.d:/etc/nginx/conf.d 31 | - ./docker/log/proxy:/var/log/nginx 32 | depends_on: 33 | - cgi 34 | links: 35 | - cgi 36 | mysql: 37 | container_name: mysql 38 | image: daocloud.io/library/mysql:5.6 39 | restart: always 40 | expose: 41 | - "3306" 42 | ports: 43 | - "3306:3306" 44 | volumes: 45 | - ./docker/data/mysql:/var/lib/mysql 46 | environment: 47 | - MYSQL_ROOT_PASSWORD=root 48 | - MYSQL_DATABASE=yii2 49 | redis: 50 | container_name: redis 51 | image: daocloud.io/library/redis 52 | restart: always 53 | expose: 54 | - "6379" 55 | ports: 56 | - "6379:6379" 57 | volumes: 58 | - ./docker/data/redis:/data 59 | command: redis-server --appendonly yes 60 | phpmyadmin: 61 | container_name: phpmyadmin 62 | image: daocloud.io/daocloud/phpmyadmin 63 | expose: 64 | - '80' 65 | ports: 66 | - "8080:80" 67 | environment: 68 | - PMA_ARBITRARY=0 69 | - PMA_HOST=mysql 70 | # 如果取消下面两行注释, phpmyadmin就不用输入用户名和密码, 可以直接登录 71 | # - PMA_USER=root 72 | # - PMA_PASSWORD=root 73 | depends_on: 74 | - mysql 75 | links: 76 | - mysql:mysql 77 | phpredisadmin: 78 | container_name: phpredisadmin 79 | image: erikdubbelboer/phpredisadmin 80 | expose: 81 | - '80' 82 | ports: 83 | - "8081:80" 84 | environment: 85 | - REDIS_1_HOST=redis 86 | - REDIS_1_NAME=redis 87 | depends_on: 88 | - redis 89 | links: 90 | - redis:redis 91 | -------------------------------------------------------------------------------- /docker-compose-fast.yml: -------------------------------------------------------------------------------- 1 | version: '3' 2 | 3 | services: 4 | cgi: 5 | container_name: cgi 6 | image: registry.cn-beijing.aliyuncs.com/duiying/php7.2:1.0 7 | tty: true 8 | restart: always 9 | expose: 10 | - "9000" 11 | volumes: 12 | - ./www:/data/www 13 | - ./docker/log/cgi:/var/log/php-fpm 14 | depends_on: 15 | - mysql 16 | - redis 17 | links: 18 | - mysql:mysql 19 | - redis:redis 20 | proxy: 21 | container_name: proxy 22 | image: registry.cn-beijing.aliyuncs.com/duiying/nginx:1.0 23 | tty: true 24 | restart: always 25 | ports: 26 | - "80:80" 27 | - "443:443" 28 | volumes: 29 | - ./www:/data/www 30 | - ./docker/config/proxy/conf.d:/etc/nginx/conf.d 31 | - ./docker/log/proxy:/var/log/nginx 32 | depends_on: 33 | - cgi 34 | links: 35 | - cgi 36 | mysql: 37 | container_name: mysql 38 | image: daocloud.io/library/mysql:5.6 39 | restart: always 40 | expose: 41 | - "3306" 42 | ports: 43 | - "3306:3306" 44 | volumes: 45 | - ./docker/data/mysql:/var/lib/mysql 46 | environment: 47 | - MYSQL_ROOT_PASSWORD=root 48 | redis: 49 | container_name: redis 50 | image: daocloud.io/library/redis 51 | restart: always 52 | expose: 53 | - "6379" 54 | ports: 55 | - "6379:6379" 56 | volumes: 57 | - ./docker/data/redis:/data 58 | command: redis-server --appendonly yes 59 | phpmyadmin: 60 | container_name: phpmyadmin 61 | image: daocloud.io/daocloud/phpmyadmin 62 | expose: 63 | - '80' 64 | ports: 65 | - "8080:80" 66 | environment: 67 | - PMA_ARBITRARY=0 68 | - PMA_HOST=mysql 69 | # 如果取消下面两行注释, phpmyadmin就不用输入用户名和密码, 可以直接登录 70 | # - PMA_USER=root 71 | # - PMA_PASSWORD=root 72 | depends_on: 73 | - mysql 74 | links: 75 | - mysql:mysql 76 | phpredisadmin: 77 | container_name: phpredisadmin 78 | image: erikdubbelboer/phpredisadmin 79 | expose: 80 | - '80' 81 | ports: 82 | - "8081:80" 83 | environment: 84 | - REDIS_1_HOST=redis 85 | - REDIS_1_NAME=redis 86 | depends_on: 87 | - redis 88 | links: 89 | - redis:redis 90 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Docker-LNMP 2 | 3 | 利用 Docker-Compose 编排 LNMP 开发环境 4 | 5 | ### 清单 6 | 7 | - PHP 7.2 8 | - Nginx 9 | - MySQL 5.6 10 | - Redis 11 | - phpMyAdmin 12 | - phpRedisAdmin 13 | 14 | ### 目录结构 15 | ``` 16 | Docker-LNMP 17 | |----docker Docker 目录 18 | |--------config 配置文件目录 19 | |------------proxy Nginx 配置文件目录 20 | |--------files DockerFile 文件目录 21 | |------------cgi php-fpm DockerFile 文件目录 22 | |----------------Dockerfile php-fpm DockerFile 文件 23 | |----------------docker-entrypoint.sh php-fpm 启动脚本 24 | |------------proxy Nginx DockerFile 文件目录 25 | |----------------Dockerfile Nginx DockerFile 文件 26 | |----------------docker-entrypoint.sh Nginx 启动脚本 27 | |--------log 日志文件目录 28 | |------------cgi php-fpm 日志文件目录 29 | |------------proxy Nginx 日志文件目录 30 | |----www 应用根目录 31 | |--------index.php PHP 例程 32 | |----README.md 说明文件 33 | |----docker-compose.yml docker compose 配置文件(完整版: LNMP + Redis + phpMyAdmin + phpRedisAdmin) 34 | ``` 35 | 36 | ### 准备 37 | 38 | ```shell 39 | # 安装 Docker 和 Docker-Compose 40 | yum -y install epel-release 41 | yum -y install docker docker-compose 42 | 43 | # 启动 Docker 服务 44 | service docker start 45 | 46 | # 配置阿里云 Docker 镜像加速器(建议配置加速器, 可以提升 Docker 拉取镜像的速度) 47 | mkdir -p /etc/docker 48 | vim /etc/docker/daemon.json 49 | 50 | # 新增下面内容 51 | { 52 | "registry-mirrors": ["https://8auvmfwy.mirror.aliyuncs.com"] 53 | } 54 | 55 | # 重新加载配置、重启 Docker 56 | systemctl daemon-reload 57 | systemctl restart docker 58 | ``` 59 | 60 | ### 安装 61 | 62 | ```shell 63 | # 克隆项目 64 | git clone https://github.com/duiying/Docker-LNMP.git 65 | # 进入目录 66 | cd Docker-LNMP 67 | # 容器编排(使用加速版,推荐,耗时约 10 分钟) 68 | docker-compose -f docker-compose-fast.yml up -d 69 | ``` 70 | 71 | ### 测试 72 | 73 | 执行成功 74 | 75 | ``` 76 | Creating cgi ... done 77 | Creating proxy ... done 78 | Creating mysql ... 79 | Creating phpmyadmin ... 80 | Creating phpredisadmin ... 81 | Creating cgi ... 82 | Creating proxy ... 83 | ``` 84 | 85 | 访问 IP,效果图如下(可能需要等几秒钟): 86 | 87 |
88 | 89 | ### 学习文档 90 | 91 | - [如何新建一个站点](docs/如何新建一个站点.md) 92 | - [如何安装 Yaf 扩展](docs/如何安装Yaf扩展.md) 93 | - [如何安装 Swoole 扩展](docs/如何安装Swoole扩展.md) 94 | 95 | ### 可能遇到的问题 96 | 97 | ```bash 98 | # Error 信息 99 | ERROR: for mysql Cannot start service mysql: endpoint with name mysql already exists in network docker-lnmp_default 100 | # 解决方案 101 | 这是由于端口被占用,需要清理此容器的网络占用 102 | 格式:docker network disconnect --force 网络模式 容器名称 103 | docker network disconnect --force docker-lnmp_default mysql 104 | 检查是否还有其它容器占用 105 | 格式:docker network inspect 网络模式 106 | ``` 107 | 108 | ### 更新日志 109 | 110 | - cgi 容器支持 crontab 111 | - PHP 支持 rdkafka 扩展 112 | - PHP 支持 POSIX、PCNTL 扩展 113 | - 新增学习文档 114 | 115 | ### 如何清理所有容器和镜像?(谨慎操作!这会清除机器下所有容器或镜像) 116 | 117 | ```shell 118 | # 删除所有容器 119 | docker rm -f $(docker ps -aq) 120 | # 删除所有镜像 121 | docker rmi $(docker images -q) 122 | ``` 123 | 124 | ### 参考 125 | - [https://github.com/gengxiankun/dockerfiles](https://github.com/gengxiankun/dockerfiles) 126 | --------------------------------------------------------------------------------