docker灵活的构建PHP环境的实现
使用docker搭建灵活的线上php环境有时候你可能不太需要一些别人已经集成了的包或者镜像
我们就可以使用以下方式自己动手逐一构建自己所需要的环境结构并在最后实现一键自动化部署
一步一步点亮docker技能树
##. ######== ##########=== /""""""""""""""""".__/=== ~~~{~~~~~~~~~~~~~~~~~/===-~~~ ._____o__/ ..__/ .___.______/
*首先clone[server]项目放到服务器根目录(到后面你也可以构建自己风格的环境结构)
(一阶)使用docker逐一构建
1.下载镜像
dockerpullphp:7.2-fpm冒号后选择版本
dockerpullnginx
dockerpullmysql:5.7不需要本地数据库可忽略
dockerpullredis:3.2不需要本地redis可忽略
dockerimages查看已下载的所有镜像
2.下载完成镜像后运行容器[以下采用--link方式创建容器注意创建顺序]
注:
-i表示允许我们对容器进行操作
-t表示在新容器内指定一个为终端
-d表示容器在后台执行
/bin/bash这将在容器内启动bashshell
-p为容器和宿主机创建端口映射
--name为容器指定一个名字
-v将容器内路径挂载到宿主机路径
--privileged=true给容器特权,在挂载目录后容器可以访问目录以下的文件或者目录
--link可以用来链接2个容器,使得源容器(被链接的容器)和接收容器(主动去链接的容器)之间可以互相通信,解除了容器之间通信对容器IP的依赖
<运行mysql容器>
dockerrun--namemydb-p3306:3306-eMYSQL_ROOT_PASSWORD=123456-dmysql:5.7
注:-MYSQL_ROOT_PASSWORD=123456给mysql设置初始密码
如果不需要搭建本地数据库直接下一步
<运行redis容器>
dockerrun--namemyredis-p6379:6379-dredis:3.2
注:如果不需要搭建本地redis直接下一步
<运行php容器>
dockerrun-d-p9000:9000--namemyphp-v/server/www:/var/www/html-v/server/php:/usr/local/etc/php--linkmydb:mydb--linkmyredis:myredis--privileged=truephp:7.2-fpm
注:如果不需要搭建本地数据库或者redis可以省去--linkmydb:mydb--linkmyredis:myredis
注意-v挂载一个空文件夹是会覆盖容器中的内容,所以配置文件要事先准备好
<运行nginx容器>
dockerrun--namemynginx-d-p80:80-v/server/www:/usr/share/nginx/html-v/server/nginx:/etc/nginx-v/server/logs/nginx.logs:/var/log/nginx--linkmyphp:myphp--privileged=truenginx
注:
-v语句冒号后是容器内的路径我将nginx的网页项目目录配置目录日志目录分别挂载到了我事先准备好的/server目录下
--linkmyphp:myphp将nginx容器和php容器连接通过别名myphp就不再需要去指定myphp容器的ip了
dockerps-a查看所有容器运行成功这里环境也就基本搭建完成了
挂载目录后就可以不用进入容器中修改配置,直接在对应挂载目录下改配置文件修改nginx配置
到/server/nginx/conf.d/Default.conf
server{ listen80: server_namelocalhost: location/{ root/usr/share/nginx/html/blog/public:##/user/share/nginx/html是工作目录 indexindex.htmlindex.phpindex.htm } error-page500502503504/50x.html localtion=/50x.html{ root/usr/share/nginx/html } location~\.php${ fastcgi_passmyphp9000: ##容器与容器之间建立链接必须指定对方IP使用命令sudodockerinspectmyphp可以看到最下面IPAddress参数就是该容器的ip ##我们在创建容器时已经通过--link的方式创建容器,我们可以使用被Link容器的笔名惊醒访问,而不是通过IP,解除了对IP的依赖 fastcgi_indexindex.php fastcgi-paramSCRIPI_FILENAME/var/www/html/blog/public$fastcgi_script_name: ##myphp和mynginx的工作目录不同mynginx是/usr/share/nginx/html ##php是/var/www/html所以在创建容器时我们已经将两个目录都挂在到宿主机相同的目录上了/server/www但这里不能使用宿主机的公共挂载目录 includefastcgi_params: } }
3.PHP扩展库安装
dockerexec-timyphp/bin/bash首先进入容器
docker-php-ext-installpdopdo_mysql安装pdo_mysql扩展
docker-php-ext-installredis
注:此时报错提示redis.so因为一些扩展并不包含在PHP源码文件中
方法一:
tarzxvf/server/php_lib/redis-4.1.0.tgz解压已经下载好的redis扩展包
dockercp/server/php_lib/redis-4.1.0myphp:/usr/src/php/ext/redis将扩展放到容器中再执行安装
注:
直接将扩展包放到容器ext目录里可能会报错Error:Nosuchcontainer:path:myphp:/usr/src/php/ext
你可以多开一个服务器窗口进入php容器中执行docker-php-ext-install redis此时报错error:/usr/src/php/ext/redisdoesnotexist
保持这个状态然后在你的第一个服务器窗口执行上条命令就成功了
(具体原因未知但确实要执行一次docker-php-ext-install命令容器中才会开放/usr/src/php/ext这个目录)
方法二:
注:
官方推荐使用PECL(PHP的扩展库仓库,通过PEAR打包)。用peclinstall安装扩展,然后再用官方提供的docker-php-ext-enable
快捷脚本来启用扩展
peclinstallredis&&docker-php-ext-enableredis
dockerrestartmyphp装完扩展退出容器重启容器
*其它命令
dockerstop$(dockerps-q)停止所有容器
dockerrm$(dockerps-aq)删除所有容器
dockerrmi$(dockerimages-q)删除所有镜像
dockerinspectmyphp查看容器配置信息
*构筑自己的目录结构
你也可以构建自己所要的server目录结构首先要知道挂载一个空文件夹会清空容器中文件夹下所有内容所以应该先拷贝再挂载
例如:创建一个临时容器sudodockerrun--namemynginx-p80:80-it-dnginx
进入到容器中查自己所要的配置文件目录地址例如:/etc/nginx退出容器
拷贝容器中所要的目录结构到宿主机例如:dockercpmydb:/etc/nginx/server/nginx
删除容器创建新容器时就可以挂载该目录了此后对nginx的配置文件的修改就可以直接在宿主机上快捷操作
dockerrun--namemynginx-d-p80:80-v/server/nginx:/etc/nginx--linkmyphp:myphp--privileged=true nginx
(二阶)docker-compose自动化构建
完成以上步骤你就已经初步了解了docker的基本容器操作
docker-compose是编排容器的。例如,你有一个php镜像,一个mysql镜像,一个nginx镜像。如果没有docker-compose,
那么每次启动的时候,你需要敲各个容器的启动参数,环境变量,容器命名,指定不同容器的链接参数等等一系列的操作,
相当繁琐。而用了docker-composer之后,你就可以把这些命令一次性写在docker-composer.yml文件中,以后每次启动
这一整个环境(含3个容器)的时候,你只要敲一个docker-composerup命令就ok了
1.安装docker-compose
curl-Lhttps://github.com/docker/compose/releases/download/1.8.1/docker-compose-`uname-s`-`uname-m`>/usr/local/bin/docker-compose chmod+x/usr/local/bin/docker-compose docker-compose--version
2.一键部署环境
/server/compose/docker-compose.yml已经配置好了直接输入命令即可
cd/server/compose docker-composeup-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:123456 images:mysql:8.0#容器引用镜像 myredis: container_name:"myredis" restart:always ports: -"6379:6379" volumes: -/server/redis:/data -/etc/localtime:etc/localtime:re image:redis:3.2 myphp: container_name:"myphp" restart:always ports: -"9000:9000" volumes: -/server/www:/var/www/html -/sever/php:/usr/local/etc/php -/etc/localtime:/etc/localtime:re links: -"mydb" -"myredis" image:php:7.2-fpm mynginx: container_name:"mynginx" restart:always ports: -"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:re image: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镜像
FROMphp:7.2-fpm#构建自定义镜像过映入的官方镜像 MAINTAINERgoozp"用户名" #设置容器时区和宿主机相同 ENVTZ=Asia/Shanghai RUNln-snf/usr/share/zoneinfo/$TZ/etc/localtome&&echo$TZ>/etc/timezone #更新安装依赖包和PHP核心拓展 RUNapt-getupdate&&apt-getinstall-y\ libfreetype6-dev\ libhpeg62-turbo-dev\ libpng-dev\ &&docker-php-ext-configuregd--with-freetype-dir=/usr/include/--with-jpeg-dir=/usr/include/\ &&docker-php-ext-install-j$(nproc)gd\ &&docker-php-ext-installzip\ &&docker-php-ext-installpdo_mysql\ &&docker-php-ext-installopcache &&docker-php-ext-installmysqli rm-r/var/lib/apt/lists/* #源码包不存在的扩展使用pecl装 RUNpeclinstallredis\ &&peclinstallxdebug\ &&docker-php-ext-enableredisxdebug WORKDIR/data #权限设置 RUNusermod-u1000www-data
自定义php的dockerfile构建自定义镜像同时安装扩展 完成了所有dockerfile配置后docker-compose.yml文件就不需要
再用官方镜像image:php-fpm:7.2而是直接build:./php直接引用目录配置好的Dockerfile
最后提示:镜像一旦创建了下次docker-compose会直接取已有镜像而不会build创建若你修改了Dockerfile配置请记得删除之前镜像
cd/server/compose.dockerfiles docker-composeup-d
以上就是docker所有的环境配置方式
*当你在宿主机上需要用shell调度php执行脚本
dockerexec-itmyphp/bin/bash-c'/usr/local/bin/php/var/www/html/blog/public/index.php'
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。