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
配置文件內容又很多的樣子。到后面摸索摸索着漸漸就感覺其實也並不難,到最后也能都理解清楚。但是這應該才是鍛煉(折磨)的開始趴