簡介
持續整合 (CI) 與持續部署 (CD) 是目前軟體開發中最熱門的主題之一。為了實現 CI/CD 方面的軟體架構,開發人員會使用容器。容器 是輕量級、虛擬化、可移植且軟體定義的環境。在容器中,軟體可以與實體主機上運行的其他軟體隔離運行。本教學的重點是使用容器平台 Docker 來部署和運行網頁應用程式。Docker 有助於簡化網頁伺服器堆疊的設定流程。在本教學中,我們將使用 LEMP 堆疊來提供 Laravel 應用程式。
LEMP 堆疊結合了 Linux 作為作業系統、Nginx 作為網頁伺服器、MySQL 作為資料庫,以及 PHP 語言用於腳本編寫和動態處理。您可以參考我們的 如何在 Ubuntu 上安裝和設定 LEMP 堆疊的教學。Laravel 是用於開發網頁應用程式的頂級 PHP 框架之一。
Docker 提供了一個名為 Docker Compose 的工具,用於定義 Docker 容器的設定流程。Docker Compose 允許開發人員在一個名為 docker-compose 的檔案中定義其應用程式的基礎架構、服務、磁碟卷、網路以及任何依賴關係。它可以使用其指令(例如 docker container create、docker container run 等)來管理多個 Docker 容器。
在本教學中,您將學習 如何在 Docker 容器中部署帶有 Nginx 和 MySQL 的 Laravel 網頁應用程式。整個堆疊的設定將在 docker-compose 檔案中定義,另外還有 PHP、MySQL 和 Nginx 的其他設定檔。讓我們開始吧!
首先
- 由於這是一個實作教學,您應該已安裝 Ubuntu 20.04 作為您的初始作業環境。您還應該擁有一個具有 sudo 權限的非 root 使用者。這裡有一個 逐步教學來協助您設定 Ubuntu 伺服器.
- 。您需要安裝 Docker。我們有一篇關於 如何在 Ubuntu 18.04 上安裝和操作 Docker.
- 的教學。您需要按照官方 Docker 文件
步驟 1:下載 Laravel 並安裝依賴項
第一步是從儲存庫中獲取 Laravel 程式碼。在實際情況中,您的 Laravel 程式碼可能存在於某個儲存庫中,例如 GitHub、Bit Bucket、Gitlab 等。然而,為了本教學的目的,我們將從 GitHub 上的官方 Laravel 儲存庫複製最新版本。該儲存庫附帶一個 composer 檔案,這是 PHP 的應用程式級依賴管理器。由於我們希望所有內容都在 Docker 容器內運行,我們將使用 Docker 的 composer 映像檔來安裝依賴項。這也將幫助我們避免在實際主機上全域安裝 composer。接下來,啟動您的終端機。
切換到您的家目錄:
|
1 |
cd ~ |
輸入以下指令將儲存庫複製到名為 laravel-web 的目錄中。您可以隨意命名。在撰寫本教學時,當我們運行此指令時,它會拉取 Laravel 版本 8。當您運行該指令時,您可能會發現一個新版本:
|
1 |
git clone https://github.com/laravel/laravel.git laravel-web |
然後,進入您剛剛複製儲存庫的目錄:
|
1 |
cd ~/laravel-web |
輸入以下指令,使用 Docker 的 composer 映像檔:
|
1 |
docker run --rm -v $(pwd):/app composer install |
docker run 指令中的 -v 和 –rm 標記會建立一個臨時容器,該容器在被刪除之前會綁定掛載到目前目錄。該指令會將 ~/laravel-web 的內容複製到容器中,並確保由 composer 建立的 vendor 資料夾被複製回目前目錄。
現在,您需要將 laravel-web 目錄的所有權變更為非 root 使用者。這將允許您在後續步驟中以非 root 使用者身分操作應用程式程式碼,並在容器內執行程序。輸入以下指令來變更所有權:
|
1 |
sudo chown -R $USER:$USER ~/laravel-web |
您的應用程式程式碼現在已就位。該目錄由非 root 使用者所有,因此您可以繼續在 docker-compose 檔案中定義應用程式服務。
步驟 2:建立 Docker Compose 檔案
Docker Compose 簡化了建置和部署應用程式的程序。一旦您定義了設定和服務,就可以輕鬆地在任何安裝了 Docker 和 Docker Compose 的主機上部署應用程式,而無需擔心應用程式的相依性。最重要的是,您只需使用一個 Docker Compose 指令即可完成此操作,正如我們將在 步驟 9.
中看到的。在此步驟中,您將定義一個 Docker Compose 檔案,其中包含部署 Laravel 應用程式所需的網頁伺服器、資料庫和應用程式服務的設定。
Docker Compose 檔案是 YAML 格式的檔案,並以 .yml 副檔名儲存。請注意,正確的縮排對於有效的 Docker Compose 檔案是必需的。輸入以下指令以使用 nano 建立並開啟檔案進行編輯:
|
1 |
nano ~/laravel-web/docker-compose.yml |
接下來,您將在此檔案中定義三個服務:app、webserver 和 db。db 區段定義了應用程式的資料庫憑證,因此請務必選擇一個強大的 mysql_root_password 並在該區段中進行替換。複製並貼上以下程式碼:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
version: '2.0' services: #PHP 服務 app: build: context: . dockerfile: Dockerfile image: cloudsigma.com/php container_name: app restart: unless-stopped tty: true environment: SERVICE_NAME: app SERVICE_TAGS: dev working_dir: /var/www/html/ networks: - app-network #Nginx 服務 webserver: image: nginx:alpine container_name: webserver restart: unless-stopped tty: true ports: - "80:80" - "443:443" networks: - app-network #MySQL 服務 db: image: mysql:5.7.32 container_name: db restart: unless-stopped tty: true ports: - "3306:3306" environment: MYSQL_DATABASE: laravel_web MYSQL_ROOT_PASSWORD: replace_mysql_root_password SERVICE_TAGS: dev SERVICE_NAME: mysql networks: - app-network #Docker 網路 networks: app-network: driver: bridge |
以下是上述程式碼中服務定義的說明:
- app:定義 Laravel 應用程式並執行自訂的 Docker 映像檔 cloudsigma.com/php,我們將在 步驟 4 中定義它。它還會將容器中的 working_dir 設定為 /var/www/html。
- webserver:它會從 Docker 拉取 nginx:alpine 映像檔並公開連接埠 80 和 443.
- db:它會從 Docker 拉取 mysql:5.7.32 映像檔 並定義一些環境變數。其中包括一個名為 laravel_web 的資料庫(用於應用程式)以及資料庫的 root 密碼。您可以將資料庫重新命名為您選擇的名稱。請記得將 MYSQL_ROOT_PASSWORD 屬性替換為強密碼。此服務還會將主機上的連接埠 3306 對應到容器上的連接埠 3306。
每個服務中的 container_name 屬性定義了該服務對應容器的名稱。如果您未定義該屬性,Docker 將為每個容器隨機選擇一個名稱。
networks 屬性定義了一個 橋接網路,名為 app-network,用於促進容器之間的通訊。橋接網路由軟體網橋控制,僅允許同一個網橋上的容器進行通訊。網橋軟體控制器會安裝驅動程式,以防止不同橋接網路上的容器直接相互通訊。這確保了高度的安全,因為只有相關的服務才能直接通訊。您可以選擇定義多個服務和網路來連接相關功能。
步驟 3:如何持久化資料
您的 Web 應用程式將為使用者處理和提供資料。在此步驟中,我們將引導您為服務定義設定資料卷(volumes)和綁定掛載(bind mounts),以持久化應用程式的資料。Docker 提供了強大的功能,例如 綁定掛載 和 資料卷,用於持久化資料和儲存應用程式設定檔。我們將在透過 Docker 設定 Laravel 應用程式時使用它們。
由於多種原因,資料卷(Volumes)是首選,包括提供備份以及在容器生命週期之外持久化資料。綁定掛載(Bind Mounts)通常指向主機上的實際目錄。當您建立資料卷時,會在 Docker 的儲存目錄中建立一個由 Docker 管理的新目錄。當您建立綁定掛載時,主機中的檔案或目錄會被掛載到容器中(透過其絕對路徑引用)。這對我們的 Web 應用程式至關重要,因為當您在主機上修改程式碼時,變更會立即在容器中生效。
使用綁定掛載時請務必小心。在 Docker 容器內執行的程序可以修改主機檔案系統,並影響主機系統上執行的非 Docker 程序。雖然 Docker 掛載是一項強大的功能,但請注意這些安全性影響。
話雖如此,讓我們來看看如何在我們的設定中使用這兩個功能。首先,我們將定義一個用於持久化 MySQL 資料庫的資料卷。在我們建立的 Docker Compose 檔案中,在 db 服務下方,新增一個 volumes 屬性,如下所示:
|
1 2 3 4 5 6 7 8 |
#MySQL 服務 db: ... volumes: - dbdata:/var/lib/mysql/ networks: - app-network ... |
如上定義,資料卷 dbdata 將持久化 /var/lib/mysql 的內容。它便於備份,並允許在不遺失資料的情況下重啟服務。接下來,您應該在 Docker Compose 檔案的末尾新增 volumes 定義,使其在各個服務之間可用。在檔案底部輸入以下程式碼片段:
|
1 2 3 4 |
#資料卷 volumes: dbdata: driver: local |
要連接到 MySQL 資料庫,您必須提供憑證。為此,請在 db 服務的 volumes 屬性下新增以下醒目顯示的程式碼片段,以定義綁定掛載:
|
1 2 3 4 5 6 7 |
#MySQL 服務 db: ... volumes: - dbdata:/var/lib/mysql/ - ./mysql/my.cnf:/etc/mysql/my.cnf ... |
該程式碼將 ~/laravel-web/mysql/my.cnf 綁定到容器中的 /etc/mysql/my.cnf。綁定的檔案是我們將在步驟 7.
容器需要使用 Nginx 伺服器來提供您的應用程式程式碼。因此,我們將在 webserver 服務下定義兩個綁定掛載(一個用於 Nginx 設定檔,另一個用於應用程式程式碼)。在 webserver 服務下新增以下用於 volumes 定義的程式碼片段:
|
1 2 3 4 5 6 7 8 |
#Nginx 服務 webserver: ... volumes: - ./:/var/www/html/ - ./nginx/conf.d/:/etc/nginx/conf.d/ networks: - app-network |
這行 – ./:/var/www/html 將 ~/laravel-web 目錄中的應用程式程式碼綁定到容器內的 /var/www/html 目錄。對於第二個綁定掛載,將在 ~/laravel-web/nginx/conf.d/ 建立 Nginx 的設定檔。它將被掛載到容器內的 /etc/nginx/conf.d/。因此,您可以根據需要更新主機上的設定檔。我們將在以下步驟中建立 Nginx 設定檔:步驟 6.
為了讓程式碼的變更自動反映在容器中,我們將應用程式程式碼綁定掛載到容器。這可以加快部署過程。因此,請將以下醒目提示的程式碼片段新增至 app 服務:
|
1 2 3 4 5 6 7 8 |
#PHP 服務 app: ... volumes: - ./:/var/www/html/ - ./php/laravel.ini:/usr/local/etc/php/conf.d/laravel.ini networks: - app-network |
第二行綁定了一個 PHP 設定檔,我們將在以下步驟中建立它:步驟 5,位於 ~/laravel-web/php/laravel.ini 檔案中,並將其掛載到容器內的 /usr/local/etc/php/conf.d/laravel.ini。
您完整的 Docker Compose 檔案現在應該如下所示:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
version: '2.0' services: #PHP 服務 app: build: context: . dockerfile: Dockerfile image: cloudsigma.com/php container_name: app restart: unless-stopped tty: true environment: SERVICE_NAME: app SERVICE_TAGS: dev working_dir: /var/www/html/ volumes: - ./:/var/www/html/ - ./php/laravel.ini:/usr/local/etc/php/conf.d/laravel.ini networks: - app-network #Nginx 服務 webserver: image: nginx:alpine container_name: webserver restart: unless-stopped tty: true ports: - "80:80" - "443:443" volumes: - ./:/var/www/html/ - ./nginx/conf.d/:/etc/nginx/conf.d/ networks: - app-network #MySQL 服務 db: image: mysql:5.7.32 container_name: db restart: unless-stopped tty: true ports: - "3306:3306" environment: MYSQL_DATABASE: laravel_web MYSQL_ROOT_PASSWORD: replace_mysql_root_password SERVICE_TAGS: dev SERVICE_NAME: mysql volumes: - dbdata:/var/lib/mysql/ - ./mysql/my.cnf:/etc/mysql/my.cnf networks: - app-network #Docker 網路 networks: app-network: driver: bridge #資料卷 volumes: dbdata: driver: local |
如果一切看起來都沒問題,請按 Ctrl + O 儲存檔案。然後,按 Ctrl + X 退出編輯器。此時,您應該能夠使用 Docker Compose 檔案為您的應用程式建置自訂 Docker 映像檔。
步驟 4:建立 Dockerfile
Dockerfile 包含 Docker 可用於建置自訂 Docker 映像檔的指令。它還可以安裝所需的軟體並為您的應用程式配置必要的設定。它們指定了將託管您應用程式程式碼的容器內環境。您可以將建立的映像檔推送到 Docker Hub 以進行分享,或將它們放置在其他私有登錄庫中。
我們將建立一個 Dockerfile,其中將指定建置 Laravel 應用程式映像檔的指令。使用 nano 在 ~/laravel-web 目錄中建立 Dockerfile:
|
1 |
nano ~/laravel-web/Dockerfile |
在打開的編輯器中,加入以下程式碼:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
FROM php:7.4-fpm # 複製 composer.lock 和 composer.json 到工作目錄 COPY composer.lock composer.json /var/www/html/ # 設定工作目錄 WORKDIR /var/www/html/ # 安裝作業系統軟體的相依套件 RUN apt-get update && apt-get install -y \ build-essential \ libpng-dev \ libjpeg62-turbo-dev \ libfreetype6-dev \ locales \ zip \ jpegoptim optipng pngquant gifsicle \ vim \ libzip-dev \ unzip \ git \ libonig-dev \ curl # 清除快取 RUN apt-get clean && rm -rf /var/lib/apt/lists/* # 安裝 php 擴充功能 RUN docker-php-ext-install pdo_mysql mbstring zip exif pcntl RUN docker-php-ext-configure gd --with-freetype --with-jpeg RUN docker-php-ext-install gd # 安裝 composer (php 套件管理器) RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer # 複製現有的應用程式目錄內容到工作目錄 COPY . /var/www/html # 將工作目錄的權限分配給 www-data 使用者 RUN chown -R www-data:www-data \ /var/www/html/storage \ /var/www/html/bootstrap/cache # 預留連接埠 9000 並啟動 php-fpm 伺服器 (用於 FastCGI 行程管理器) EXPOSE 9000 CMD ["php-fpm"] |
Dockerfile 首先會建立一個基於 php:7.4-fpm Docker 映像檔的映像檔。這是一個基於 Debian 的映像檔,並已安裝 PHP FastCGI 實作 (PHP-FPM )。為了讓 Laravel 正常運作,它需要其他可用的 php 擴充功能,例如 mcrypt、pdo_mysql、mbstring 和 imagick,此指令碼會安裝這些擴充功能。接著它會安裝 composer php 套件管理器。容器將使用它來安裝 Laravel 的 php 相依套件。
您可以使用 RUN 指令在容器內定義安裝、更新和設定等命令。它還會分配使用者權限。WORKDIR 指令指定了工作目錄,在此案例中為 /var/www/html。此指令碼會執行 CHOWN 命令,將 /var/www/html 目錄的權限分配給 www-data 使用者。
在最終建置映像檔之前,必須預留一個連接埠,以允許存取容器內執行的應用程式。EXPOSE 命令為 php-fpm 伺服器預留連接埠 9000。最後要執行的命令是 CMD 指令。它會執行 php-fpm 來啟動伺服器。
您現在可以按下 Ctrl + O 來儲存檔案。然後,按下 Ctrl + X 離開編輯器。
步驟 5:設定 PHP
在此步驟中,我們將設定 php 服務以處理來自 Nginx 的傳入請求。您將在 php 目錄中建立一個 laravel.ini 檔案。此檔案將保存 PHP 設定。這是您在容器中綁定掛載到 /usr/local/etc/php/conf.d/laravel.ini 的檔案,位於 步驟 3。此檔案中的設定會覆寫 PHP 啟動時通常讀取的預設 php.ini 檔案。輸入以下命令以建立 php 目錄:
|
1 |
mkdir ~/laravel-web/php |
輸入以下命令,在 php 目錄中建立並開啟 laravel.ini 檔案:
|
1 |
nano ~/laravel-web/php/laravel.ini |
預設的 php.ini 檔案的上傳限制設定為 2M。例如,我們將向您展示如何透過變更允許的上傳限制值來調整和設定 php 設定,以防您想要上傳較大的檔案。在檔案中輸入以下幾行程式碼:
|
1 2 |
upload_max_filesize=80M post_max_size=80M |
這會設定上傳限制,您可以上傳總大小不超過 80MB 的檔案。您可以在 laravel.ini 檔案中新增其他 php 設定,以覆寫預設的 php 設定。現在,儲存並關閉檔案。
步驟 6:設定 Nginx
在此步驟中,我們將設定 Nginx 以使用我們之前定義的 php 服務。它將使用 PHP-FPM 作為 FastCGI 伺服器 來提供動態內容。FastCGI 伺服器是一種允許互動式程式與網頁伺服器進行介面連接的軟體。
正如我們在 步驟 3 中的 docker-compose 檔案中所定義的,我們將在 ~/laravel-web/nginx/conf.d/ 目錄中建立 Nginx 設定檔 app.conf。首先,輸入以下命令以建立目錄:
|
1 |
mkdir -p ~/laravel-web/nginx/conf.d |
接下來,輸入以下命令,使用 nano 建立並開啟 app.conf 檔案:
|
1 |
nano ~/laravel-web/nginx/conf.d/app.conf |
將以下 Nginx 設定程式碼新增至檔案中:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
server { listen 80; index index.php index.html; error_log /var/log/nginx/error.log; access_log /var/log/nginx/access.log; root /var/www/html/public; location ~ \.php$ { try_files $uri =404; fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass app:9000; fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; } location / { try_files $uri $uri/ /index.php?$query_string; gzip_static on; } } |
Nginx 會讀取稱為伺服器區塊(server blocks)的設定檔,以便根據 URL 了解應該向網站訪客提供哪個目錄。要了解更多資訊,請閱讀我們關於在 教程中設定伺服器區塊的內容:在 Ubuntu 上安裝 Nginx 18.04。定義的指令具有以下用途:
- listen – 定義伺服器將接聽傳入請求的連接埠,通常是連接埠 80。
- error_log & access_log – 定義寫入應用程式記錄的檔案。
- root – 定義網頁根目錄路徑,即為來自網際網路的任何伺服器請求提供服務的目錄。
在 php 的 location 區塊中,fastcgi_pass 指令指定 app 服務正在連接埠 9000 的 TCP 通訊端(socket)上進行接聽(這是在 Dockerfile 中定義的)。這會指示 PHP-FPM 伺服器透過網路進行接聽,而不是在 Unix 通訊端上。雖然 Unix 通訊端在速度上可能比 TCP 通訊端略有優勢,但它缺乏網路協定,因此會跳過網路堆疊。
對於主機位於同一台機器上的場景,Unix socket 會更合適。然而,如果您的服務運行在不同的主機上,TCP socket 的優勢在於可以連接分佈式的服務。在我們的案例中,應用程式容器與我們的網頁伺服器容器運行在不同的主機上。因此,TCP socket 最適合我們的配置。
您現在可以按 Ctrl + O 儲存檔案,然後按 Ctrl + X 離開編輯器。由於您在 Docker Compose 檔案中新增了綁定掛載(bind mount),在 nginx/conf.d/ 目錄中所做的變更將會自動反映在網頁伺服器容器中,這是在步驟 3.
步驟 7:配置 MySQL
在我們配置好 Nginx 與 PHP 協同工作之後,我們現在可以配置 MySQL 來儲存並向 PHP 提供動態數據。我們之前已經設定了 Docker Compose 檔案來安裝 PHP 和 MySQL 通訊所需的擴充功能。我們將在 mysql 資料夾中建立 MySQL 配置檔案 my.cnf,它將被綁定掛載到 /etc/mysql/my.cnf,正如我們在 Docker Compose 的 db 服務部分中所定義的,這是在步驟 3.
您可以隨時對 my.cnf 檔案進行 MySQL 配置設定和變更。它們應該會立即反映在容器內部。首先,輸入以下指令來建立目錄:
|
1 |
mkdir ~/laravel-web/mysql |
接下來,輸入以下指令來建立並開啟 nano:
|
1 |
nano ~/laravel-web/mysql/my.cnf |
輸入以下程式碼片段以啟用查詢記錄(query log)並指定查詢記錄檔的位置:
|
1 2 3 |
[mysqld] general_log = 1 general_log_file = /var/lib/mysql/general.log |
藉由將 general_log 屬性定義為 1,您允許了一般記錄。general_log_file 屬性指定了記錄檔的位置。按 Ctrl + O 儲存檔案,然後按 Ctrl + X 離開編輯器。
步驟 8:設定 Laravel 環境變數
至此,所有服務和配置設定都已完成。因此,我們應該可以部署我們的容器了。然而,在我們的網頁應用程式實際可用之前,還有一個必須完成的重要步驟——環境變數。Laravel 框架需要一個名為 .env 的檔案來定義其環境。預設情況下,Laravel 附帶了 .env.example,您可以將其複製為 .env,然後使用您的實際詳細資訊修改變數。輸入以下指令來複製檔案:
|
1 |
cp .env.example .env |
複製完成後,使用 nano 開啟檔案進行修改:
|
1 |
nano .env |
以下是該檔案可能外觀的螢幕截圖:

