1. 程式人生 > 其它 >Docker搭建LNMP環境

Docker搭建LNMP環境

Docker
若未安裝Docker,可參考以下資料進行安裝:
https://books.studygolang.com/docker_practice/install/

安裝docker

curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
systemctl enable docker
systemctl start docker

Nginx
1. 拉取映象

docker pull nginx

2. 執行容器
(1)建立專案程式根目錄,編寫一個簡單測試的html檔案:

cd /
mkdir www
cd www
vim index.html

index.html檔案內容如下:

<html>
        <head>
                <title>Docker Nginx Testing</title>
        </head>
        <body>
                <div>
                        <h3>When you see this message, it means the docker nginx is successfully running!</h3>
                </div>
        </body>
</html>

(2)建立nginx目錄,建立nginx配置檔案nginx-test.conf:

cd /usr/local
mkdir nginx
cd nginx
mkdir conf
cd conf
vim nginx-test.conf

nginx-test.conf檔案內容如下:

server {
    listen       80;
    location / {
        root   /www;
        index  index.html index.htm;
    }
}

(3)宿主主機8080埠對映nginx容器80埠,宿主主機/usr/local/nginx/conf目錄對映nginx容器/etc/nginx/conf.d目錄,宿主主機/www目錄對映nginx容器/www目錄,啟動容器:

docker run --name nginx -p 8080:80 -v /usr/local/nginx/conf:/etc/nginx/conf.d -v /www:/www nginx

3. 瀏覽器訪問驗證

PHP
1. 拉取映象

docker pull php:7.4-fpm

2. 定製並構建映象
(1)建立php目錄

cd /usr/local
mkdir php
cd php
mkdir etc #此目錄需要放置一個php配置檔案,命名php.ini
touch php.ini
vim Dockerfile

(2)Dockerfile檔案內容:

FROM php:7.4-fpm #基於映象檔案php:7.4-fpm構建
COPY ./etc/php.ini /usr/local/etc/php/php.ini #複製上下文目錄的php配置檔案
RUN docker-php-ext-install pdo_mysql #使用映象提供的安裝擴充套件的快捷操作安裝pdo_mysql擴充套件

(3)構建映象:

docker build -t php:my-php .

3. 執行容器
宿主主機9000埠對映php容器9000埠,宿主主機/www目錄對映php容器/www目錄,啟動容器:

docker run --name php -p 9000:9000 -v /www:/www php:my-php

注:關於php的配置檔案,我的操作是先執行php容器,將其配置檔案複製到宿主主機上,然後再進行目錄對映。複製指令:

docker cp php:/usr/local/etc/php/php.ini-development /usr/local/php/etc/php.ini

4. nginx支援php
(1)把nginx和php兩個容器通過網絡卡連線起來:

1 2 3 4 5 docker network create --driver bridge lnmp#新建一個橋接網絡卡,名為lnmp docker network connect lnmp php#php容器連線網絡卡lnmp docker network connect lnmp nginx#nginx容器連線網絡卡lnmp docker networkls#檢視網絡卡列表 docker network inspect lnmp#檢視網絡卡lnmp詳情

(2)修改nginx配置檔案nginx-test.conf,把PHP指令碼轉發給php-fpm,php-fpm地址通過容器名進行識別:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 server { listen 80; location / { root/www; index index.php index.html index.htm; } location ~ \.php$ { root/www; fastcgi_pass php:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } }

(3)讓nginx容器重新載入配置檔案:

1 dockerexec-it nginx nginx -s reload

5. 執行驗證
在宿主主機/www下建立檔案phpinfo.php:

1 2 <?php phpinfo();

儲存,瀏覽器訪問:

MySQL
1. 拉取映象

1 docker pull mysql:5.7

2. 定製並構建映象
(1)建立mysql目錄:

1 2 3 cd/usr/local mkdirmysql cdmysql

(2)建立測試資料檔案test.sql:

1 2 3 4 5 6 7 8 createtablestudent( idintnotnullprimarykeyauto_increment comment'主鍵ID', namevarchar(20)notnullcomment'姓名', ageintnotnullcomment'年齡' )engine=InnoDBdefaultcharset=utf8 comment'學生資料表'; insertintostudent(name, age)values('小明', 18); insertintostudent(name, age)values('啊俊', 28);

(3)建立Dockerfile:

1 2 3 FROM mysql:5.7#基於映象檔案mysql:5.7構建 ENV MYSQL_ROOT_PASSWORD=123456 MYSQL_DATABASE=test#設定root使用者密碼 COPY ./test.sql/var/data/test.sql#複製上下文目錄的SQL檔案

(4)構建映象:

1 docker build -t mysql:my-mysql .

3. 執行容器
宿主主機3306埠對映mysql容器3306埠,啟動容器並加入網路lnmp:

1 docker run --name mysql --network lnmp -p 3306:3306 mysql:my-mysql

4. 執行驗證
(1)進入容器,將測試資料匯入mysql:

1 2 3 4 dockerexec-it mysqlbash mysql -u root -p mysql> usetest mysql>source/var/data/test.sql

(2)在宿主主機/www目錄建立測試檔案testmysql.php:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 <?php $dsn='mysql:dbname=test;host=mysql'; $user='root'; $password='123456'; try{ $dbh=newPDO($dsn,$user,$password); $sql='SELECT * FROM student where id=?'; $sth=$dbh->prepare($sql); $sth->execute([2]); $result=$sth->fetch(PDO::FETCH_ASSOC); var_dump($result); }catch(PDOException$e) { echo'Error: '.$e->getMessage(); }

(3)訪問執行:

至此,docker搭建lnmp環境大功告成!

檢視執行中容器列表:

檢視網路lnmp資訊:

  上述實踐中,我們將nginx的配置檔案放在宿主主機上,然後通過對映nginx容器目錄到宿主主機目錄,讓nginx使用宿主主機上的配置檔案,這樣做的好處是當nginx容器被刪除時,配置檔案中的更改不會丟失,以後建立的nginx容器可以繼續使用這個配置檔案。
  在實際專案中,我們應該把不希望隨著容器刪除而丟失的配置和資料都儲存在宿主主機上,通過容器與宿主主機的目錄對映來使用這些配置和資料,例如php的配置,以及mysql的配置,特別是mysql的資料庫資料。
  將MySQL資料庫資料儲存在宿主主機的操作:首先執行mysql容器,然後將mysql容器的配置目錄檔案和資料目錄檔案都複製到宿主主機上,最後停止並刪除正在執行的mysql容器,對映相應目錄,重新建立並啟動一個mysql容器。這樣,即使mysql容器被刪除了,mysql資料庫的配置和資料還是不會丟失。

1 2 3 4 5 6 7 8 9 10 11 12 13 docker container start mysql cd/usr/local/mysql dockercpmysql:/var/lib/mysql. mkdirdata mv./mysql/* ./data rmdirmysql dockercpmysql:/etc/mysql. mkdiretc mv./mysql/* ./etc rmdirmysql docker stop mysql docker containerrmmysql docker run --name mysql --network lnmp -p 3306:3306 -v/usr/local/mysql/data:/var/lib/mysql-v/usr/local/mysql/etc:/etc/mysqlmysql:my-mysql