Docker-compose實戰之搭建LAMP環境


Docker-compose的安裝

  • 一開始利用命令pip install docker-compose安裝docker-compose會發現在之后的build中一直出錯
  • 只能先從github上下載完后移到虛擬機中/usr/local/bin的位置,然后利用docker-compose --version查詢當前版本號,返回版本號說明安裝成功

Dockerfile編寫搭建LAMP(Linux+Apache+MySQL+PHP)環境

  • 以下所有文件放置於/home/ubuntu/docker-compose-lamp目錄下

MySql_dockerfile

FROM mysql:5.7

#作者信息
MAINTAINER by Ra9zer

#設置不允許免密登錄
ENV MYSQL_ALLOW_EMPTY_PASSWORD no



Apach_dockerfile

FROM httpd

# 作者信息
MAINTAINER Ra9zer

# 最后暴露2422端口
EXPOSE 2422
# Dockerfile中開頭為#號的為注釋,至此Dockerfile編寫完成

php_dockerfile

FROM php:7.4-fpm

# 作者信息
MAINTAINER Ra9zer

RUN apt-get update && apt-get install -y \
        libfreetype6-dev \
        libjpeg62-turbo-dev \
        libpng-dev \
    && docker-php-ext-install pdo_mysql \
    && docker-php-ext-configure gd --with-freetype --with-jpeg \
    && docker-php-ext-install -j$(nproc) gd 

phpmyadmin_dockerfile

FROM phpmyadmin/phpmyadmin

# 作者信息
MAINTAINER Ra9zer

EXPOSE 8080

使用Compose實現多容器運行機制

Docker-compose配置文件docker-compose.yml編寫

version: '3.7'

services:

  #構建mysql服務
  mysql:
    image: mysql #鏡像名
    container_name: LAMP_mysql #容器名
    build: 
      context: .
      dockerfile: MySql_dockerfile
    ports:
      - "3306:3306"  

  #構建php服務
  web:
    image: php
    container_name: LAMP_php
    build:
      context: .
      dockerfile: php_dockerfile
    depends_on:   #設置依賴的服務
      - mysql
    volumes:
      - ./web/:/home/ubuntu/docker-compose-lamp/web/ #將主機中的目錄掛載到容器中的工作目錄
    ports:
      - "8080:80" #映射端口,格式為 "主機端口:容器端口"

  #構建phpmyadmin服務
  phpmyadmin:
    image: phpmyadmin
    container_name: LAMP_phpmyadmin
    build:
      context: .
      dockerfile: phpmyadmin_dockerfile
    environment:
      PMA_HOST: LAMP_mysql #設置所連接的MySQL服務器名稱
    depends_on:
      - mysql
      - web
    ports:
      - "8081:80"

Index.php文件

  • 該文件放置於/home/ubuntu/docker-compose-lamp/web/目錄下
<html>
    <head>
        <title>phpinfo</title>
    </head>

    <body>
        <?php
            echo phpinfo(); #顯示php信息
        ?>
    </body>
</html>

通過Compose運行多容器

  • 所有配置文件編寫完后因在同一目錄中

  • 在文件目錄/home/ubuntu/docker-compose-lamp/下使用命令sudo docker-compose up --build運行多容器成功

  • sudo docker ps查看當前運行中容器,可以看到多容器都已同時上線

  • 訪問http://0.0.0.0:8080/可以查看PHP信息來驗證容器是否正確運行達到目標效果

    在這里有個坑:就是一開始我的docker-compose.yml里的web的文件目錄配置錯誤./web/:/home/ubuntu/docker-compose-lamp/web/導致訪問8080端口的時候會出現404的情況,后面百度查詢了一下正確的掛載目錄應該是./www/:/var/www/html/

通過PHP訪問MySql

  • 修改index.php文件內容
<html>
    <head>
        <title>phpinfo</title>
    </head>

    <body>
        <?php
$servername = "LAMP_mysql";    #數據庫服務器名稱為MySQL容器的名稱
$username = "root";
$password = "123456";     

try {
    $conn = new PDO("mysql:host=$servername", $username, $password);
    echo "數據庫連接成功";
}
catch(PDOException $e)
{
    echo $e->getMessage();
}
?>
    </body>
</html>

  • 又一個坑:一定要在MySql_dockerfile或者docker-compose.yml中聲明ENV MYSQL_ROOT_PASSWORD 123456 #設置root下mysql登錄密碼 不然修改PHP文件也一輩子連不上數據庫 (太難了。。。

通過PHP新建數據庫

  • 修改index.php文件內容
<html>
    <head>
        <title>phpinfo</title>
    </head>

    <body>
        <?php
$servername = "LAMP_mysql";    #數據庫服務器名稱為MySQL容器的名稱
$username = "root";
$password = "123456";     

try {
    $conn = new PDO("mysql:host=$servername", $username, $password);

    // 設置 PDO 錯誤模式為異常
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $sql = "CREATE DATABASE myDBPDO";

    // 使用 exec() ,因為沒有結果返回
    $conn->exec($sql);

    echo "數據庫創建成功<br>";
}
catch(PDOException $e)
{
    echo $sql . "<br>" . $e->getMessage();
}

$conn = null;
?>
    </body>
</html>

通過PHP新建數據表

  • 修改index.php文件內容
<html>
    <head>
        <title>phpinfo</title>
    </head>

    <body>
        <?php
$servername = "LAMP_mysql";    #數據庫服務器名稱為MySQL容器的名稱
$username = "root";
$password = "123456";     

$dbname = "myDBPDO";
 
try {
    $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
    // 設置 PDO 錯誤模式,用於拋出異常
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
 
    // 使用 sql 創建數據表
    $sql = "CREATE TABLE test (
    `id` bigint(20) NOT NULL,
    `name` varchar(255),
    `score` int
    )";
 
    // 使用 exec() ,沒有結果返回 
    $conn->exec($sql);
    echo "數據表 test 創建成功";
}
catch(PDOException $e)
{
    echo $sql . "<br>" . $e->getMessage();
}
 
$conn = null;
?>
    </body>
</html>

通過PHP對表記錄的插入修改和刪除

  • 修改index.php文件內容
<html>
    <head>
        <title>phpinfo</title>
    </head>

    <body>
        <?php
$servername = "LAMP_mysql";    #數據庫服務器名稱為MySQL容器的名稱
$username = "root";
$password = "123456";     

$dbname = "myDBPDO";
 
try {
    $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
    // 設置 PDO 錯誤模式,用於拋出異常
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $sql = "INSERT INTO test (`id`, `name`, `score`)
VALUES
  (2422,'Ra9zer','100');";
    // 使用 exec() ,沒有結果返回 
    $conn->exec($sql);
    echo "新記錄插入成功";
}
catch(PDOException $e)
{
    echo $sql . "<br>" . $e->getMessage();
}
 
$conn = null;
?>
    </body>
</html>

選做

增加一個phpmyadmin容器,實現web端的數據庫管理

  • phpmyadmin容器配置文件在前文已經給出,同時在docker-compose.yml中已完整配置服務。
  • 直接訪問0.0.0.0:8081就可以登入

小結

  • 實驗3花費的時間大概在20個小時左右吧,相對前兩個實驗的皮毛操作。感覺實驗3才算的上真正的入門。一開始看感覺還是挺懵的,不敢下手,到處百度百度的。感覺要編寫的文件一大堆,然后compose.yml配置文件內容又很多的樣子。到后面摸索摸索着漸漸就感覺其實也並不難,到最后也能都理解清楚。但是這應該才是鍛煉(折磨)的開始趴


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM