这里根据各个容器的链接方式,分为两种方式: link 与 network 环境: MacOS 方式一: link方式 项目地址:https://gitee.com/william_ning/docker-lnmp-development-env // 可对照参考 1. 先拉取镜像 nginx php-pfm mysql redis 任意目录下 // 但建议选择一个目录作为工作目录, 这里选择,并新建Workspace, /Users/williamning/Workspace作为工作目录 cd /Users/williamning/Workspace // 进入工作目录下
docker pull nginx:latest
docker pull php:7.4-fpm
docker pull mysql:8.0
docker pull redis:latest
Note: williamning是本人的用户名,换成自己的即可 而且工作目录可任选,不论是mac还是Windows 版本信息如上或者如下,可选择自己想要的 nginx:latest ---> 1.19.10 redis:latest ---> 6.2.3 2. 配置准备工作【是为了后面便于修改配置, 而不用反反复复进入容器中】 nginx mkdir etc docker run --name tmp-nginx -d nginx // 临时容器 docker cp tmp-nginx:/etc/nginx $PWD/etc/nginx // 拷贝容器文件到本机制定目录下 docker rm -f tmp-nginx // 拷贝完成,删除容器 插入: 如果只要nginx容器,执行如下命令即可, 将相关资源放到/Users/williamning/Workspace/www下即可,浏览器输入:localhost就已经可以访问资源了 docker run --name run-nginx -d -p 80:80 -v $PWD/www:/usr/share/nginx/html:ro nginx docker rm -f run-nginx php-fpm docker run --name tmp-php-fpm -d php:7.4-fpm docker cp tmp-php-fpm:/usr/local/etc $PWD/etc/php docker rm -f tmp-php-fpm 配置php-fpm与nginx配合工作 编辑文件 etc/nginx/conf.d/default.conf 加入如下部分:
location ~ \.php$ { fastcgi_pass run-php-74-fpm:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name; include fastcgi_params; }
3. 实例化容器 顺序:[因为前后有依赖【link】关系]
mysql-->redis-->php-fpm-->nginx
mysql mkdir mysql && cd mysql mkdir conf && mkdir logs && mkdir data
docker run \ --name run-mysql-80 \ -p 33060:3306 \ -e MYSQL_ROOT_PASSWORD=root \ -v $PWD/conf:/etc/mysql/conf.d \ -v $PWD/logs:/logs \ -v $PWD/data:/var/lib/mysql \ -d mysql:8.0
cd .. // 回到工作目录 Note: 这里使用33060端口,因3306端口已为其他容器使用~~ redis
docker run \ --name run-redis-latest \ -p 6379:6379 \ -d redis:latest
php-fpm
docker run \ --name run-php-74-fpm \ -v $PWD/www:/var/www/html \ -v $PWD/etc/php:/usr/local/etc \ -v $PWD/log/php:/var/log/php \ -d php:7.4-fpm
nginx
docker run \ --name run-nginx-latest \ -p 8080:80 \ -v $PWD/www:/usr/share/nginx/html \ -v $PWD/etc/nginx:/etc/nginx \ -v $PWD/log/nginx:/var/log/nginx \ --link run-php-74-fpm:php-fpm-container \ --link run-redis-latest:redis \ --link run-mysql-80:mysql \ -d nginx:latest
Note: A. 这里使用8080端口,因80端口已为其他容器使用~~ B. 容器已经全部实例化,如下 C. 此时,各个容器均能单独工作, 尚不能完全协作 D. mysql/redis均能通过可视化工具正常连接 E. windows下, 简要截图如下, 注意,如果从上面直接拷贝命令执行, 换行的地方可能会出现编码异常的问题, 需要手动处理下空格,换行 4. 安装php扩展 因这里要使用pdo-mysql,redis扩展去连接mysql, redis server, 但php-fpm官方镜像并没有默认安装, 需要自行安装 进入php-fpm容器 docker exec -it e3c79200f9ef76d231e5df2d55533969bfe4b0ffd02aa4813e69a1043e8e30fa /bin/sh 安装 pdo-mysql 在/Users/williamning/Workspace/etc/php/php/conf.d【即容器中的/usr/local/etc/php/conf.d】下新建docker-php-ext-pdo_mysql.ini文件, 文件内容:
extension=pdo_mysql.so
执行安装命令: docker-php-ext-install pdo_mysql 通过命令确认 php -m 或者 php -r 'phpinfo();' | grep pdo_mysql 安装redis pecl install redis-5.3.4 && docker-php-ext-enable redis 如果出现 enable igbinary serializer support? [no] : 输入:yes, 后面又出现两个提示, 同样输入yes,结果出现报错,原因:TBD 详情参考: enable igbinary serializer support? · Issue #1196 · phpredis/phpredis · GitHub 这里先统一设置为no,重新安装 pecl install -n redis-5.3.4 && docker-php-ext-enable redis 同理新建 /Users/williamning/Workspace/etc/php/php/conf.d/docker-php-ext-redis.ini 内容:
extension=redis.so
通过命令确认 php -m 或者 php -r 'phpinfo();' | grep redis 然后,重启php-fpm容器 否则,在后面测试mysql/redis会分别提示,没有driver,没有Redis class 5. 开始测试lnmp服务 web根目录下新建文件列表如下: 测试html资源访问 测试php脚本 测试phpinfo 测试PDO连接mysql 测试连接redis 目前看来,一切正常~~ 优化: 建议使用shell脚本去尽量自动化处理~~ 方式二: network方式 项目代码: https://gitee.com/william_ning/docker-lnmp-pickup 运行后的目录结构: https://gitee.com/william_ning/docker-lnmp-dev-env-sh 同时结合docker-compose进行优化,同时开启/关闭/移除容器 步骤: 1. 克隆项目到工作目录【任一目录即可】 2. 执行shell脚本 ./lnmp-preprare.sh 3. 一键式启动容器 docker-compose up -d 4. 继续执行启动容器后的安装php扩展 执行命令, ./lnmp-after-up-containers.sh 5. 浏览器中分别开窗口访问如下地址: localhost:8080 localhost:8080/index.php localhost:8080/phpinfo.php localhost:8080/pdo.php localhost:8080/redis.php 不出意外,一切正常~~ 到此Over~ 6. 不使用时,移除即可 docker-compose dowm 推荐使用命令 // 因为 Docker Compose is now in the Docker CLI, try `docker compose up
docker compose up -d
与
docker compose down
----------------------------------------------------------------分割线---------------------------------------------------------------- 踩坑与过程简要记录: 添加执行权限 2.jenkins构建过程中添加docker容器判断是否启动的功能 - 简书 // jenkins构建过程中添加docker容器判断是否启动的功能 Shell 教程 | 菜鸟教程 // Shell 教程 【Linux】grep 匹配多个关键字_媛测的博客-CSDN博客_grep或的多个匹配项 // 【Linux】grep 匹配多个关键字 用sed、awk、grep同时匹配多个条件(与模式、或模式) - 陌上归人的博客 - 博客园 // 用sed、awk、grep同时匹配多个条件(与模式、或模式) grep无法查找shell传过来的变量?先注意一下文本格式吧! - 云+社区 - 腾讯云 // grep无法查找shell传过来的变量?先注意一下文本格式吧! 踩坑截图 解决完:正常 执行docker-compose up -d 一直报错,如下 // 简单说,就是Version的使用姿势不对
ERROR: Version in "./docker-compose.yml" is invalid. You might be seeing this error because you're using the wrong Compose file version. Either specify a supported version (e.g "2.2" or "3.3") and place your service definitions under the `services` key, or omit the `version` key and place your service definitions at the root of the file to use version 1. For more on the Compose file format versions, see https://docs.docker.com/compose/compose-file/
----------------------------------------------------------------分割线---------------------------------------------------------------- |