docker
在上一篇在中,已经完成了手工搭建的多容器 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 = 3306default-character-set = utf8mb4 [mysqld] user = mysql port = 3306sql_mode = NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLESdefault-storage-engine = InnoDBdefault-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 = 3slow-query-log-file = /var/lib/mysql/mysql.slow.log log-error = /var/lib/mysql/mysql.error.logdefault-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# 安装 swooleRUN 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/路径
进行挂载是可以执行的。
image.png
切到浏览器,登录下试试,可以看到已经能够登录了。
然后 phpinfo 中也已经有了 swoole,那么,大功告成。
logged in
swoole
结尾
基于 docker-compose 搭建管理 lnmp 环境到此结束,接下来再用现在的环境搞点事情,好好研究下 laravel 和 swoole。
然后有个问题,既然在这里可以单独运行一个容器来处理 artisan , 那么在上一篇手动搭建的版本中是不是也可以这样处理呢?
作者:南瓜方糖
链接:https://www.jianshu.com/p/69701a8fa0b8