在檔案中,下一步是修改 DB_CONNECTION 區塊下的變數,正如您在目前為止所做的先前配置中所設定的那樣。更新如下:
- DB_HOST 是 db 資料庫容器。
- DB_DATABASE 是 laravel_web.
- DB_USERNAME 是資料庫的使用者名稱。選擇一個您喜歡的名字,但為了本教學起見,我們使用 laraveldocker.
- DB_PASSWORD 是您上述使用者用來登入資料庫的強密碼,因此請選擇一個強密碼。在 步驟 10 中,我們將使用您在此處選擇的密碼建立此使用者。
更新數值後,您的 DB_CONNECTION 現在應該看起來像這樣:

儲存並關閉檔案。
步驟 9:執行 Docker 容器
在此階段,您的所有服務和配置都已在 Docker Compose 檔案中定義。只需要一個指令即可啟動所有容器、建立磁碟卷、連接網路,以及設定和建置您的應用程式。在您的終端機中輸入以下指令:
|
1 |
docker-compose up -d |
當您首次執行 docker-compose up 命令時,它會下載所有必要的 Docker 映像檔。如果您是在本機電腦上設定基礎架構,可能需要一些時間才能完成。下載映像檔後,Compose 就會建立容器。-d 旗標會指示 Docker 在背景執行容器。如果程序成功完成,您應該會在終端機中看到類似這樣的內容:

