在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
使用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 方式创建容器 注意创建顺序] 注: <运行 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目录下
挂载目录后就可以不用进入容器中修改配置,直接在对应挂载目录下改配置文件 修改 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.html localtion = /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.php fastcgi-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 方法二: 注: 官方推荐使用 PECL(PHP 的扩展库仓库,通过 PEAR 打包)。用 pecl install 安装扩展,然后再用官方提供的 docker-php-ext-enable pecl install redis && docker-php-ext-enable redis
* 其它命令 docker stop $(docker ps -q) 停止所有容器 docker rm $(docker ps -aq) 删除所有容器 docker rmi $(docker images -q) 删除所有镜像 docker inspect myphp 查看容器配置信息 * 构筑自己的目录结构 你也可以构建自己所要的server目录结构 首先要知道挂载一个空文件夹会清空容器中文件夹下所有内容 所以应该先拷贝再挂载 (二阶) docker-compose 自动化构建 完成以上步骤你就已经初步了解了docker的基本容器操作 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-compose chmod +x /usr/local/bin/docker-compose docker-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: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镜像 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 \ libhpeg62-turbo-dev \ libpng-dev \ && docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \ && docker-php-ext-install - j$(nproc) gd \ && docker-php-ext-install zip \ && docker-php-ext-install pdo_mysql \ && docker-php-ext-install opcache && docker-php-ext-install mysqli rm -r /var/lib/apt/lists/* # 源码包不存在的扩展使用pecl装 RUN pecl install redis \ && pecl install xdebug \ && docker-php-ext-enable redis xdebug WORKDIR /data #权限设置 RUN usermod -u 1000 www-data 自定义php的dockerfile构建自定义镜像同时安装扩展 完成了所有dockerfile配置后 docker-compose.yml文件就不需要 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' 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持极客世界。 |
请发表评论