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

工具准备

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

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

基础环境跑起来

目标

nginxphp-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 配置目录挂载到宿主机
在执行命令之前,我们先写好一个配置

  1. server {
  2. root /usr/share/nginx/html;
  3. index index.html index.php;
  4. server_name localhost;
  5. error_log /var/log/nginx/error.log;
  6. access_log /var/log/nginx/access.log;
  7. location ~ \.php$ {
  8. fastcgi_pass 127.0.0.1:9000;
  9. fastcgi_index index.php;
  10. include fastcgi_params;
  11. fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
  12. fastcgi_param PATH_INFO $fastcgi_path_info;
  13. }
  14. }

在 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 文件,一键启动项目。

参考