官網 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
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
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
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();
** 本地測試配置 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;)
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
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 信息
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 !