在上一篇在中,已经完成了手工搭建的多容器 LNMP 开发环境,但是在实际使用起来还是存在一些问题。例如:composer 命令太长;无法使用 laravel 框架的 artisan 功能以及环境迁移非常不便等。
为了解决这些麻烦,这次就学习下使用 docker-compose
来定制和管理自己的环境。
[ 点我跳转上一篇 ]
注意事项:
dockerfile 写不对的话,执行
docker-compose up
经常有启动后容器挂掉的情况,然后又看不到具体报错,这个时候可以去执行下docker build -t php-fpm:v1.0 .
单独构建环境,如果出错了就可以快速查找。php.ini 修改后需要重启容器,否则不生效,在容器内也查看不到新增的修改。
简介
dockerfile :
用来构建镜像的工具,记录和包含安装运行的环境和程序代码等。docker 官方的镜像也是基于 dockerfile 文件构建的。详情可见 [ docker-library ] 。
docker-compose :
是 docker 多容器管理器,可以把已有容器编排为服务并提供更便捷的操作方式。
有了这两个工具后,我们就可以对环境实现快速重置或迁移了。
准备工作
创建一下结构的文件夹,当然也可以根据自己的喜好来。
这里把 php 换成了 7.2 版本,然后 mysql 也换成了 8.0,然后本地的配置文件修改后,需要重启服务才能生效。
docker-compose-lnmp/
├── docker-compose.yml #docker-compose 文件
├── service #存放相关容器的配置
│ ├── mysql
│ │ ├── config
│ │ │ └── mysqld.cnf
│ │ ├── data
│ │ └── log
│ ├── nginx
│ │ ├── config
│ │ │ └── default.conf
│ │ └── log
│ ├── php7.2
│ │ ├── config
│ │ │ └── php7.2
│ │ │ ├── php-fpm.d
│ │ │ │ └── www.conf
│ │ │ ├── php.ini
│ │ └── log
│ │ └── Dockerfile
└── www
└── index.php
php 和 nginx 的配置文件可以从之前的环境中复制出来,mysql 的配置文件内容如下:
[client]
port = 3306
default-character-set = utf8mb4
[mysqld]
user = mysql
port = 3306
sql_mode = NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
default-storage-engine = InnoDB
default-authentication-plugin = mysql_native_password
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect = 'SET NAMES utf8mb4'
disable-log-bin
skip-character-set-client-handshake
explicit_defaults_for_timestamp
slow_query_log
long_query_time = 3
slow-query-log-file = /var/lib/mysql/mysql.slow.log
log-error = /var/lib/mysql/mysql.error.log
default-time-zone = '+8:00'
[mysql]
default-character-set = utf8mb4
Dockerfile 文件编写
这里就先只有 php 用了dockerfile,而且只安装了 pdo_mysql 和 swoole,如果需要 redis 或其他扩展再加上去就可以了。
FROM php:7.2-fpm
MAINTAINER yf-wu@qq.com
RUN apt-get update && apt-get install -y wget libfreetype6 libfreetype6-dev libmcrypt-dev libmcrypt4 libcurl3-dev \
&& apt install -y build-essential libprotobuf-dev libboost-dev openssl protobuf-compiler \
&& docker-php-ext-install pdo pdo_mysql
# 安装 swoole
RUN wget https://github.com/swoole/swoole-src/archive/v4.2.2.tar.gz -O swoole.tar.gz \
&& mkdir -p swoole \
&& tar -xf swoole.tar.gz -C swoole --strip-components=1 \
&& rm swoole.tar.gz \
&& cd swoole \
&& phpize \
&& ./configure \
&& make -j$(nproc) \
&& make install \
&& cd .. \
&& rm -r swoole \
&& docker-php-ext-enable swoole
docker-compose 文件编写
version说明
这个东西其实挺容易看明白的,有哪些定义看不懂也比较容易查到资料,可以参考这里
[ 点我 ]
version: '3.7'
services:
mysql:
image: mysql:8.0
volumes:
- ./service/mysql/config/mysqld.cnf:/etc/mysql/conf.d/mysql.cnf:ro
- ./service/mysql/data:/var/lib/mysql/:rw
- ./service/mysql/log/:/var/log/mysql/:rw
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: root
php-fpm-7-2:
#image: php:7.2-fpm
build: ./service/php7.2/
volumes:
- ./www/:/var/www/html/
- ./service/php7.2/config/php.ini:/usr/local/etc/php/php.ini:rw
- ./service/php7.2/php-fpm.d/www.conf:/usr/local/etc/php-fpm.d/www.conf:rw
environment:
- TZ=Asia/Shanghai
depends_on:
- mysql
links:
- mysql:mysql
nginx:
image: nginx:latest
ports:
- "80:80"
- "443:443"
volumes:
- ./www/:/usr/share/nginx/html/:rw
- ./service/nginx/config:/etc/nginx/conf.d/
- ./service/nginx/log/:/var/log/nginx/:rw
depends_on:
- php-fpm-7-2
links:
- php-fpm-7-2:php-fpm-7-2
composer:
image: composer
volumes:
- ./www:/app
depends_on:
- php-fpm-7-2
启动服务
文件编写完成后,在 docker-compose-lnmp 文件夹下执行 docker-compose up
即可,该命令不会在后台执行,当命令行中断或终端关闭的时候,服务也就停了,后台执行可以使用 -d
后缀。
另外也可以用 docker-compose stop
来停止,docker-compose down
停止并删除。
运行 docker-compose run --rm composer -v
查看 composer 版本,虽然命令还是有点长,但比之前简洁了很多。
docker-compose run --rm composer create-project laravel/laravel laravel
创建一个新的 laravel 项目。
然后就是和上一篇一样的流程,new db -> make:auth -> migrate -> make:seeder -> dump-autoload -> db:seed。
执行 dump-autoload
时,需要指定一下路径 -v $pwd/www/laravel composer dump-autoload
。
ps:
这里在后期使用时发现还有点问题,于是在 windows 下又折腾了一把,通过 $pwd/路径
进行挂载是可以执行的。
切到浏览器,登录下试试,可以看到已经能够登录了。
然后 phpinfo 中也已经有了 swoole,那么,大功告成。
结尾
基于 docker-compose 搭建管理 lnmp 环境到此结束,接下来再用现在的环境搞点事情,好好研究下 laravel 和 swoole。
然后有个问题,既然在这里可以单独运行一个容器来处理 artisan , 那么在上一篇手动搭建的版本中是不是也可以这样处理呢?
源文件放在了 [ github ]