ubuntu 18.04 docker 學習經歷(一)Docker PHP

20181230 假期閒來無事,整理一下 docker php 學習經歷

1 、下載安裝

官網
https://docs.docker.com/install/

找到 linux -- Ubuntu https://docs.docker.com/install/linux/docker-ce/ubuntu/#install-docker-ce-1php

安裝 docker-ce
sudo apt-get install docker-ce

二、Docker 理解

1)、每個 Docker container (容器)就是一個特定應用程序,啓動後就是一個特定進程
2)、一個容器就是一項服務
3)、若是咱們須要在多臺服務器上運行多款應用程序,那麼最理想的辦法就是使用虛擬機。
4)、若是咱們須要運行同一應用程序的多套副本,那麼Docker則擁有更多具體優點

** 本文就是假設咱們須要 2 個不一樣版本的 php
5)咱們分別安裝php 5.6 和 php 7.2 的Docker,服務於同一套php腳本的 nginx 網站

三、學習過程

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

四、基本指令

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

五、 下載、安裝、運行 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;)

八、 啓動 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 信息

十、容器內編輯 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 html

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

十一、疑問

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 !
相關文章
相關標籤/搜索