docker

最低限度的 Docker with PHP

Docker 的初心者,最近因為想要弄一些東西就來摸 Docker 了。
公司後端的專案雖然有頻繁的在用 Docker ,但是身為一個行動端 (iOS) 的工程師,對於要怎麼開始動手寫一個 Dockerfile 還真的是不知道(笑)。

這篇就是看完 這部影片 之後,如何用最低限度的設定和內容建置 Docker 的筆記。

環境

OS: macOS Mojave 10.14(18A391)
Docker: 18.06.1-ce-mac73 (26764)

資料夾結構

├── Dockerfile
└── src
    └── index.php

很簡單,就一個 PHP 的檔案,和 docker 的設定檔即可,
PHP 檔案則放在 src 這個資料目錄下。

index.php

src/index.php
<?php
echo "hello world";

這裡放個 echo 出字串即可。

Dockerfile 設定檔

接著就來動手寫 Dockerfile,
推薦可以用 Visual Studio Code 寫,會有上色和自動完成等功能很方便。

先來看完成的檔案內容:

Dockerfile
FROM php:7.2.10-apache-stretch
COPY src/ /var/www/html/
EXPOSE 80

PHP 設定檔

FROM php:7.2.10-apache-stretch

因為我們要執行的是 PHP 應用程式,所以就直接用 PHP 就可以了。

https://hub.docker.com/_/php/

連結是從 Docker Hub 上 php 官方所推出的設定檔。
在當前的時間點(2018/10/6),除去 7.3 RC 的檔案,最新的就是 7.2.10 了
要搭配 web server 的關係,所以就選了有 apache 字眼的設定檔:
image.png

複製檔案到 Container (容器)裡

COPY src/ /var/www/html/

就是把 src 資料夾裡面的東西複製到 docker 容器裡的 www/html 資料目錄。

暴露 80 port

EXPOSE 80

讓外界可以透過 80 port 來存取頁面

建置

docker build -t hello_world .

這個指令可以根據 Dockerfile 的內容建置出對應的映像檔,
而透過 -t 這個 flag ,就可以來自定像是 hellow_world 這樣的名稱。

* 參考: https://docs.docker.com/engine/reference/commandline/build/#tag-an-image--t

運行

docker run -p 8080:80 hello_world

在運行的時候,加上 publish flag -p 就可以進行 port 相關的設定

8080:80

  • 前者 對應到的是主機開放出來的 port ,就是在瀏覽器存取 server 的時候可以存取到的 port
  • 後者 對應到的是 docker container 開放出來的 port ,在這邊的範例就是前面寫的 EXPOSE 8080

執行了這個指令之後,就可以在透過 8080 port ,也就是 localhost:8080
來存取從透過 docker container 80 port 所開放出來的頁面:

image

而這個時候終端機端會呈現執行中的狀態,如果要終止的時候,按下 Ctrl+C 即可停止執行。

* 參考: https://docs.docker.com/engine/reference/commandline/run/#publish-or-expose-port--p---expose

反映更新

在這時候運行起來的 server 所回應的頁面, 並不會 因為 src/ 裡面的檔案有所改變,頁面重整就會改變。
因此在運行的指令時,加上掛載的 -v 這個 flag ,
就可以把 src/ 掛載到容器裡的 /var/www/html/ 資料目錄,開發上就會更加方便:

docker run -p 8080:80 -v /Users/path/to/project/src/:/var/www/html/ hello_world

這時候運行起來的機器,當 src 裡面的檔案有變更,在瀏覽器重新整理就會自動變更了。

* 參考: https://docs.docker.com/engine/reference/commandline/run/#mount-volume--v---read-only

程式碼與指令總結

最低限度的 Docker 的程式碼的部分沒有很複雜:

Dockerfile
FROM php:7.2.10-apache-stretch
COPY src/ /var/www/html/
EXPOSE 80
src/index.php
<?php
echo "hello world";

指令:

建置
docker build -t hello_world .
運行
docker run -p 8080:80 -v /Users/path/to/project/src/:/var/www/html/ hello_world

以上

如果有任何回饋或是需要修改的地方,
歡迎在下面留言告訴我~ :hibiscus:

參考