20181230 假期闲来无事,整理一下 docker php 学习经历
1 、下载安装
官网
https://docs.docker.com/install/
找到 linux -- Ubuntu https://docs.docker.com/install/linux/docker-ce/ubuntu/#install-docker-ce-1
安装 docker-ce
sudo apt-get install docker-ce
2、Docker 理解
1)、每一个 Docker container (容器)就是一个特定应用程序,启动后就是一个特定进程
2)、一个容器就是一项服务
3)、如果我们需要在多台服务器上运行多款应用程序,那么最理想的办法就是使用虚拟机。
4)、如果我们需要运行同一应用程序的多套副本,那么Docker则拥有更多具体优势
** 本文就是假设我们需要 2 个不同版本的 php
5)我们分别安装php 5.6 和 php 7.2 的Docker,服务于同一套php脚本的 nginx 网站
3、学习过程
1)、网上几乎所有的 Dcoker 学习资料都是从 Docker nginx 开始的
2)、我也同样是这样子开始的,但是,到了配置 php Docker 的时候,就卡住了!
3)、因为,他们的思路都是连续的,即:Docker PHP 的时候,都是直接 Link 到 Docker nginx 上去了!
4)、他们假设的环境都是纯粹的,只存在 Linux 和 nginx(或者也没有安装过)
5)、他们直接瞄准的是整体开发环境或者运行环境部署,最终全部串联起来成为一个整体
6)、我希望的是一个一个的逐步学习,没有想把他们全部串联起来
7)、目前还没有开始学习 link,也没有学习 DockerFile,当然还没有到 Composer,那是下一步的计划!
8)、我第一个学习环境是 Ubuntu 18.04 ,并且安装了 LAMP ,结果悲剧了!
9)、学习过程中总是不断的遇到各种冲突和错误!例如:80 端口冲突,9000 端口冲突,php 路径不一样
10)、第二个环境:完全卸载删除了第一个环境中的 Apache2,单独使用 nginx
11)、第三个环境:重新建立一个虚拟机,只安装了基本的 ubuntu 18 Server
12)、只有基本明白了 nginx 基本配置和 php 配置,才能正确完成 Docker PHP
4、基本指令
docker search
docker pull
docker images
docker ps , docker ps -a ,docker ps -s
docker stop
docker start
docker rm
最重要的 2 个指令:
docker run
docker exec
5、 下载、安装、运行 php 容器
1)、下载最新版php
docker pull php
2)、下载 php 5.6
sudo docker pull php:5.6-fpm
实际学习过程中可以先完成一个
3)、docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
php 5.6-fpm 3c6963d39c34 23 hours ago 344MB
hello-world latest 4ab4c602aa5e 3 months ago 1.84kB
php 7.2.2-fpm-alpine 59d3e94a05b7 10 months ago 77.2MB
4)、运行 php 7.2 容器
docker run -p 9001:9000 --name myphp72 -v /var/www/html:/var/www/html -d php:7.2.2-fpm-alpine
参数说明:
--name myphp72:将容器命名为 myphp72
-v /var/www/html:/var/www/html : 将宿主机的网站目录(/var/www/html)挂载到容器的网站目录(/var/www/html)
-p 9001:9000:将容器myphp72的 9000 端口映射到宿主机的 9001 端口
*** php 缺省端口是 9000 ,已经被宿主机的php占用,所以,改到 9001
**学习用,网站目录用nginx缺省目录,实际部署时再建立一个其他目录,例如:/data/nignx
5)、运行 php 5.6 容器
docker run -p 9003:9000 --name myphp56 -v /var/www/html:/var/www/html -d php:5.6-fpm
参数说明:
同上,端口改到 9003
6 、配置 nginx 网站、带php脚本的网站
1)、配置 conf
cd /etc/nginx/sites-available
从 default 直接复制 www.docker.9001 www.docker.9003
cd /etc/nginx/sites-available
sudo cp default www.docker.9001
sudo cp default www.docker.9003
/etc/nginx/sites-available$ ls
default www.docker.9001 www.docker.9003
说明:
www.docker.9001 : 使用 myphp72 容器提供 php 服务,php端口:9001,www端口:998
www.docker.9003 : 使用 myphp56 容器提供 php 服务,php端口:9003,www端口:997
default : 宿主机本地 nginx 缺省网站,本地php提供服务,php端口:9000,www端口:80
2)、网站脚本
cd /var/www/html
ls
index.html index.html.apache2 index.nginx-debian.html index.php info.php
其中 index.php 和 info.php是一样的,只有一行 phpinfo();
7 、修改网站配置
** 本地测试配置 nginx 网站,就使用 IP + 端口 方式 (域名方式适合于部署时使用)
** 3 个网站主要差别在于提供 php 服务的这一行 fastcgi_pass
** docker IP 每次启动虚拟机和docker start 顺序不同,就会有变化,使用宿主机映射的地址和端口
以 www.docker.9001 wei li为例,修改如下
# use docker IP
fastcgi_pass 127.0.0.1:9001;
#fastcgi_pass 172.17.0.2:9000;
www.docker.9001 修改结果图如下(端口修改为 listen 998;)
www.docker.9003 修改结果图如下(端口修改为 listen 997;)
8、 启动 php-fpm 容器
docker start myphp72
docker start myphp56
确认一下
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4053b4f7fbfd php:7.2.2-fpm-alpine "docker-php-entrypoi…" 9 seconds ago Up 8 seconds 0.0.0.0:9001->9000/tcp myphp72
58469ed8b428 php:5.6-fpm "docker-php-entrypoi…" 21 seconds ago Up 20 seconds 0.0.0.0:9003->9000/tcp myphp56
9 、网站测试
1)、本地测试 (index.html):
curl curl 127.0.0.1
curl 127.0.0.1:998
curl 127.0.0.1:998
以上 都应该看到的是一样的,因为 root 都是从/var/www/html挂载的
<title>Welcome to nginx!</title>
...
2)、本地测试 (index.php 或 info.php,2 个文件是 cp 的,完全一样):
curl curl 127.0.0.1/info.php
curl 127.0.0.1:998/info.php
curl 127.0.0.1:998/info.php
内容太多,不贴在这里了
3)、浏览器测试(index.html):
http://192.168.1.192
http://192.168.1.192:998
http://192.168.1.192:997
以上内容都是一样的,如下图:
4)、浏览器测试(index.php 或 info.php):
http://192.168.1.192/info.php
本地php提供服务,结果如下
http://192.168.1.192:997/info.php
使用 myphp56 容器提供 php 服务,结果如下
http://192.168.1.192:998/info.php
使用 myphp72 容器提供 php 服务,结果如下
可以看到php 信息内容是不一样的,谁提供php-fpm 服务,显示的是谁的 php 信息
10、容器内编辑 php 脚本
1)docker exec -it myphp56 bash
root@51bbba1928fb:/var/www/html# ls
index.html index.html.apache2 index.nginx-debian.html index.php info.php
apt update
apt install vim
vim info.php
修改后的内容:
<h3>this is docker myphp56
20181230
</h3>
<br>
<?php
phpinfo();
?>
浏览器测试结果:http://192.168.1.192:997/info.php
2)、docker exec -it myphp72 /bin/sh
/var/www/html # ls
index.html index.nginx-debian.html info.php
index.html.apache2 index.php
vi info.php
修改后的内容:
<h3>this is docker myphp72
20181230
</h3>
<br>
<?php
phpinfo();
?>
浏览器测试结果:http://192.168.1.192:998/info.php
11、疑问
1)、为什么 myphp72 容器 docker exec -it myphp72 /bin/sh 不支持 bash?
为什么进入之后只显示路径,不显示 容器ID
为什么容器内不支持 apt?也不支持 apt install ?
大概是因为 myphp72 安装的事精简版的 php7.2-fpm (php:7.2.2-fpm-alpine)
下次再安装一个完整版的 php-fpm 试试
2)、以上 2 次修改容器内的内容之后,浏览器测试发现都变成了最后一次修改内容
回到宿主机 /var/www/html 看到 info.php 也随着变化了!
敢情 -v /var/www/html:/var/www/html 容器内挂载的只是一个ln !
来源:oschina
链接:https://my.oschina.net/u/1440971/blog/2995406