系統綜合實踐第三次實踐

一、先安裝docker-compose,安裝後驗證

 

 二、編寫框架環境中的Dockerfile

編寫依照上節課的內容,但因爲此次目的在於實現框架的鏈接搭建,因此並不用在用在Dockerfile上寫太多特製。

FROM mysql

#MAINTAINER IFORMATION
MAINTAINER jayer@xiajibaxie.com
FROM nginx

#MAINTAINER IFORMATION
MAINTAINER jayer@xiajibaxie.com
FROM php:7.4-fpm

#MAINTAINER IFORMATION
MAINTAINER jayer@xiajibaxie.com

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

 

文件目錄

不明白爲什麼掛載mysql下的data的時候多出那麼多文件

 

配置文件

index.php——執行PHP腳本指令的文件

index.html——網頁文件

default.conf——nginx下的配置文件,須要進行配置來鏈接nginx和php。

server {
    listen       80;
    server_name  localhost;

    #charset koi8-r;
    #access_log  /var/log/nginx/host.access.log  main;

    location / {
        root   /usr/nginx-2/html;
        index  index.html  index.htm  index.php;
    }

    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    # proxy the PHP scripts to Apache listening on 127.0.0.1:80
    #
    #location ~ \.php$ {
    #    proxy_pass   http://127.0.0.1;
    #}

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
     location ~ \.php$ {
         root           /usr/nginx-2/php; #php容器下的工做路徑
         fastcgi_pass   lnmp_php-container:9000; #container name
         fastcgi_index  index.php; 
         fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name; 
         include        fastcgi_params;
     }

    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    #location ~ /\.ht {
    #    deny  all;
    #}
}

  其中重點在於加入location ~ \.php${}的匹配信息(大體瞭解就是nginx在匹配路徑文件時,若是後綴是php文件,即向容器端口去發送請求,從而獲得運行php容器中相應路徑下的index.php文件)php

  同時瞭解PHP的也應該知道,該腳本語言與HTML是兼容的。html

  前面3個root、fastcgi_pass、fastcgi_index容易理解,後面兩個就不明白爲啥了(直接寫上就完事)mysql

 

三、使用docker-compose.yml——能夠建立相互依賴的鏡像容器,從而搭建成可互通的框架。

version: "3"
services:
 nginx:
   image: lnmp_nginx
   container_name: lnmp_nginx-container
   build: ./nginx
   ports:
     - "80:80"
   links:
     - "php"
   volumes:
     - ./nginx/html/:/usr/nginx-2/html/
     - ./nginx/default.conf:/etc/nginx/conf.d/default.conf
 php:
   image: lnmp_php
   container_name: lnmp_php-container
   build: ./php
   ports:
     - "9000:9000"
   volumes:
     - ./php/phpfile/:/usr/nginx-2/php/
   links:
     - "mysql"
   stdin_open: true
   tty: true
 mysql:
   image: lnmp_mysql
   container_name: lnmp_mysql-container
   build: ./mysql
   ports:
     - "3306:3306"
   volumes:
     - ./mysql/data/:/var/lib/mysql/
   environment:
     MYSQL_ROOT_PASSWORD : 123

  這裏用到的幾個基本的就是,image和container_name定義鏡像名與容器名,build相對路徑下尋找Dockerfile定製鏡像,ports端口映射。nginx

  volumes掛載數據卷或環境(稍微瞭解一下就是將主機的某個文件或路徑補充到容器下的文件路徑以後,所體現就是造成同一文件環境,主機內修改文件信息可永久性反饋到容器內)web

  ...sql

 

構建成功docker

 

四、服務測試

—nginx與php

<?php phpinfo();?>

    說明端口訪問PHP環境成功shell

 

  

——數據庫鏈接、建庫、建表、輸入、刪除

搭建完以後PHP沒有mysqli,有pdo但不支持mysql,因而就去安裝一下唄數據庫

 

寫index.php執行php文件,這裏直接套用菜鳥教程上的代碼框架

<?php
$servername = "lnmp_mysql-container";
$username = "root";
$password = "123";
 
// 建立鏈接
$conn = new mysqli($servername, $username, $password);
 
// 檢測鏈接
if ($conn->connect_error) {
    die("鏈接失敗: " . $conn->connect_error);
} 
echo "鏈接成功";

// 建立數據庫
$sql = "CREATE DATABASE myDB";
if ($conn->query($sql) === TRUE) {
    echo "數據庫建立成功";
} else {
    echo "Error creating database: " . $conn->error;
}

// 使用 sql 建立數據表
$sql = "CREATE TABLE MyGuests (
id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY, 
firstname VARCHAR(30) NOT NULL,
lastname VARCHAR(30) NOT NULL,
email VARCHAR(50),
reg_date TIMESTAMP
)";
 
if ($conn->query($sql) === TRUE) {
    echo "Table MyGuests created successfully";
} else {
    echo "建立數據表錯誤: " . $conn->error;
}

//插入數據
$sql = "INSERT INTO MyGuests (firstname, lastname, email)
VALUES ('John', 'Doe', 'john@example.com')";
 
if ($conn->query($sql) === TRUE) {
    echo "新記錄插入成功";
} else {
    echo "Error: " . $sql . "<br>" . $conn->error;
}
?>

 

結果:                                                         忘記還有dbname變量來選中數據庫,略微尷尬。

 

改:

