範例原始碼放在 GitHub Repo:titangene/docker-lamp
圖片來源:Gitbook - 《Docker —— 從入門到實踐》正體中文版 by Philipzheng
接著使用 docker run
指令來建立並執行 container,下面是參數說明:
--name my-php-apache
:設定 container 名稱為 my-php-apache
-d
:container 在背景執行-p 8000:80
:指定一個 port,host 對外開 8000 port,container 對內開 80 portphp:7.1-apache
:使用 PHP 官方在 Docker Hub 上提供的 7.1-apache tag 的 image使用 docker ps
指令來確定 container 是否成功執行 (查看正在執行的 container 狀態)
接著是查詢主機的 IP 位址,如果是 Linux 或 masOS 可使用 ifconfig
指令,如果是 Windows 則是使用 ipconfig
指令
開啟瀏覽器並輸入網址 [ip-address]:8000
(Port 是剛剛建立 container 時設定的),會發現出現 403 錯誤,原因是因為我們還沒在 Apache web server 的根目錄 /var/www/html
下放首頁 index.php
或 index.html
:
index.html
所以接著要使用 docker exec
指令進入 container 來新增 index.php
(在外部向執行中的 container 內部下指令,此時會呼叫 Container 內部的 shell 程式來執行你下的指令)
成功進入 container 後可以看到預設工作目錄就是 /var/www/html
,這是因為官方在 image 上已經設定好了 (在 Dockerfile
中設定的 WORKDIR /var/www/html
,詳情請參考官方提供的 Dockerfile
)
接著就在 Apache web server 的根目錄 /var/www/html
下新增 index.php
接著輸入 exit
指令離開 container
然後開啟瀏覽器並輸入網址 [ip-address]:8000
就可以看到 phpinfo()
的畫面
如果要刪除 container 可以使用以下指令:
或是直接使用 docker rm -f
強制刪除正在執行的 container
簡寫,名稱 | 預設 | 說明 |
---|---|---|
-a ,--author |
false | 作者 |
-m ,--message |
false | 提交訊息 |
-p ,--pause |
true | 提交期間暫停執行容器 |
詳情請參考我另外整理的 Dockerfile 學習筆記 by Titangene 筆記。
Dockerfile
是一個文字檔,其中包含了使用者可以在指令列 (command line) 上使用的所有指令,Docker 透過 docker build
指令執行 Dockerfile
中的所有指令來自動建置新的 image。
FROM php:7.1-apache
:第一條命令必須為 FROM
,說明使用哪個 image 作為基底 (Base Image)COPY src /var/www/html/
:將 Dockerfile 所在目錄的 src
資料夾內的資料複製到 container 內的 /var/www/html/
下EXPOSE 80
:開放 80 port-t
:添加標記 (tag)
docker build -t name:tag .
.
(一點):指定 Dockerfile 所在的路徑
.
點指的是當前目錄,也可以換成 Dockerfile 的絕對路徑查看 local 有哪些 image,確定是否有名為 my-php
的 Docker Image
使用 docker ps
指令來確定 container 是否成功執行 (查看正在執行的 container 狀態)
在上一個範例,為了要把 index.php
首頁檔放入 Apache web server 的根目錄 /var/www/html
下,要先利用 docker exec
指令進去 container 裡面操作,但是這樣非常麻煩,有沒有方便的方法?
那就要提到 Docker Volume 的概念:掛載主機上的指定目錄到 container 的指定目錄上 (將主機上的目前目錄 bind 到 container 的指定目錄)。
-v `pwd`:/var/www/html
:將 Host 端的目前目錄 ( pwd
) 掛載到 container 的 /var/www/html
目錄index.php
修改後可以看到 phpinfo
前面已出現剛剛加入的 Hello World
字串:
詳情請參考我另外整理的 Docker Compose 學習筆記 by Titangene 筆記。
docker-compose.yml
YAML 檔來管理多個 Docker containerdocker-compose
指令來啟動、停止和重啟應用,以及應用中的服務和所有依賴服務的 containerbuild
:指定要使用的 Dockerfile 所在目錄,Docker Compose 會自動幫你執行 docker build
指令的動作image
:直接使用某 Docker image 來建立該 containerports: [hostPort]:[ContainerPort]
:設定 port mapping,指定一個 port,host 對外開 [hostPort]
port,container 對內開 [ContainerPort]
portdepends_on
:依據依賴順序啟動服務volumes: [hostPath]:[containerPath]
:掛載主機上的指定 [hostPath]
目錄到 container 的指定目錄 [containerPath]
上environment
:設定環境變數-d
:背景執行用瀏覽器開啟 localhost
就會看到 index.php
的頁面:
接著開啟 localhost:8080
登入 phpMyAdmin:
接著開啟 localhost/db.php
可看到 PHP 能正確讀取到 MySQL 的資料:
-s
:會先讓 container 停止執行,然後再刪除 container-f
:會自動確認刪除 container (原本會問 Y or N)up
建立的容器、網絡、volume、imagedocker-compose down
指令預設只刪除以下內容:
networks
欄位的網絡在 Compose 檔案中,定義在 external
欄位的網絡和 volume 不會被刪除
--rmi type
:刪除 image,type 必須從下面選一個:
all
:刪除任何服務使用的所有 imagelocal
:只刪除沒有在 image
欄位設定的自定標籤 image-v
,--volumes
:刪除 Compose 檔案 volumes
欄位上有命名的 volume 和 attach 到 container 的匿名 volume--remove-orphans
:刪除未在 Compose 檔案中定義的服務容器-t
,--timeout TIMEOUT
:指定 shutdown timeout,以秒為單位,預設為 10 秒詳情請參考我另外整理的 透過 Docker Compose 設定 network by Titangene 筆記。