1.安装docker-compose
常规curl的方法下载速度太慢,这次我使用pip方法安装docker-compose
- 安装python-pip工具
sudo apt install python-pip
- 安装docker-compose
pip install docker-compose
- 查看版本号,检测是否安装成功
docker-compose version
2.Dockerfile编写
2.1web应用
- dockerfile内容
from nginx expose 7890 maintainer xuxuxu
2.2php应用
- dockerfile内容
# 从官方PHP镜像构建 FROM php:7.4-fpm # 将index.php复制到容器内的/var/www目录下 ADD index.php /var/www # 对外暴露8080端口 EXPOSE 8080 # 设置容器默认工作目录为/var/www WORKDIR /var/www # 容器运行后默认执行的指令 ENTRYPOINT ["php", "-S", "0.0.0.0:8080"]
- index.php内容
<?php echo "Hello World!"; ?>
- 创建、执行、显示运行结果
docker build -t myphp . docker run -d -p 8080:8080 myphp curl localhost:8080
- 制作php-extension镜像为连接数据库做准备(dockerfile内容如下)
FROM php:7.4-fpm RUN apt-get update && docker-php-ext-install pdo pdo_mysql
2.3mysql试运行
dockerfile内容
#基础镜像 FROM mysql:5.7 #作者信息 MAINTAINER xuxuxu #设置root密码 ENV MYSQL_ROOT_PASSWORD 123456 #设置不可免密登录 ENV MYSQL_ALLOW_EMPTY_PASSWORD no
3.使用Compose实现多容器运行机制
- docker-compose.yml内容
version: "3" services: web: image: nginx ports: - "7890:7890" volumes: - /docker/project:/var/www/html/project - /docker/default.conf:/etc/nginx/conf.d/default.conf - /docker/log:/var/log/nginx networks: - webnet php: image: php-extension volumes: - /docker/project:/var/www/html/project networks: - webnet mysql: # 添加 mysql 服务 image: mysql:5.7 ports: - "3306:3306" volumes: # 挂载数据卷 - /docker/mysql:/var/lib/mysql environment: - TZ=Asia/Shanghai # 设置时区 - MYSQL_ROOT_PASSWORD=123456 # 设置 root 用户密码 command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci # 设置编码 networks: - webnet networks: webnet:
- default.conf内容
server { listen 7890; index index.php index.html; server_name localhost; root /var/www/html/project; access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log; location ~ .php$ { try_files $uri =404; fastcgi_split_path_info ^(.+.php)(/.+)$; fastcgi_pass php:9000; fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; } }
- 最终的文件树如下
- 运行
docker-compose up -d
4.服务测试
直接修改project下的index.php文件
- 连接测试
<?php $servername = "mysql"; $username = "root"; $password = "123456"; try { $conn = new PDO("mysql:host=$servername;", $username, $password); echo "连接成功"; } catch(PDOException $e) { echo $e->getMessage(); } ?>
- 创建数据库
<?php $servername = "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 Student"; // 使用 exec() ,因为没有结果返回 $conn->exec($sql); echo "数据库创建成功<br>"; } catch(PDOException $e) { echo $sql . "<br>" . $e->getMessage(); } $conn = null; ?>
- 新建表
<?php $servername = "mysql"; $username = "root"; $password = "123456"; $dbname = "Student"; try { $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password); // 设置 PDO 错误模式,用于抛出异常 $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // 使用 sql 创建数据表 $sql = "CREATE TABLE Basedata ( id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY, name VARCHAR(30) NOT NULL )"; // 使用 exec() ,没有结果返回 $conn->exec($sql); echo "数据表 Basedata 创建成功"; } catch(PDOException $e) { echo $sql . "<br>" . $e->getMessage(); } $conn = null; ?>
插入/删除/修改数据
<?php $servername = "mysql"; $username = "root"; $password = "123456"; $dbname = "Student"; try { $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password); // 设置 PDO 错误模式,用于抛出异常 $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $sql = "INSERT INTO Basedata (name) VALUES ('dididi')";
//删除数据时将这一段修改为"DELETE FROM Basedata WHERE name = 'dididi'" //修改数据时这一段修改为"UPDATE Basedata SET name = 'bili' WHERE name = 'dididi'" // 使用 exec() ,没有结果返回 $conn->exec($sql); echo "新记录插入成功"; } catch(PDOException $e) { echo $sql . "<br>" . $e->getMessage(); } $conn = null; ?>
查询数据
<?php echo "<table style='border: solid 1px black;'>"; echo "<tr><th>id</th><th>name</th></tr>"; class TableRows extends RecursiveIteratorIterator { function __construct($it) { parent::__construct($it, self::LEAVES_ONLY); } function current() { return "<td style='150px;border:1px solid black;'>" . parent::current(). "</td>"; } function beginChildren() { echo "<tr>"; } function endChildren() { echo "</tr>" . " "; } } $servername = "mysql"; $username = "root"; $password = "123456"; $dbname = "Student"; try { $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password); $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $stmt = $conn->prepare("SELECT id,name FROM Basedata"); $stmt->execute(); // 设置结果集为关联数组 $result = $stmt->setFetchMode(PDO::FETCH_ASSOC); foreach(new TableRows(new RecursiveArrayIterator($stmt->fetchAll())) as $k=>$v) { echo $v; } } catch(PDOException $e) { echo "Error: " . $e->getMessage(); } $conn = null; echo "</table>"; ?>
5.选做
直接在命令行输入
docker run --name myadmin -d -e PMA_HOST=mysql --net docker_webnet -p 6654:80 phpmyadmin/phpmyadmin
6.遇到的问题及解决方法
- 问题一:
解决方法:这个问题是因为原生的php自带的pdo不支持mysql数据库所以制作新的镜像一个新的镜像即可,具体的dockerfile代码在第二个部分有介绍。
- 问题二:
问题描述:数据库拒绝连接
解决方法:我在index.php中错误的将servername的值赋为localhost,刚开始以为是dockercompose创建容器是没有按nginx、mysql、php这样的顺序创建。但是最后发现并不是那个原因,查找很多资料也没有找到原因,最后发现随便尝试,发现是servername的原因只要将servername的值改为容器名即可。
7.完成作业所花的时间
学习docker-compose:2小时
配置文件:3小时
查找资料及解决问题:6小时
撰写博客:1小时
共计12小时