<?php
$servername = "lnmp_mysql-container";
$username = "root";
$password = "123";
$dbname = "myDB";
// 建立連接
$conn = new mysqli($servername, $username, $password, $dbname);
// 檢查連接
if ($conn->connect_error) {
    die("鏈接失敗: " . $conn->connect_error);
}

// 使用 sql 建立數據表
$sql = "CREATE TABLE MyGuests (
id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY, 
firstname VARCHAR(30) NOT NULL,
lastname VARCHAR(30) NOT NULL,
email VARCHAR(50),
reg_date TIMESTAMP
)";
 
if ($conn->query($sql) === TRUE) {
    echo "Table MyGuests created successfully\n";
} else {
    echo "建立數據表錯誤: " . $conn->error;
}
//插入數據
$sql = "INSERT INTO MyGuests (firstname, lastname, email)
VALUES ('John', 'Doe', 'john@example.com');";
$sql .= "INSERT INTO MyGuests (firstname, lastname, email)
VALUES ('Mary', 'Moe', 'mary@example.com');";
$sql .= "INSERT INTO MyGuests (firstname, lastname, email)
VALUES ('Julie', 'Dooley', 'julie@example.com')";
 
if ($conn->multi_query($sql) === TRUE) {
    echo "新記錄插入成功\n";
} else {
    echo "Error: " . $sql . "<br>" . $conn->error;
}

?>

 

 進入mysql容器查看結果

   

 

查看數據:

$sql = "SELECT id, firstname, lastname FROM MyGuests";
$result = $conn->query($sql);
 
if ($result->num_rows > 0) {
    // 輸出數據
    while($row = $result->fetch_assoc()) {
        echo "id: " . $row["id"]. " - Name: " . $row["firstname"]. " " . $row["lastname"]. "<br>";
    }
} else {
    echo "0 結果";
}

 

刪除數據:

mysqli_query($conn,"DELETE FROM MyGuests WHERE LastName='Dooley'");

 五、phpmyadmin容器

經過docker-compose鏈接一個phpmyadmin容器,在docker-compose.yml末尾添上以下代碼,執行docker-compose up -d;

phpmyadmin:
   image: lnmp_pmadmin
   container_name: lnmp_pmadmin-container
   build: ./phpmyadmin
   ports:
    - "9090:80"
   links:
    - "mysql"
   environment:
    - PMA_ARBITRARY=1

 

web端口進入phpmyadmin

 

 

有圖形操做界面就感受很能夠。

 

 6、實驗感悟

  此次實驗的學習時長,比封建主義還保守地算,說20多個小時都不過度。

  多是由於對實踐的許多經驗與敏感度不足吧,沒有規範的操做手冊或學習教程,學習這種比較新的技術對我來講相對是吃力,若是說是儘量明白每個細節而不是單純照搬別人的過程的話。

  畢竟微服務框架在當下仍是很是熱潮與實際的,儘量學會每一個細節應該是有必要的。

遇到困難仍是不少的:

  換源沒換好致使compose安裝包的很長等一些小挫折就不說了(其實若是隻是pull鏡像或Dockerfile個人官方源網速是夠用的),最後仍是得換(第一次還沒換好?就說爲啥get那邊仍是debian啥啥啥的)

  

——

  有一個坑,php鏈接nginx要在網站上體現出來phpinfo()函數所獲得的php配置信息,這個東西在後面既能夠建驗nginx和php是否鏈接好,也能夠查看php是否有某些配置(如PDO、Mysqli)。

  而後問題就是web死活看不到php配置信息,各類檢查compose配置,Dockfile配置以及種種種種,搞了4個多小時都出不來。(可能連問題的本質都沒抓住)

  這4個多小時翻了無數的百度和大佬標答,甚至還一度懷疑路徑問題?這期間去看了全部配置的相關從location匹配到compose.yml細節,還得反覆檢查。

  因此最後翻查log文件複製信息去百度(好像是nginx一行行的power shell仍是啥的不記得了),上面說可能你須要檢查一下fpm有沒有,而後我發現爲啥from php的tag後原本應該有「-fpm」,而個人php的Dockerfile上卻漏了!一個小點點而已!

  這裏有個點在於,你由於對這些的不少東西一點都不瞭解,或者就算有接觸過理論卻並無付諸實踐過,因此你不得借鑑網上的教程或者大佬的標答。但你又想真正的去了解這些過程當中每個點的含義,惋惜並無一本全面的教材告訴你全部的點的含義。

——

  其實更難受在鏈接數據庫的時候,依然是nginx鏈接mysql就是error,各類bug瘋狂涌現。

  且不說安裝完的php既沒有PDO也沒有Mysqli,不要緊,安裝吧,覺得沒問題了。severname不知道填啥,好吧本機IP或是mysql的container名都OK其實,但這混亂了重點,使得仍是一度覺得主機名輸錯了。

  依舊是複製web端反饋的信息去百度,但問題不針對不少方法是不對應的,好比中途我還得進入容器去尋找my.cnf的配置文件來修改。

  這裏,mysql8和php不兼容的問題是個巨坑,說是mysql8.0以後字符集修改爲utfmb4,致使php5.6以前的版本沒法識別。然後好像7版本能夠,但後來新的版本又不行(我怎麼會知道?)。然而照着網上不用升級版本的方法去修改my.cnf文件依舊不行。

  最後逼不得已,仍是刪除鏡像與容器,從新compose對應的php版本。

相關文章
相關標籤/搜索