[Docker实践系列-01]利用Docker搭建PHP开发环境

Docker 重要性不用多作解释,咱们每天吵着云原生,最重要的一门技术,你是否掌握了呢?从今天,一块儿来docker吧! php

工具准备

VSCode请先确认是否安装了Docker插件,若是没有能够安装,这个是可视化的工具,用起来比较方便
html

image.png


安装后就能看到Docker全部镜像、容器、网络、数据卷等的状况
image.png

基础环境跑起来

目标

nginx  和 php-fpm  的两个docker可以互联,读取同一份代码 mysql

步骤

拉取 nginx 基础镜像

docker pull nginx
nginx

image.png

快速启动 nginx 容器

docker run --rm --name test-nginx -p 8080:80  nginxgit

参数解读面试

docker run \    启动容器 --rm \ 容器终中止后能够自动清理容器和相关文件系统,方便调试,也避免每次都手动删除而后重启 --name test-nginx \  命名容器 -p 8080:80 \  开放端口 宿主机8080的请求映射到容器的80端口 nginx 基于的镜像sql

如今能看到已经有一个 nginx 容器在运行
docker

image.png


请求浏览器,能看到咱们熟悉的页面
image.png

指定宿主机目录

借助 -v 参数
为了演示,在系统根目录新建了一个 docker-server 目录,文件和文件夹以下,本身实现的时候大可在 home 目录下作数据库

image.png


image.png

咱们把以前的容器删除,从新执行命令windows

docker run
--rm
--name test-nginx
-p 8080:80
-v /docker-server/www:/usr/share/nginx/html
nginx

刷新页面

image.png

若是尝试修改宿主机的代码内容,刷新页面也能够及时的展现,就再也不赘述

nginx 配置挂载宿主机文件

借助 -v 参数,咱们在宿主机新增一个目录存放 nginx 配置,而后指定容器 nginx 配置目录挂载到宿主机
在执行命令以前,咱们先写好一个配置

server {
    root /usr/share/nginx/html;
    index  index.html index.php;
    server_name localhost;
    error_log  /var/log/nginx/error.log;
    access_log /var/log/nginx/access.log;
 
    location ~ \.php$ {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
}
复制代码

在 www 新增一个 php 文件

<?php

phpinfo();

复制代码

此时咱们的目录结构以下

image.png

执行命令

docker run
--rm
--name test-nginx
-p 8080:80
-v /docker-server/www:/usr/share/nginx/html
-v /docker-server/nginx:/etc/nginx/conf.d
nginx


刷新页面

image.png


请求PHP页面试试
image.png

又是一个熟悉的页面
这种状况第一感受是fpm处理php出错了
咱们刚刚执行启动nginx容器的命令是在前台运行,能够动态的看到nginx的请求日志,以下
image.png


关键词:connect() failed ??意思是链接失败?在链接上游的时候链接被拒绝?
嗯!咱们好像还没制做 fpm 的容器。如今动手

拉取 PHP-FPM镜像

docker pull php:fpm

image.png

快速启动PHP-FPM容器

docker run
--rm
--name php-app
php:fpm

如今咱们两个容器都启动了

image.png

刷新页面
image.png

仍是老样子,而且看到nginx的日志以下
image.png


链接不上?就是说咱们请求 php 文件把这个请求交给 php-fpm 处理,可是nginx请求fpm的时候请求不了。由于在以前的同一台机器里,一个机器的各个端口只要处理好能够容易的互通,如今跨容器如何链接呢?

容器的互联

关于容器间的网络,建议后续了解下文档中 使用网络 一节。容器是一个虚拟出来的盒子,每一个容器都至关于一个进程级别的虚拟环境,跨容器的互联,这里先介绍两种方式,能够用过几个参数便可。

互联方案一:使用 --link 参数指定链接容器

当你执行 docker run --help 能够很清楚的看到全部可用命令参数
-l  分类处 有一个 --link

image.png

--link list      链接另一个容器

这就明白了。
一、咱们刚启动的 fpm 容器不动,先修改 nginx 配置

server {
    root /usr/share/nginx/html;
    index  index.html index.php;
    server_name localhost;
    error_log  /var/log/nginx/error.log;
    access_log /var/log/nginx/access.log;
 
    location ~ \.php$ {
        fastcgi_pass php-app:9000; # php-app就是咱们刚刚启动的fpm的容器名字 9000也是它的默认监听端口
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
}
复制代码

二、增长 --link php-app 参数 以下从新启动

docker run  
--rm --name test-nginx
-p 8080:80
-v /docker-server/www:/usr/share/nginx/html
-v /docker-server/nginx:/etc/nginx/conf.d
--link php-app
nginx

三、刷新页面

image.png

没有502,可是好像这个 php 文件没找到?对了,咱们好像还指定fpm挂载项目代码

四、咱们修改下 nginx 配置,指定 php 脚本查找的根目录

server {
    root /usr/share/nginx/html;
    index  index.html index.php;
    server_name localhost;
    error_log  /var/log/nginx/error.log;
    access_log /var/log/nginx/access.log;
 
    location ~ \.php$ {
         root /var/www/html; # PHP-FPM默认的根目录
        fastcgi_pass php-app:9000; 
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
}
复制代码

五、指定 fpm 挂载的项目根目录,启动 fpm 容器

docker run
--rm
--name php-app
-v /docker-server/www:/var/www/html
php:fpm


六、刷新页面

image.png

互联方案二:使用 --network 指定使用的容器网络实现互联

docker run --help  能看到对--network 的解释

--network network                Connect a container to a network

在VSCode可视化窗口也能看到当前的网络

image.png

一、为了打通容器,咱们先要手动建立一个网络
docker network create my-php-network

执行完就能够在VSCode里看到新建立的网络
image.png

咱们接着上边设置,换另一种方式连接容器

二、 重启 fpm,用--network 显式声明使用的网络

docker run
--rm
--name php-app
--network my-php-network
-v /docker-server/www:/var/www/html
php:fpm

三、 重启 nginx,用--network 显式声明使用的网络

docker run  
--rm --name test-nginx
-p 8080:80
-v /docker-server/www:/usr/share/nginx/html
-v /docker-server/nginx:/etc/nginx/conf.d
--network my-php-network
nginx

四、刷新页面,仍旧是咱们熟悉的页面

image.png

互联方案三:Docker Compose

多个容器构建还有另一种方案,不过打算在另一节中单独讲。

遗留问题

一、链接数据库
二、安装php扩展

下篇预告

下一篇主要围绕 Docker Compose 来编排一个项目,用 nginx php mysql 等作演示,一块儿编写一个 docker-compose.yml 文件,一键启动项目。

参考