(1)完成Docker-compose的安装
安装命令如下:
curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
一开始我直接安装失败了,所以必须改在root权限下安装才可。
查看安装的版本:
docker-compose --version
(2)Dockerfile编写
要求:
LNMP/LAMP选择一种;
分别构建web、php应用、数据库等镜像服务,php镜像亦有提供php:
提示:php连接数据库需要安装必要的核心扩展部件(PHP Core Extensions)安装方法可参考官方镜像介绍。
使用docker pull 下载php镜像
docker pull php:7.4-fpm
mysql
#Dockerfile
#基础镜像
FROM mysql:5.7
#维护者信息
MAINTAINER qhh
ENV MYSQL_ALLOW_EMPTY_PASSWORD no
ENV MYSQL_ROOT_PASSWORD=123456
#不允许空密码登陆,设置初始密码
nginx
#Dockerfile
FROM nginx
#基础镜像
MAINTAINER xmmm
#维护者
EXPOSE 2208
#映射端口
#default.conf
server {
listen 2208; #修改映射端口
server_name localhost;
location / {
root /www/web; #修改nginx工作目录
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
location ~ .php$ {
root /www/web; # php容器web文件代码目录
fastcgi_pass php:9000; # 修改php服务器端口
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;# 修改为$document_root
include fastcgi_params;
}
}
php
FROM php:7.4-fpm
#基础镜像
MAINTAINER xmmm
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
web
#index.html
hello,welcome to mynginx
#index.php
<?php phpinfo();?>
最终的tree文件树
(3)使用Compose实现多容器运行机制
编写compose文件,完成上述LNMP/LAMP的微服务组合部署。
参考资料:Get started with Docker Compose
docker-compose.yml文件
version: "3"
services:
#nginx服务
nginx:
image: nginx_image #镜像名
container_name: nginx_container #容器名
build: ./nginx
ports:
- "80:2208" #暴露端口
volumes:
- ./web:/www/web #磁盘映射,后者与default.conf中定义的一致
- ./nginx/default.conf:/etc/nginx/conf.d/default.conf
#php服务
php:
image: php_image
container_name: php_container
build: ./php
environment:
MYSQL_PASSWORD: 123456
volumes:
- ./web:/www/web
#mysql服务
mysql:
image: mysql_image
container_name: mysql_container
build: ./mysql
ports:
- "3306:3306"
volumes:
- ./mysql/data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD : 123456
运行docker-compose
sudo docker-compose up -d
查看镜像
sudo docker images
查看容器
sudo docker ps -a
访问http://localhost/index.html
访问http://localhost/index.php
(4)服务测试
要求和提示:
包括但不限于测试数据库连接、数据库新建、表新建、表记录的插入修改和删除是否成功(pdo或mysqli均可);
相关测试代码可直接参考PHP与MySQL的教程。
测试数据库连接
修改index.php连接数据库
<?php
$servername = "mysql";
$username = "root";
$password = "123456";
try {
$conn = new PDO("mysql:host=$servername;", $username, $password);
echo "mysql数据库已连接成功!";
}
catch(PDOException $e)
{
echo $e->getMessage();
}
?>
可以看到修改后的输出
新建数据库docker-compose-db
<?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 dockerComposeDB"; //修改数据库名
// 使用 exec() ,因为没有结果返回
$conn->exec($sql);
echo "数据库创建成功<br>";
}
catch(PDOException $e)
{
echo $sql . "<br>" . $e->getMessage();
}
$conn = null;
?>
登录数据库查看数据库信息
新建表
建立student表,包含属性:学号sno,姓名sname,成绩grade
<?php
$servername = "mysql";
$username = "root";
$password = "123456";
$dbname="dockerComposeDB";
try {
$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username,$password);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// 使用 sql 创建数据表
$sql = "CREATE TABLE student(
sno INT(8) UNSIGNED PRIMARY KEY,
sname CHAR(30) NOT NULL,
grade INT(3)
)";
// 使用 exec() ,没有结果返回
$conn->exec($sql);
echo "数据表 student 创建成功";
}
catch(PDOException $e)
{
echo $sql . "<br>" . $e->getMessage();
}
$conn = null;
?>
插入数据
<?php
$servername = "mysql";
$username = "root";
$password = "123456";
$dbname="dockerComposeDB";
try {
$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
// 设置 PDO 错误模式,用于抛出异常
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
//开始事务
$conn->beginTransaction();
$conn->exec("INSERT INTO student (sno,sname, grade)
VALUES ('10011','lihua','92')");
$conn->exec("INSERT INTO student (sno,sname, grade)
VALUES ('10012','wanglei','77')");
$conn->exec("INSERT INTO student (sno,sname, grade)
VALUES ('10013','lishuang','83')");
$conn->exec("INSERT INTO student (sno,sname, grade)
VALUES ('10014','yangminting','100')");
// 提交事务
$conn->commit();
echo "插入数据成功!";
}
catch(PDOException $e)
{
$conn->rollback();
echo $sql . "<br>" . $e->getMessage();
}
$conn = null;
?>
修改数据
<?php
$servername = "mysql";
$username = "root";
$password = "123456";
$dbname="dockerComposeDB";
try {
$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
// 设置 PDO 错误模式,用于抛出异常
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
//开始事务
$conn->beginTransaction();
$conn->exec("UPDATE student SET grade=87 WHERE sname='lishuang'");
$conn->exec("UPDATE student SET grade=80 WHERE sno='10012'");
$conn->exec("UPDATE student SET grade=grade+2 WHERE sname='lihua'");
$conn->exec("UPDATE student SET sname='ymt' WHERE sno='10014'");
// 提交事务
$conn->commit();
echo "修改数据成功!";
}
catch(PDOException $e)
{
$conn->rollback();
echo $sql . "<br>" . $e->getMessage();
}
$conn = null;
?>
删除数据
<?php
$servername = "mysql";
$username = "root";
$password = "123456";
$dbname="dockerComposeDB";
try {
$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
// 设置 PDO 错误模式,用于抛出异常
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
//开始事务
$conn->beginTransaction();
$conn->exec("DELETE FROM student WHERE sno='10012'");
$conn->exec("DELETE FROM student WHERE sname='lishuang'");
// 提交事务
$conn->commit();
echo "删除数据成功!";
}
catch(PDOException $e)
{
$conn->rollback();
echo $sql . "<br>" . $e->getMessage();
}
$conn = null;
?>
(5)选做:增加一个phpmyadmin容器,实现web端的数据库管理。
编写Dockerfile文件
#基础镜像
FROM phpmyadmin/phpmyadmin
#维护者信息
MAINTAINER qhh
#暴露端口
EXPOSE 8080
编辑yml文件
在docker-compose.yml最后面加上:
phpmyadmin:
image: phpmyadmin_image
container_name: myphpmyadmin_container
build: ./phpmyadmin
ports:
- "8080:80"
environment:
PMA_HOST: mysql
重新启动docker-compose
移除之前运行的docker-compose再建
docker-compose down
docker-compose up -d --build
访问网址localhost:8080
phpmyadmin数据库一系列操作
(6)实验报告
记录实验过程的主要问题和解决方法,分享经验和感想
(1)下载docker和php老是到一半就停了,等了好久也不见有反应,解决方法是换源,尤其是国内的网站。
(2)一开始我不知道怎么编写Dockerfile文件,然后参考其他同学,我花费了一些时间去想那个tree树时怎么来的,然后才想起来是文件的结构,然后就知道怎么编写Dockerfile文件了。
(3)在第三步的时候,运行docker-compose时,网站地址响应很慢,有时候甚至是卡了几十分钟,弄得我心情很烦,然后忍不住又去取消重新运行,试了好几回也等了好长时间才能运行成功,但是又马上有新问题,就是我登录localhost/index.html和localhost/index.php连接建立失败,我又百度了一会儿,然后发现可能端口设置不对,我把端口改成别的了,然后就干脆设置成80。
(4)在第三步运行docker-compose时,不知道为什么我的docker突然启动不了,然后再试了几次还不行,实在没招我就想着删除了重新下载算了,结果让我想不到的是,虽然卸载成功了,然而我想再安装docker-ce的时候却失败了,每次安装都失败,真的是让我抓狂,然后把错误的地方去百度,知道了就是docker的daemon.json文件配置出现了错误,然后我千辛万苦找到了这个配置文件,打开发现里面果然啥东西都没了,是不是什么时候被误删了(疑惑),然后又一顿百度怎么配置daemon.json文件,然后顺带学习怎么使用vim编译器(以前没用过这),经过揪心的历程,最后终于舒了一口气。
记录完成作业所花的时间
总计大约:12小时
1、完成作业内容时间:大约7小时
2、各种百度学习时间:大约2小时
3、各种反复下载和运行时间,以及电脑卡顿卡机时间:大约3小时
心得体会
主要心得是我的耐心得到了训练,控制情绪,还有也又学到了一些知识。