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 network ls #檢視網絡卡列表
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 |
docker exec -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
mkdir mysql
cd mysql
|
(2)建立測試資料檔案test.sql:
1 2 3 4 5 6 7 8 |
create table student(
id int not null primary key auto_increment comment '主鍵ID' ,
name varchar (20) not null comment '姓名' ,
age int not null comment '年齡'
)engine=InnoDB default charset=utf8 comment '學生資料表' ;
insert into student( name , age) values ( '小明' , 18);
insert into student( 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 |
docker exec -it mysql bash
mysql -u root -p
mysql> use test
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 = new PDO( $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
docker cp mysql: /var/lib/mysql .
mkdir data
mv . /mysql/ * . /data
rmdir mysql
docker cp mysql: /etc/mysql .
mkdir etc
mv . /mysql/ * . /etc
rmdir mysql
docker stop mysql
docker container rm mysql
docker run --name mysql --network lnmp -p 3306:3306 - v /usr/local/mysql/data : /var/lib/mysql - v /usr/local/mysql/etc : /etc/mysql mysql:my-mysql
|