如何在Mac上通过docker配置PHP开发环境
⽬录
使⽤docker-compose配置开发环境
什么是docker-compose
⽬录结构
MySQL
测试
php
Dockerfile
php服务中遇到的坑
php.ini
Nginx
启动
连接数据库
总结
使⽤docker-compose配置开发环境
⼀般⼀个基本的PHP开发环境包括PHP、PHP-FPM、WEB服务器、MySQL数据库,另外还会有Redis或memcache等相关NoSQL服务。我主要是通过docker-compose来配置服务。
什么是docker-compose
docker-compose是⼀个通过YAML⽂件来定义项⽬,项⽬中包含单个或多个容器服务。⼀般配置⽂件名为:l。
⽬录结构
你可以按⾃⼰的喜好组织项⽬,下⾯是我⽤的⽅法,app ⽬录放的是应⽤的代码,services 下⾯是创建服务需要⽤的东西,有些服务需要我们⾃⼰去创建镜像,在⼀个 Dockerfile ⽂件⾥说明⼀下你想要的镜像是什么样的。在创建⾃定义镜像的时候也可能需要⽤到⼀些额外的⽂件,⽐如⼀些配置⽂件,⼀般在创建镜像的时候会把这些配置⽂件复制到镜像⾥。
MySQL
mysql是数据服务,先去给这个服务添加⼀个数据卷,然后在这个服务⾥使⽤⼀下这个数据卷,把数据库⽣成的数据放到这⾥,这样即使我们删除容器,数据服务⾥的数据也会保留在主机上,下回创建容器的时候,可以继续使⽤已有的数据。在volumes 下⾯,添加⼀个名字是 mysql 的数据卷:
volumes: mysql: driver: local
然后再去添加⼀个名字是 MySQL的服务,指定⼀下服务使⽤的镜像,这个镜像我们也可以⽤⾃⼰创建的 Dockerfile 去创建⼀下,或者你不打算定制镜像,也可以直接使⽤现成的,这⾥我⽤了 mysql:5.7 这个镜像。注意最好设置具体要使⽤的版本。
这个镜像⾥有⼀些环境变量,我们可以在定义服务的时候去设置⼀下它们的值,这⾥我设置了 root ⽤户的密码,要创建的数据库,⽤户名,还有密码,你可以根据⾃⼰的需求去修改这些变量的值。
在 mysql 服务上我⽤了 volumes 为它指定了⼀个 MySQL 数据卷,挂载的位置是容器的 /var/lib/mysql ,这是存储数据库的默认的地⽅。因为我本机安装了MySQL服务,3306端⼝被占⽤了,所以指定6306端⼝映射到容器的3306
version: "3"services: mysql: image: mysql:5.7 environment: MYSQL_ROOT_PASSWORD: "root"
MYSQL_DATABASE: "app" MYSQL_USER: "app" MYSQL_PASSWORD: "123456" volumes: -
./services/mysql/data:/var/lib/mysql ports: - "6306:3306"
测试
在我们的 compose ⽂件⾥现在已经有了⼀个叫 mysql 的服务,在命令⾏⼯具下,进⼊到项⽬所在的⽬录,执⾏:
docker-compose up
然后你就会在终端上看到安装镜像和启动容器的过程,然后另开⼀个命令终端,执⾏:
docker-compose execmysql bash
进⼊mysql容器中,然后进⼊数据库检查⼀下:
mysql -uroot -pshow databases;
+--------------------+| Database          |
+--------------------+| information_schema |
| app                |
| mysql              |
| performance_schema || sys                |
+--------------------+5 rows in set (0.03 sec)
这个时候我们发现mysql容器已经可⽤了
php
定义⼀个解释 php 的服务,我打算⾃⼰创建这个服务⽤的镜像,所以⽤了 build,⽽不是 image 。我
告诉了 docker ⾃⼰要创建的这个镜像要使⽤的那个 Dockerfile ⽂件的位置(./services/php/Dockerfile)。
volumes 下⾯是服务⽤的数据卷,我把 compose ⽂件所在⽬录下的 app 这个⽬录,挂载到了容器的 /www/html/app 这个位置上了。这样我可以直接修改项⽬的代码,然后⽴即看到结果;同时由于本机9000端⼝被占⽤,指定9090端⼝映射到容器的9000端⼝
php: build: context: ./services/php dockerfile: Dockerfile volumes: - ./app:/www/html/app ports: - "9090:9000"
Dockerfile
构建 php 服务的镜像⽤的 Dockerfile 是 ./services/php/Dockerfile。FROM,设置了⼀下这个镜像要基于哪个镜像去创建,我⽤了 php:7.1-fpm 这个官⽅提供的镜像。RUN 了⼏⾏命令,主要是去安装⼀些软件包,⽐如⼀些额外的 php 扩展。在安装这些扩展之前,你需要先安装扩展依赖的⼀些其它的软件包,这⾥的 libpng12-dev,libjpeg-dev,就是 gd 这个 php 扩展需要的软件包。然后我⼜ COPY 了配置⽂件到镜像⾥⾯。
FROM php:7.1-fpm
RUN apt-get update && apt-get install -y libpng12-dev libjpeg-dev \
&& rm -rf /var/lib/apt/lists/* \
&& docker-php-ext-configure gd --with-png-dir=/usr --with-jpeg-dir=/usr \
&& docker-php-ext-install gd mysqli pdo_mysql zip opcache
COPY ./config/php.ini /usr/local/etc/php/conf.d/php.ini
php服务中遇到的坑
PHP这个镜像中软件是使⽤的Debian的源,因为众所周知的缘故会导致镜像安装不成功,如图所⽰:
这个时候我们就需要更换源了,第⼀次换成了中科⼤的源,然后发现不⾏,第⼆次更换成了阿⾥云的源,完美完成镜像安装,修改过后的Dockerfile如下:
FROM php:7.1-fpm
RUN sed -i 's//mirrors.aliyun/g' /etc/apt/sources.list \
&& apt-get update && apt-get install -y libpng12-dev libjpeg-dev \
&& rm -rf /var/lib/apt/lists/* \
&& docker-php-ext-configure gd --with-png-dir=/usr --with-jpeg-dir=/usr \
&& docker-php-ext-install gd mysqli pdo_mysql zip opcache
COPY ./config/php.ini /usr/local/etc/php/conf.d/php.ini
使⽤sed命令搜索软件源⽂件,把Debian域名修改为阿⾥云域名
php.ini
⾃定义的 php 配置。把你想要的 php 配置放到这个⽂件⾥,重新 build 镜像,然后再次启动 php 服务的时候会⽤新的镜像重新创建容器,这样配置就会⽣效了。
memory_limit = 256Mpost_max_size = 100Mupload_max_filesize = 100M
Nginx
⽤ image 指定了要使⽤的镜像,ports 设置了发布的端⼝号,让主机上的 8000 对应容器的 80 。depends_on 可以设置服务的依赖,我让 nginx 服务依赖之前定义的 php ,这样会先启动 php ,然后
再启动 nginx 。
另外我⼜⽤了 volumes ⾃⼰设置了⼀个数据卷,让主机上包含 nginx 配置⽂件的⽬录,对应容器⾥的 nginx 服务的配置⽂件⽬录,这样我就可以直接在本机上修改 nginx 的配置⽂件,然后重新启动⼀下 nginx 服务,配置就可以⽣效了。这种⽅法适⽤在开发环境上,因为修改了配置不需要重新 build 镜像,在⽣产环境中,你需要⾃⼰ build 这个 nginx 镜像,把想要的配置直接复制到镜像⾥去。在开发阶段有的时候我们需要查看nginx的⽇志,然后我配置了⽇志⽬录映射到容器,最后⼀个地址是代码⽬录
nginx:    image: nginx:1.12.2    ports:
- "8000:80"    depends_on:
- php    volumes:
- ./services/nginx/config:/etc/nginx/conf.d
- ./services/nginx/logs:/etc/nginx/logs/
- ./app:/www/html/app
./services/nginx/f,这是⼀个最基本的 nginx 配置⽂件,设置了应⽤的 root 是在 /www/html/app 这⾥,我们已经把主机上的 app ⽬录挂载到了容器⾥的 /www/html/app 这个地⽅。
注意这条指令:fastcgi_pass php:9000; 这⾥的 php 是我们定义的 php 这个服务的名字,在 compose ⽂件⾥定义的服务,它们之间可以使⽤服务的名字相互进⾏沟通,因为 docker 内置了 DNS 功能。
server {
listen      80;
server_name  localhost;
root        /www/html/app;
# access_log  /etc/nginx/logs/app.access.log  main;
location / {
index  index.html index.htm index.php;
autoindex  on;
#  include    /usr/local/etc/nginx/conf.d/php-fpm;
#  # include  /usr/local/etc/nginx/conf.f;
if (!-e $request_filename) {
###⼀级⽬录下
rewrite ^/(.*)$ /index.php/$1 last; ###域名下的⼆级⽬录mysql下载的zip版本安装步骤
#rewrite ^/html/(.*)$ /uuabc_home/index.php/$1 last;
}
}
location = /info {
allow  127.0.0.1;
deny    all;
}
location ~ \.php(.*)$  {
# comment try_files $uri =404; to enable pathinfo
# try_files $uri =404;
fastcgi_pass                php:9000;
fastcgi_index              index.php;
fastcgi_split_path_info ^((?U).+\.php)(/?.+)$;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
include /etc/nginx/fastcgi_params;
}
# error_page  404    /404.html;
# error_page  403    /403.html;}
启动
经过上⾯⼏个步骤,我们已经把PHP开发最基本的搞好了,下⾯我们准备看下成果。
在 app ⽬录下创建⼀个 index.php ,内容是:
<?php phpinfo();
进⼊到项⽬下⾯,执⾏:
docker-compose up
连接数据库
在表单服务器选项中填写mysql,⽤户名root,密码填写安装MySQL服务时的root密码,然后登陆进去,如图所⽰:
然后我们就可以愉快的管理数据库了。
总结
⾄此,我们对PHP基本开发环境已经安装好了,如果需要安装⽐如Redis或memcache等服务的话,可以⾃⾏度娘,⾃⼰动⼿。
以上就是如何在Mac上通过docker配置PHP开发环境的详细内容,更多关于在Mac上通过docker配置PHP开发环境的资料请关注其它相关⽂章!

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。