1. 准备环境
系统环境 CentOS7.7,Docker 版本 19.03.6-rc1,docker 的搭建过程请参照这篇文章: CentOS Docker 安装 .
Compose 是用于定义和运行多容器 Docker 应用程序的工具. 通过 Compose, 我们可以使用 YAML 文件来配置应用程序需要的所有服务. 然后, 使用一个命令, 就可以从 YAML 文件配置中创建并启动所有服务.
Docker-compose 安装安装很简单, 从 GitHub 上下载它的二进制包来使用, 最新发行的版本地址: https://github.com/docker/compose/releases .
然后执行以下命令, 并查看版本, compose 就安装好了.
- mv docker-compose-Linux-x86_64 /usr/local/bin/docker-compose
- chmod +x /usr/local/bin/docker-compose // 设置可执行权限
使用命令 docker-compose --version 查看版本, 回显版本号是 1.25.0.
- [root@localhost ~]# docker-compose --version
- docker-compose version 1.25.0, build 0a186604
2. 创建项目目录
进入 / data 目录, 创建 / lnmp 项目目录, 然后在 lnmp 项目目录下创建如下项目结构:
- [root@localhost lnmp]# tree
- .
├── docker-compose.YAML // 编排配置文件
├── mariadb //MariaDB 配置相关目录
│ ├── conf.d
│ │ └── my.cnf
│ └── logs
├── nginx //Nginx 配置相关目录
│ ├── conf.d
│ │ └── default.conf
│ ├── logs
│ └── nginx.conf
├── PHP //PHP 配置相关目录
│ ├── logs
│ ├── PHP.INI
│ └── www.conf
├── Redis //Redis 配置相关目录
│ ├── logs
│ └── Redis.conf
└── www //web 访问目录
├── index.PHP // 测试 phpinfo 文件
├── MySQL.PHP // 测试 mariadb 连接文件
├── Redis.PHP // 测试 Redis 连接文件
└── swoole.PHP // 测试 swoole 服务文件
3.Docker-compose 编排
前面我们讲过, 通过 Compose, 我们可以使用一个 YAML 文件来配置应用程序需要的所有服务. 在项目 lnmp 目录下新建 docker-compose.YAML 文件, 内容如下:
- version: '3'
- networks:
- lnmp.NET:
- driver: bridge
- services:
- mariadb:
- container_name: mariadb
- image: mariadb:10.4
- ports:
- - 3307:3306
- environment:
- MYSQL_ROOT_PASSWORD: 123456
- volumes:
- - /data/lnmp/mariadb/db:/var/lib/MySQL
- - /data/lnmp/mariadb/conf.d:/etc/my.cnf.d
- - /data/lnmp/mariadb/logs:/var/log/mariadb
- restart: always
- networks:
- - lnmp.NET
- nginx:
- container_name: nginx
- image: nginx:1.16.1
- ports:
- - 80:80
- - 443:443
- volumes:
- - /data/lnmp/www:/usr/share/nginx/html
- - /data/lnmp/nginx/nginx.conf:/etc/nginx/nginx.conf
- - /data/lnmp/nginx/conf.d:/etc/nginx/conf.d
- - /data/lnmp/nginx/logs:/var/log/nginx
- depends_on:
- - mariadb
- - Redis
- - PHP
- restart: always
- networks:
- - lnmp.NET
- PHP:
- container_name: PHP
- image: hwphp:7.4-fpm // 自定义镜像, 基于 php7.4-fpm, 支持 Swoole 和 Redis
- volumes:
- - /data/lnmp/www:/usr/share/nginx/HTML
- - /data/lnmp/PHP/PHP.INI:/usr/local/etc/PHP/PHP.INI
- - /data/lnmp/PHP/logs:/usr/local/var/log
- - /data/lnmp/PHP/www.conf:/usr/local/etc/PHP-fpm.d/www.conf
- restart: always
- networks:
- - lnmp.NET
- Redis:
- container_name: Redis
- image: Redis:5.0.7
- ports:
- - 6380:6379
- volumes:
- - /data/lnmp/Redis/db:/var/lib/Redis
- - /data/lnmp/Redis/logs:/var/log/Redis
- restart: always
- networks:
- - lnmp.NET
docker-compose.YAML 是一个配置文件, 该文件是主配置文件, 主要包含 version,services,network, 其中 version,services 为必要元素. 该配置文件涉及到的指令关键字也比较多, 不过不要担心, 我们了解几个常用的指令就可以了.
- version
- networks
- services
- container_name
- image
- build
- ports
- volumes
- restart
- depends_on
- environment
注意, 本文中使用的 PHP 镜像是作者自定义构建的镜像 image: hwphp:7.4-fpm , 其中包含了对 Swoole 和 Redis 的支持, 详细构建方法请参照本站文站: 使用 Docker 构建 PHP7.4 + Swoole + Redis 镜像 https://www.helloweba.net/server/627.html . 在 services PHP 模块也可以使用 build 指定的 dockerfile 自行构建镜像. 格式为: build: ./PHP , 然后在项目 / PHP 目录下建立 dockerfile 文件, 内容就是本站上篇文章中的 dockerfile 文件内容.
4. 配置 Nginx
我们要让 Web 服务跑起来, 并且支持 PHP, 需要先定义好 Nginx 站点配置.
在项目目录 / nginx/conf.d / 下新建 default.conf 文件, 内容如下:
- server {
- listen 80;
- server_name "";
- index index.HTML index.htm index.PHP;
- root /usr/share/nginx/HTML;
- error_page 500 502 503 504 /50x.HTML;
- location = /50x.HTML {
- root /usr/share/nginx/HTML;
- }
- location ~ \.PHP$ {
- fastcgi_pass PHP:9000; #容器名: 端口
- fastcgi_index index.PHP;
- fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
- include fastcgi_params;
- }
- access_log /var/log/nginx/test.log main;
- }
我们还可以在该目录下配置多个. conf 文件, 以支持多域名站点.
5. 启动服务
现在我们可以启动服务了, 在项目 lnmp 目录下 (docker-compose.YAML 所在的目录) 只需一条命令:
docker-compose up -d
执行完毕后会回显以下信息:
再执行 docker-compose ps 查看服务运行情况:
看到如上图中各容器的 state 全部为 Up 时, 我们的 Docker 服务就通过一键启动全部启动起来了.
6. 验证结果
现在我们要进行测试, 验证 lnmp 服务是否正常.
6.1 验证 PHP 服务
- <?PHP
- $dbhost = 'mariadb'; // 数据库服务器, 容器名称
- $dbport = 3306; // 端口
- $dbname = 'hello'; // 数据库名称
- $dbuser = 'root'; // 用户名
- $dbpass = '123456'; // 密码
- // 连接
- try {
- $db = new PDO('mysql:host='.$dbhost.';port='.$dbport.';dbname='.$dbname, $dbuser, $dbpass);
- $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // 设置错误模式
- $db->query('SET NAMES utf8;');
- echo 'The connection is successfu.';
- } catch(PDOException $e) {
- echo '{"result":"failed","msg":" 连接数据库失败!"}';
- exit;
- }
- $dbhost = '192.168.0.100'; // 数据库服务器, docker 宿主机 IP
- $dbport = 3307; // 端口
- <?PHP
- // 连接本地的 Redis 服务
- $Redis = new Redis();
- $Redis->connect('redis', 6379);
- $Redis->auth('123456');
- echo "The connection is successfu.
- ";
- // 查看服务是否运行
- echo "Server is running:" . $Redis->ping();
- <?PHP
- Swoole\Timer::tick(2000, function () {
- echo 'after 2000ms.' . PHP_EOL;
- echo date('Y-m-d H:i:s') . PHP_EOL;
- });
来源: http://www.tuicool.com/articles/3Q3Qnmu