# Docker for PHP Apache Mysql 運用docker 建立xampp之方式。 ## Docker 基本架構介紹 - 1.docker(我的資料夾結構) ```bash= your_project_folder/ ├── docker-compose.yml #必須詳細設定檔。 ├── Dockerfile #必須主幹與基礎設定。 ├── www/ #file web index放置檔案。 │ └── index.php └── config/ #file config 設定檔放置處。 └── php.ini └── inital.sql #(可選,若你需要初始化 MySQL 資料) ``` 我想要可以同步index.php,與php.ini,與資料庫本地化,所以有多健一個inital.sql。 ### dockerfile跟docker-compose.yml之差別 - 1.dockerfile: Dockerfile 主要是構建容器映像的骨幹。它用來定義要使用哪些基礎映像(例如 PHP 的版本)、安裝哪些擴展或套件、以及如何將本地的資料複製到 Docker 容器中。它確保了映像的統一性和可重複性,從而讓你在不同環境下保持一致的應用程式運行環境。 - 2.docker-compose.yml: docker-compose.yml 是用來管理和編排多個容器的工具。它基於 Dockerfile 定義的映像,對容器的啟動進行更詳細的配置,如加入 Web 伺服器、MySQL 資料庫、phpMyAdmin 等等。它定義了每個服務如何協同運作,並配置像端口映射、網路設置、資料卷掛載等功能。下面會通過範例來進一步解釋如何使用。 ### dockerfile #### 範例 ```dockerfile= #宣告主幹,是什麼這裡是指用php8.0-apche作為image基礎,用來搭建開發環境。 FROM php:8.0-apache #複製php.ini到容器內的指定位置,這樣可以使用自訂義的php配置。 COPY config/php.ini /usr/local/etc/php/ #複製初始SQL資料到容器的玉設初始化資料,當MYSQL容器啟動時會自動執行此SQL腳本。 COPY config/initial.sql /docker-entrypoint-initdb.d/ #複製本地的網站檔案到容器內的WEB根目錄(apache伺服器的 COPY www /var/www/html #RUN指的是安裝以下檔案,這裡是指安裝mysqli到image中。 RUN docker-php-ext-install mysqli && docker-php-ext-enable mysqli #安裝其他需要的PHP擴展 RUN docker-php-ext-install pdo_mysql ``` - 1.FROM: 後面是IMAGE的基底架構只用哪種開發語言作為底層。 - 2.COPY: 語法解釋:COPY {要複製本的的檔案為至}_{要複製到容器內檔案位置。} - 3.RUN: 安裝其他拓展功能。 常用拓展: ```dockerfile! RUN docker-php-ext-install mysqli && docker-php-ext-enable mysqli ``` 資料庫語言拓展,讓PHP可以與資料庫互動,可以用語法MYSQLI ```dockerfile! RUN docker-php-ext-install pdo_mysql ``` 資料庫拓展功能,讓php語法可以使用PDO語句與資料庫進行溝通。 ### docker-compose.yml #### 範例 ```yaml= version: '3.8' services: web: build: context: . container_name: xampp-web ports: - "8080:80" volumes: - ./www:/var/www/html - ./config/php.ini:/usr/local/etc/php/php.ini networks: - xampp-network mysql: image: mysql:5.7 container_name: xampp-mysql environment: MYSQL_ROOT_PASSWORD: rootpassword MYSQL_DATABASE: my_database MYSQL_USER: user MYSQL_PASSWORD: userpassword volumes: - mysqldata:/var/lib/mysql - ./config/init.sql:/docker-entrypoint-initdb.d/init.sql networks: - xampp-network phpmyadmin: image: phpmyadmin/phpmyadmin container_name: phpmyadmin environment: PMA_HOST: mysql PMA_USER: root PMA_PASSWORD: rootpassword ports: - "8081:80" networks: - xampp-network volumes: mysqldata: networks: xampp-network: driver: bridge ``` 我們一點點拆開來看。 ##### version ```yaml= version: "3.8" ``` - version: '3.8': 這行指定了 Docker Compose 使用的語法版本。3.8 是一個穩定版本,支援多種功能。 ```yaml= services: ``` - services:: 這行定義了要啟動的服務。每個服務都是一個容器或一組容器。這裡有三個服務:web、mysql 和 phpmyadmin。 PS:這裡請注意需服務web、mysql、phpmyadmin,需要在services下面進行縮排,代表功能掛載在services下面。才能正常執行。 ##### web服務 ```yaml= web: build: context: . container_name: xampp-web ports: - "8080:80" volumes: - ./www:/var/www/html - ./config/php.ini:/usr/local/etc/php/php.ini networks: - xampp-network ``` - ```web:```:這裡宣告以下為一個web服務,他將運行Apache和PHP。 - ```build:```:這個服務基於dockerfile來構建一個自訂一的Docker映像。 - ```context:.```:```.```表示```Dockerfile```的工作目錄是當前目錄,也就是```docker-compose.yml```所在目錄。 - ```container_name:xpmpp-web```:指這格容器名稱為**xampp-web**,以方便知道容器名稱管理容器。 - ```ports:```:這指端口號碼。 - ```"8080:80"```:網路概念,將本機8080port(你的電腦),對應到容器內的80port(HTTP預設端口),這樣可以在本機透過```http://localhost:8080```放問容器內的網站。 - ```volumes```:這行定義了卷(volumes),用於將你的電腦與容器內的檔案同步。 - ```/www:/var/www/html```:本地電腦```./www```指在本機本資料夾內的www資料夾,同步到容器內```/var/www/html```資料夾(這段是指容器內網頁預設位置,也就是容器內Apache的預設web目錄),任何放在```./www```資料夾中的檔案都會被網頁伺服器展示。 - ```./config/php.ini:/usr/loacl/etc/php/php.ini```:本地檔案```./config/php.ini```會掛載(我自己認為是同步),到容器內的PHP設定檔案位置,你就可以自行定義PHP設定。 - ```networks```:這行指定了容器所在的網路(有點類似網路概念中,同一個valn的概念。) - ```xampp-network```:將容器加入一個名為```xampp-network```的網路,這樣可以將同一個名稱的容器進行互通。 ##### mysql服務 ```yaml= mysql: image: mysql:5.7 container_name: xampp-mysql ports: - "3306:3306" environment: MYSQL_ROOT_PASSWORD: 000000 MYSQL_DATABASE: my_database MYSQL_USER: user MYSQL_PASSWORD: 123456 volumes: - mysqldata:/var/lib/mysql - ./config/init.sql:/docker-entrypoint-initdb.d/init.sql networks: - xampp-network ``` - ```mysql:```:定義服務這邊定義的是```mysql```的服務,它運行Mysql資料庫伺服器。 - ```image: mysql:5.7```:這邊指直接使用官方的印象黨,MySQL 5.7映像檔,作為基礎映象來啟動Mysql。(我的理解是下載官方image來進行安裝。) - ```container_name: xampp-mysql```:設置容器名稱為```xampp-mysql```,便於管理和辨識,在docker Desktop裡面將會顯示這名子。 - ```ports:```:定義端口映射。 - ```"3306:3306"```定義本機上的3306port,對應容器內的3306port。這樣就可以透過```http://localhost:3306```來訪問MySql服務。 - ```environment:```:設定MySql的環境變數,讓自己設定把MySql設定好。 - ```MYSQL_ROOT_PASSWORD: 000000```:設定MySql的root(最高權限管理員帳號。),密碼為```000000```。 - ```MYSQL_DATABASE:my_database``` :初始化時自動創建一個名為```my_database```的資料庫。 - ```MYSQL_USER: user```:設置一個新的MySql使用者```user```。 - ```MYSQL_PASSWORD: 123456```:為該使用者設定密碼為```123456```。 - ```volumes:```:定義卷來保存資料和初始化資料庫。 - ```mysqldata:/var/lib/mysql```:容器內的```/var/lib/mysql```是MySQL存儲數據的路徑,我們作了一個名為```mysqldata```的卷來作資料儲存,這樣即使容器重啟,資料仍有保留。(但這個部分,是保留在本地的不知名處,如果要備份仍要用,phpmyadmin,進行匯出,而無法在每次資料庫更新後自動備份。) - ```./config/inital.sql:/docker-entrypoint-initdb.d/init.sql```:把本地的```inital.sql```檔案掛載到容器中的(新建容器時才會執行。)```/docker-entrypoint-initdb.d/```資料夾,MySQL容器啟動時會自動執行SQL檔案來初始化資料庫。 - ```nerworks:```:將容器加入```xampp-network```群組,這樣可以和其他同組容器互通。 ##### phpmyadmin服務 ```yaml= phpmyadmin: image: phpmyadmin/phpmyadmin container_name: xampp-phpmyadmin ports: - "8081:80" environment: PMA_HOST: mysql PMA_USER: root PMA_PASSWORD: 000000 networks: - xampp-network ``` - ```phpmyadmin```:定義一個名為```phpmyadmin```的服務,用來運行phpmyadmin,這是一個MySQL圖形化管理工去。 - ```image: phpmyadmin/phpmyadmin```:下載docker hub裡面的image來啟動phpmyadmin服務。 - ```container_name:xampp-phpmyadmin```:設定容器名稱為```xampp-phpmyadmin```。(這裡是指容器名稱。) - ```ports:```:定義端口映射(這裡是指容器跟主機連接的ports)。 -```"8081:80"```:把我們本機上的8081 ports對應到容器內的80 ports,這樣可以通過```http://localhost:8081```訪問到容器內的phpMyAdmin網頁。 - ```environment:```:設置phpMyAdmin的環境變數來配置連接到MySQL的方式。 - ```PMA_HOST:mysql```:指定phpMyAdmin連接的MySQL伺服器是名為```mysql```的容器。 - ```PMA_USER:root```:指定phpMyAdmin使 ---- 這邊還沒完成 ---- ##### 啟動指令 ```dockerfile= docker-compose up -d # 設定好時的啟動指令。 docker-compose down # 關閉系統。 docker-compose up --build -d # 更新內容指令。 ```