ubuntu 18.04 docker 学习经历(一)Docker PHP

删除回忆录丶 提交于 2019-12-05 14:17:22

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 !
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!