fpm 镜像地址:https://dev.aliyun.com/detail.html?repoId=1250php
apache 镜像地址:https://dev.aliyun.com/detail.html?spm=5176.1972343.2.51.151b5aaaSVeZ8h&repoId=1220html
尽量的使用基于 alpine 的镜像,体积很小。mysql
docker run -d --rm --name fpm php:7.2.2-fpm-alpine
首先在宿主机中建立 /home/txl/www 目录,用来映射容器中网站根目录。而且根据镜像说明可知,默认网站根目录存放在 /usr/local/apache2/htdocs/ 下:nginx
运行 Apache 容器:git
docker run -d -p 80:80 --rm --name httpd -v /home/txl/www:/usr/local/apache2/htdocs/ httpd:2.4.33-alpine
这时服务器已经具有访问 html 页面的能力了:github
可是还不能识别 PHP 脚本,因此咱们须要修改相关配置。通常须要准备一个 Apache 配置文件,或者从容器中拷贝一个默认的,而后挂载就能够了。根据镜像说明可知,配置文件默认存放在 /usr/local/apache2/conf/httpd.conf:web
拷贝到宿主机中 /home/txl/conf/httpd.conf 下:sql
docker cp httpd:/usr/local/apache2/conf/httpd.conf /home/txl/conf
修改配置,开启以下内容:docker
LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_http_module modules/mod_proxy_http.so LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so
添加虚拟主机站点:apache
<VirtualHost *:80> ServerAdmin txl@com.cn DocumentRoot "/usr/local/apache2/htdocs" ServerName localhost <Directory "/usr/local/apache2/htdocs"> Options None Require all granted </Directory> ProxyRequests Off ProxyPassMatch ^/(.*\.php)$ fcgi://172.17.0.3:9000/var/www/$1 </VirtualHost>
注意: 172.17.0.3 须要替换为真实的 fpm IP, 9000 是 fpm 默认的端口, /var/www 是一会要挂载到 fpm 容器中的网站路径。
首先我使用的是默认网络,宿主机自己是有 docker 网络的,能够经过 ifconfig 查看。
经过 docker network inspect bridge 能够查看各个容器的 ip,保证 fpm 能正确响应:
配置完成后,分别挂载网站目录和配置文件到容器中,从新启动 Apache 容器:
docker run -d -p 80:80 --name httpd -v /home/txl/www:/usr/local/apache2/htdocs/ \ -v /home/txl/conf/httpd.conf:/usr/local/apache2/conf/httpd.conf \ httpd:2.4.33-alpine
从新启动 fpm 容器:
docker run -d --rm --name fpm \ -v /home/txl/www:/var/www \ php:7.2.2-fpm-alpine
这时服务器就能够执行 PHP 脚本了:
以前安装并手工启动了 PHP + FPM + Apache,为了更方便的启动和删除容器,须要使用到编排工具 docker compose。
参考文档:https://docs.docker.com/compose/install/#install-compose
Linux 下须要先安装:
sudo curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose sudo chmod +x /usr/local/bin/docker-compose
新建 compose 文件夹,进入后建立新文件 docker-compose.yml,根据以前的启动命令编辑:
version: "3" services: fpm: image: php:7.2.2-fpm-alpine container_name: fpm volumes: - /home/txl/www:/var/www networks: mywebnet: ipv4_address: 192.158.0.2 httpd: image: httpd:2.4.33-alpine container_name: httpd ports: - "80:80" volumes: - /home/txl/www:/usr/local/apache2/htdocs/ - /home/txl/conf/httpd.conf:/usr/local/apache2/conf/httpd.conf networks: mywebnet: ipv4_address: 192.158.0.3 networks: mywebnet: driver: bridge ipam: config: - subnet: 192.158.0.0/16
该配置文件设置了 fpm 的子网 ip 为 192.158.0.2,所以须要在 httpd.conf 配置中修改对应配置:
进入 docker-compose.yml 文件所在路径,执行:
注意:使用 compose 启动前须要先删除相关容器以及网络
docker-compose [-p 指定名称] up -d
启动成功,查看运行的容器:
查看建立的网络:
访问:
进入 docker-compose.yml 文件所在路径,执行:
# 中止 docker-compose [-p 指定名称] stop # 删除 docker-compose [-p 指定名称] rm
注意:若是以前建立了相同子网,须要先删除以前的,不然会产生冲突。
# 删除空闲网络
docker network prune
# 删除指定网络
docker network rm [network]
nginx 镜像地址:https://hub.docker.com/_/nginx
根据镜像说明可知:
通常须要准备一个 nginx 配置文件,或者先临时启动容器,而后拷贝容器中的默认配置文件:
docker run --name nginx --rm -d nginx:1.15.1-alpine docker cp nginx:/etc/nginx/nginx.conf /home/txl/conf
在 http 节点下添加配置节 server:
server{ listen 80; location / { root /usr/share/nginx/html; index index.html index.htm index.php; } location ~ \.php$ { root /var/www; fastcgi_pass 192.148.0.3:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } }
注意: 192.148.0.3 是 fpm 的子网 ip, 9000 是 fpm 默认的端口, /var/www 是一会要挂载到 fpm 容器中的网站路径。
建立网络 mynginx :
docker network create --driver=bridge --subnet=192.148.0.0/16 mynginx
指定网络 mynginx 启动 nginx 容器:
docker run --name nginx -d --rm -v /home/txl/www:/usr/share/nginx/html \ -v /home/txl/conf/nginx.conf:/etc/nginx/nginx.conf \ --network mynginx -p 80:80 nginx:1.15.1-alpine
指定网络 mynginx 以及指定子网 ip 192.148.0.3 :
docker run --name fpm -d --rm -v /home/txl/www:/var/www \ --network mynginx --ip 192.148.0.3 php:7.2.2-fpm-alpine
访问:
建立新文件 docker-compose.yml,根据以前的启动命令编辑:
version: "3" services: fpm: image: php:7.2.2-fpm-alpine container_name: fpm volumes: - /home/txl/www:/var/www networks: mynginx: ipv4_address: 192.148.0.3 nginx: image: nginx:1.15.1-alpine container_name: nginx ports: - "80:80" volumes: - /home/txl/www:/usr/share/nginx/html/ - /home/txl/conf/nginx.conf:/etc/nginx/nginx.conf networks: mynginx: ipv4_address: 192.148.0.2 networks: mynginx: driver: bridge ipam: config: - subnet: 192.148.0.0/16
进入 docker-compose.yml 文件所在路径,执行:
docker-compose [-p 指定名称] up -d
启动成功~
通常状况下须要两个步骤:设置镜像源(/etc/apk/repositories)和执行安装命令(docker-php-ext-install 标准扩展)。若是直接进入容器操做的话,一旦容器删除全部的修改全都会丢失,所以能够:
以第二种方法为例安装 pdo_mysql 扩展:在 compose 目录下建立 build 文件,新建一个 dockerfile 文件 phpfpm:
FROM php:7.2.2-fpm-alpine RUN echo http://mirrors.ustc.edu.cn/alpine/v3.6/main > /etc/apk/repositories && \ echo http://mirrors.ustc.edu.cn/alpine/v3.6/community >> /etc/apk/repositories RUN apk update && apk upgrade RUN docker-php-ext-install pdo_mysql
修改 docker-compose.yml:
version: "3" services: fpm: build: context: ./build dockerfile: phpfpm image: php:7.2.2-fpm-alpine container_name: fpm volumes: - /home/txl/www:/var/www networks: mywebnet: ipv4_address: 192.158.0.2 httpd: image: httpd:2.4.33-alpine container_name: httpd ports: - "80:80" volumes: - /home/txl/www:/usr/local/apache2/htdocs/ - /home/txl/conf/httpd.conf:/usr/local/apache2/conf/httpd.conf networks: mywebnet: ipv4_address: 192.158.0.3 networks: mywebnet: driver: bridge ipam: config: - subnet: 192.158.0.0/16
而后执行 docker-compose build service名称 :
docker-compose build fpm
最后删除并重启 Fpm 容器:
docker-compose stop fpm docker-compose rm fpm docker-compose up -d fpm