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

3,214 阅读5分钟

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

工具准备

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

image.png


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

基础环境跑起来

目标

nginx  和 php-fpm  的两个docker能够互联,读取同一份代码

步骤

拉取 nginx 基础镜像

docker pull nginx

image.png

快速启动 nginx 容器

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

参数解读

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

现在能看到已经有一个 nginx 容器在运行

image.png


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

指定宿主机目录

借助 -v 参数
为了演示,在系统根目录新建了一个 docker-server 目录,文件和文件夹如下,自己实现的时候大可在 home 目录下做

image.png


image.png

我们把之前的容器删除,重新执行命令

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      连接另外一个容器

这就明白了。
1、我们刚启动的 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;
    }
}

2、增加 --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

3、刷新页面

image.png

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

4、我们修改下 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;
    }
}

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

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


6、刷新页面

image.png

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

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

--network network                Connect a container to a network

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

image.png

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

执行完就可以在VSCode里看到新创建的网络
image.png

我们接着上边设置,换另外一种方式链接容器

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

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

3、 重启 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

4、刷新页面,仍旧是我们熟悉的页面

image.png

互联方案三:Docker Compose

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

遗留问题

1、连接数据库
2、安装php扩展

下篇预告

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

参考