docker 灵活的构建 PHP 环境
使用docker搭建灵活的线上php环境 有时候你可能不太需要一些别人已经集成了的包或者镜像
我们就可以使用以下方式自己动手逐一构建自己所需要的环境结构 并在最后实现一键自动化部署
一步一步点亮docker技能树## .## ## ## ==## ## ## ## ## ===/""""""""""""""""".__/ ===~~~ {~~ ~~~~ ~~~ ~~~~ ~~~ ~ / ===- ~~~._____ o __/. . __/.___.______/
* 首先 clone [server] 项目 放到服务器根目录(到后面你也可以构建自己风格的环境结构)
(一阶) 使用 docker 逐一构建
1. 下载镜像
docker pull php:7.2-fpm
冒号后选择版本
docker pull nginx
docker pull mysql:5.7
不需要本地数据库可忽略
docker pull redis:3.2
不需要本地 redis 可忽略
docker images
查看已下载的所有镜像
2. 下载完成镜像后运行容器 [以下采用 --link 方式创建容器 注意创建顺序]
注:
-i 表示允许我们对容器进行操作
-t 表示在新容器内指定一个为终端
-d 表示容器在后台执行
/bin/bash 这将在容器内启动bash shell
-p 为容器和宿主机创建端口映射
--name 为容器指定一个名字
-v 将容器内路径挂载到宿主机路径
--privileged=true 给容器特权,在挂载目录后容器可以访问目录以下的文件或者目录
--link可以用来链接2个容器,使得源容器(被链接的容器)和接收容器(主动去链接的容器)之间可以互相通信,解除了容器之间通信对容器IP的依赖
<运行 mysql 容器>
docker run --name mydb -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
注:-MYSQL_ROOT_PASSWORD=123456 给mysql设置初始密码
如果不需要搭建本地数据库直接下一步
<运行 redis 容器>
docker run --name myredis -p 6379:6379 -d redis:3.2
注: 如果不需要搭建本地redis直接下一步
<运行 php 容器>
docker run -d -p 9000:9000 --name myphp -v /server/www:/var/www/html -v /server/php:/usr/local
/etc/php --link mydb:mydb --link myredis:myredis --privileged=true php:7.2-fpm
注: 如果不需要搭建本地数据库或者redis可以省去--link mydb:mydb --link myredis:myredis 注意-v 挂载一个空文件夹是会覆盖容器中的内容,所以配置文件要事先准备好
<运行 nginx 容器>
docker run --name mynginx -d -p 80:80 -v /server/www:/usr/share/nginx/html -v /server/nginx:
/etc/nginx -v /server/logs/nginx.logs:/var/log/nginx --link myphp:myphp --privileged=true nginx
注:
-v语句冒号后是容器内的路径 我将nginx的网页项目目录 配置目录 日志目录分别挂载到了我事先准备好的/server目录下
--link myphp:myphp 将nginx容器和php容器连接 通过别名myphp就不再需要去指定myphp容器的ip了
docker ps -a
查看所有容器运行成功 这里环境也就基本搭建完成了
挂载目录后就可以不用进入容器中修改配置,直接在对应挂载目录下改配置文件 修改 nginx 配置到 /server/nginx/conf.d/Default.conf
server {listen 80:server_name localhost:location / {root /usr/share/nginx/html/blog/public: ##/user/share/nginx/html是工作目录 index index.html index.php index.htm}error-page 500 502 503 504 /50x.htmllocaltion = /50x.html {root /usr/share/nginx/html}location ~\.php$ {fastcgi_pass myphp 9000:## 容器与容器之间建立链接必须指定对方IP 使用命令sudo docker inspect myphp 可以看到最下面IPAddress参数就是该容器的ip##我们在创建容器时已经通过--link的方式创建容器,我们可以使用被Link容器的笔名惊醒访问,而不是通过IP,解除了对IP的依赖fastcgi_index index.phpfastcgi-param SCRIPI_FILENAME /var/www/html/blog/public$fastcgi_script_name:## myphp和mynginx的工作目录不同mynginx是/usr/share/nginx/html## php是/var/www/html 所以在创建容器时我们已经将两个目录都挂在到宿主机相同的目录上了/server/www但这里不能使用宿主机的公共挂载目录include fastcgi_params:}
}
3.PHP 扩展库安装
docker exec -ti myphp /bin/bash
首先进入容器
docker-php-ext-install pdo pdo_mysql
安装 pdo_mysql 扩展
docker-php-ext-install redis
注: 此时报错提示redis.so 因为一些扩展并不包含在 PHP 源码文件中
方法一:
tar zxvf /server/php_lib/redis-4.1.0.tgz
解压已经下载好的 redis 扩展包
docker cp /server/php_lib/redis-4.1.0 myphp:/usr/src/php/ext/redis
将扩展放到容器中 再执行安装
注: 直接将扩展包放到容器ext目录里可能会报错Error: No such container:path: myphp:/usr/src/php/ext 你可以多开一个服务器窗口 进入php容器中执行docker-php-ext-install redis此时报错error: /usr/src/php/ext/redis does not exist 保持这个状态然后在你的第一个服务器窗口执行上条命令就成功了 (具体原因未知但确实要执行一次docker-php-ext-install命令 容器中才会开放/usr/src/php/ext这个目录)
方法二:
注: 官方推荐使用 PECL(PHP 的扩展库仓库,通过 PEAR 打包)。用 pecl install 安装扩展,然后再用官方提供的 docker-php-ext-enable 快捷脚本来启用扩展
pecl install redis && docker-php-ext-enable redis
docker restart myphp
装完扩展 退出容器 重启容器
* 其它命令
docker container stop $(docker ps -q)
停止所有容器
docker container rm $(docker ps -aq)
删除所有容器
docker rmi $(docker images -q)
删除所有镜像
docker inspect myphp
查看容器配置信息
* 构筑自己的目录结构
你也可以构建自己所要的server目录结构 首先要知道挂载一个空文件夹会清空容器中文件夹下所有内容 所以应该先拷贝再挂载 例如: 创建一个临时容器 sudo docker run --name mynginx -p 80:80 -it -d nginx 进入到容器中查自己所要的配置文件目录地址 例如: /etc/nginx 退出容器 拷贝容器中所要的目录结构到宿主机 例如: docker cp mydb:/etc/nginx /server/nginx 删除容器 创建新容器时就可以挂载该目录了 此后对nginx的配置文件的修改就可以直接在宿主机上快捷操作 docker run --name mynginx -d -p 80:80 -v /server/nginx:/etc/nginx --link myphp:myphp --privileged=true nginx
(二阶) docker-compose 自动化构建
完成以上步骤你就已经初步了解了docker的基本容器操作 docker-compose是编排容器的。例如,你有一个php镜像,一个mysql镜像,一个nginx镜像。如果没有docker-compose, 那么每次启动的时候,你需要敲各个容器的启动参数,环境变量,容器命名,指定不同容器的链接参数等等一系列的操作, 相当繁琐。而用了docker-composer之后,你就可以把这些命令一次性写在docker-composer.yml文件中,以后每次启动 这一整个环境(含3个容器)的时候,你只要敲一个docker-composer up命令就ok了
1. 安装 docker-compose
curl -L https://github.com/docker/compose/releases/download/1.8.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-composechmod +x /usr/local/bin/docker-composedocker-compose --version
2. 一键部署环境
/server/compose/docker-compose.yml已经配置好了 直接输入命令即可
cd /server/compose
docker-compose up -d
version:"2"
sevices:mydb:container_name:"mydb"ports:- "3306:3306"volumes: #挂载的目录写在这里- /server/mysql:/var/lib/mysql- /etc/localtime:/etc/localtime:re #设置容器和宿主机的时间同步environment: # 自定义环境变量MYSQL_ROOT_PASSWORD:123456images:mysql: 8.0 # 容器引用镜像myredis:container_name:"myredis"restart:alwaysports:- "6379:6379"volumes:- /server/redis:/data-/etc/localtime:etc/localtime:reimage: redis:3.2myphp:container_name:"myphp"restart: alwaysports:- "9000:9000"volumes:- /server/www:/var/www/html-/sever/php:/usr/local/etc/php-/etc/localtime:/etc/localtime:relinks:- "mydb"- "myredis"image:php:7.2-fpmmynginx:container_name: "mynginx"restart: alwaysports:- "80:80"links:- "myphp"volnmes:- /server/www:/usr/share/nginx/html- /server/nginx:/etc/nginx- /server/logs/nginx.logsL/var/log/nginx- /etc/localtime:/etc/localtime:reimage: nginx:latest
对比上面运行容器命令来看 docker_yml 的配置结构和语义就一目了然了
(三阶) dokcer-compose 和 dockerfile 完整构建
用了docker-compose实现一键式操作 但问题是PHP的扩展库还是得自己单独装 所以这里需要用到Dockerfile来构建自定义容器镜像
实现真正的一键完成目录:server -| -| compose.dockerfiles -| docker-compose.yml-| mysql -| Dockerfile 这里设置我们自定的dockerfile来构建mysql镜像 | -| nginx -| Dockerfile 这里设置我们自定的dockerfile来构建nginx镜像| -| php -| Dockerfile 这里设置我们自定的dockerfile来构建php镜像| -| redis -| Dockerfile 这里设置我们自定的dockerfile来构建redis镜像
FROM php:7.2-fpm #构建自定义镜像过映入的官方镜像
MAINTAINER goozp "用户名"
#设置容器时区和宿主机相同
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtome && echo $TZ > /etc/timezone
#更新安装依赖包和PHP核心拓展
RUN apt-get update && apt-get install -y \libfreetype6-dev \ libjpeg62-turbo-dev \libpng-dev \ && docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \&& docker-php-ext-install zip \ && docker-php-ext-install pdo_mysql \&& docker-php-ext-install opcache&& docker-php-ext-install mysqlirm -r /var/lib/apt/lists/*
# 源码包不存在的扩展使用pecl装
RUN pecl install redis \&& pecl install xdebug \&& docker-php-ext-enable redis xdebugWORKDIR /data
#权限设置
RUN usermod -u 1000 www-data
自定义php的dockerfile构建自定义镜像同时安装扩展 完成了所有dockerfile配置后 docker-compose.yml文件就不需要 再用官方镜像image:php-fpm:7.2 而是直接build:./php 直接引用目录配置好的Dockerfile 最后提示: 镜像一旦创建了下次docker-compose会直接取已有镜像而不会build创建 若你修改了Dockerfile配置请记得删除之前镜像
cd /server/compose.dockerfiles
docker-compose up -d
以上就是docker所有的环境配置方式
* 当你在宿主机上需要用 shell 调度 php 执行脚本
docker exec -it myphp /bin/bash -c '/usr/local/bin/php /var/www/html/blog/public/index.php'
MySQL8 设置远程访问
进入mysql镜像
docker exec -it mysql8 /bin/bash进入mysql命令行
mysql -uroot -p选择mysql数据库
use mysql;设置远程访问
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root' WITH GRANT OPTION; # 设置远程访问更新密码规则
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'root'; #更新一下用户的密码刷新权限
FLUSH PRIVILEGES; #刷新权限
我的官方群点击此处加入群聊【PHP/web/高级学习交流群】,一起学习,相互讨论。
群内已经有管理将知识体系整理好(源码,学习视频等资料),欢迎加群免费领取。
这套精品PHP教程绝不是市场上的那些妖艳贱货可比,作为web开发的佼佼者PHP并不逊色其他语言,加上Swoole后更加是如虎添翼!进军通信 、物联网行业开发百度地图、百度订单中心、虎牙、战旗TV等!寒冬裁员期过后正是各大企业扩大招人的时期,现在市场初级程序员泛滥,进阶中高级程序员绝对是各大企业急需的人才,这套学习教程适合那些1-5年以内的PHP开发者正处于瓶颈期,想要突破自己进阶中高级、架构师!名额有限,先到先得!
腾讯T3-T4标准精品PHP架构师教程目录大全,只要你看完保证薪资上升一个台阶(持续更新)
部分资料截图:
还有限时精品福利:
★腾讯高级PHP工程师笔试题目
★亿级PV高并发场景订单的处理
★laravel开发天猫商城组件服务
★战旗TV视频直播的架构项目实战
扫描下面二维码领取
对PHP后端技术,对PHP架构技术感兴趣的朋友,我的官方群点击此处,一起学习,相互讨论。
群内已经有管理将知识体系整理好(源码,学习视频等资料),欢迎加群免费领取。
本课程深度对标腾讯T3-T4标准,贴身打造学习计划为web开发人员进阶中高级、架构师提升技术,为自己增值涨薪!加入BAT特训营还可以获得内推大厂名额以及GO语言学习权限!!!
docker 灵活的构建 PHP 环境相关推荐
- Docker构建python环境
Docker构建python环境 --潘登同学的Linux笔记 文章目录 Docker构建python环境 --潘登同学的Linux笔记 Docker网络管理 创建Python容器 创建数据库容器 部 ...
- 生死簿后台管理系统(一)——使用Docker构建开发环境
最近有个段子非常火,说有个程序员梦见自己被阎王召见,让他帮忙开发一个后台管理系统.在一笑而过之后,我觉得如果要是能把这个系统做出来,应该颇具娱乐性,也顺便了解一下高并发以及大数据的相关技术--每天要上 ...
- docker ss-pannel_如何构建Docker镜像
构建Docker 镜像有如下两种方法: (一)使用docker commit命令. (二)使用docker build命令和 Dockerfile 文件. 在这里并不推荐使用docker commit ...
- docker中lnmp访问php页面,Docker下部署LNMP工作环境的教程(详细步骤)
本篇文章给大家带来的内容是关于Docker下部署LNMP工作环境的教程(详细步骤),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 普通PC环境也可以用以下配置,只是MYSQL那里换回 ...
- docker 多阶段构建
多阶段构建 之前的做法 在 Docker 17.05 版本之前,我们构建 Docker 镜像时,通常会采用两种方式: 全部放入一个 Dockerfile 一种方式是将所有的构建过程编包含在一个 Doc ...
- docker容器化python开发环境_如何 Docker 化 Python Django 应用程序
Docker 是一个开源项目,为开发人员和系统管理员提供了一个开放平台,可以将应用程序构建.打包为一个轻量级容器,并在任何地方运行.Docker 会在软件容器中自动部署应用程序. Django 是一个 ...
- 《VMware vCAT权威指南:成功构建云环境的核心技术和方法》一3.8 多站点考虑因素...
本节书摘来自华章出版社<VMware vCAT权威指南:成功构建云环境的核心技术和方法>一书中的第3章,第3.8节,作(美)VMware vCAT 团队,更多章节内容可以访问云栖社区&qu ...
- Docker Compose搭建consul群集环境(了解Docker Compose及常用命令,Docker四种网络,Doker指定端口)
文章目录 Docker Compose搭建consul群集环境 认识Docker Compose IConsul Docker Compose容器编排 Dasker Compose配置常用字段 Bos ...
- Docker多步构建更小的Java镜像
译者按: 最新版Docker将支持多步构建(Multi-stage build),这样使用单个Dockerfile就可以定义多个中间镜像用于构建,测试以及发布等多个步骤,并且有效减小最终镜像的大小. ...
最新文章
- msyql 字段说明
- 我治大学生抄作业毛病的办法——兼答丁又专老师
- js 字符串替换的问题
- Python中“if __name__=='__main__':”理解与总结
- python创建数据库表_Python 操作数据库(1)SQL基础
- 启动activemq_「Java」 - SpringBoot amp; ActiveMQ
- 208.实现Trie(前缀树)
- Jakarta EE工作组正式成立
- 步步为营,重构出模式(2)
- mysql 索引越界_mysql隐式转换造成索引失效的事故总结
- PHP几种常见魔术方法与魔术变量解析 1
- Linux上创建SSH隧道
- DPDK Release 22.07
- ROS主从机通信经验总结
- 2022G3锅炉水处理上岗证题库及答案
- 二叉搜索树前序序列转后序序列(或相反)
- 多传感器融合定位 第七章 基于滤波的融合方法
- 一位博士在华为的22年
- 思维导图怎么画?新手5分钟教程分享
- docker之旅,附带实例脚本