在終端機中輸入以下命令以列出所有執行中的容器:
|
1 |
docker ps |
它應該會顯示類似下方螢幕截圖的內容,其中包含有關 app、webserver 和 db 容器的詳細資訊:

- CONTAINER ID – 每個容器的唯一識別碼。
- NAMES – 與每個容器關聯的服務名稱,如 Docker Compose 檔案中所定義。(您可以使用容器 ID 或名稱來存取容器)。
- IMAGE – 每個容器的映像檔名稱。
- STATUS – 顯示有關容器狀態的資訊(可能是已停止、執行中或正在重新啟動)。
- PORTS – 顯示容器對外開放的連接埠。
Docker Compose 提供了一個名為 exec 的命令,您可以使用它在容器內執行終端機命令或存取命令列。我們首先想在 app 容器(即執行 Laravel 應用程式的容器)內執行一些命令。
Docker 提供了一個存取容器命令列的命令。其語法如下:docker-compose exec container_name bash。要存取 app 容器的命令列,請輸入以下命令:
|
1 |
docker-compose exec app bash |
進入容器的命令列後,您可以執行一些 Laravel Artisan 設定命令。輸入以下命令以產生 laravel 金鑰並將其儲存到 .env 檔案中:
|
1 |
php artisan key:generate |
設定好環境金鑰後,您可以執行以下命令來快取設定資訊:
|
1 |
php artisan config:cache |
設定儲存在容器內的 /var/www/html/bootstrap/cache/config.php 檔案中。您可以按 Ctrl + D 退出容器終端機。
要確認 Laravel 應用程式已部署並正在執行,請在瀏覽器中造訪您伺服器’的公用 IP(http://your_server_public_ip)。您應該會看到全新安裝 Laravel 的歡迎頁面:

步驟 10:設定 MySQL 使用者
在此步驟中,我們將為我們在 docker-compose 檔案中指定的 MySQL 資料庫 laravel_web 建立一個資料庫使用者。當您在步驟 9中執行容器建置命令時,MySQL 已安裝,但僅建立了一個預設的 root 管理帳戶,該帳戶恰好對資料庫擁有無限權限。為了避免使用 root 使用者,我們將建立一個專用使用者 laraveldocker 供應用程式使用。這就是您在步驟 8的環境變數中指定的使用者。在終端機中輸入以下命令以存取命令列:
|
1 |
docker-compose exec db bash |
進入容器後,輸入以下命令登入 MySQL:
|
1 |
mysql -u root -p |
在密碼提示中,輸入您在步驟 2.
的 docker-compose 檔案中為 db 服務設定的密碼。登入 MySQL 提示字元後,輸入以下 SQL 命令以檢查是否可以看到您在 docker-compose 檔案中指定的資料庫:
|
1 |
show databases; |
您應該會看到 laravel_web 資料庫,或您為設定指定的任何名稱:

接下來,我們為 laravel_web 資料庫建立使用者和密碼。這必須與您在步驟 8的 .env 檔案中指定的詳細資訊相同。輸入以下命令以建立使用者和密碼,並授予此使用者所有權限:
|
1 |
GRANT ALL ON laravel_web.* TO 'laraveldocker'@'%' IDENTIFIED BY 'your_strong_laravel_docker_password'; |
若要使變更立即生效,請輸入以下命令以清除權限:
|
1 |
FLUSH PRIVILEGES; |
這樣就完成了 MySQL 使用者設定。輸入 exit 並按下 enter 鍵以退出 MySQL 提示字元。最後,按下 Ctrl + D 退出 db 容器。
步驟 11:測試 Laravel 應用程式程式碼與 MySQL 資料庫之間的通訊
到這一步為止,一切運作正常。然而,我們想要確認 app 容器中的 Laravel 程式碼是否能與 db 容器中的 MySQL 資料庫進行通訊。首先,輸入以下命令進入 app 容器終端機:
|
1 |
docker-compose exec app bash |
接下來是執行 Laravel 遷移 命令來建立資料表:
|
1 |
php artisan migrate |
當 Laravel 建立預設資料表時,您應該會在終端機中看到遷移過程:

接下來,我們將測試是否可以從 Laravel 存取資料庫。Laravel 預設隨附 Tinker ,這允許您從命令列與整個應用程式進行互動,包括存取資料庫、執行任務、Eloquent ORM 等。我們可以使用 Tinker 來查看 migrations 資料表中的資料。輸入以下命令以進入 Tinker:
|
1 |
php artisan tinker |
進入 Tinker 提示字元後,您可以輸入以下內容來列出由 migrate 命令建立的資料表:
|
1 |
\DB::select('show tables'); |
下方的螢幕截圖顯示了輸出結果,即目前在 laravel_web 資料庫中的資料表:

您可以透過指定資料表名稱來檢索資料表中的資料。例如,您可以輸入以下命令來檢索 migrations 資料表中的資料:
|
1 |
\DB::table('migrations')->get(); |
該命令輸出以下內容:

從上述輸出可以看出,您的 Laravel 應用程式已配置妥當,並且可以與資料庫進行通訊。您可以嘗試更多命令,例如建立模型、執行任務等。您可以按下 Ctrl + D 退出 Tinker 提示字元。
結論
在本教學中,您在 Docker 容器中部署了一個 LEMP 架構的 Laravel 應用程式。您透過存取網頁介面以及透過 Laravel Tinker 連接到資料庫來測試了該應用程式。您體驗到了 Docker Compose 的強大功能。它允許您在單一檔案中定義一組 Docker 容器,然後只需一個命令即可執行。
如果您想進一步熟悉容器,請參閱我們的 說明如何清理 Docker 資源(映像檔、容器和磁碟卷)的教學 以及我們的 Kubernetes 工具詳細概述.
您也可以造訪我們的部落格,了解更多關於 Docker 以及持續整合與持續部署.
祝您開發愉快!
留言
目前尚無留言。成為第一個留言的人吧。