第3次实践作业
一、Docker-compose的安装
(1)运行以下命令以下载Docker Compose的当前稳定版本
sudo curl -L "https://github.com/docker/compose/releases/download/1.25.5/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
安装的时候遇到了如下问题,解决方法记录在后面了
curl: (56) OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 104
(2)将可执行权限应用于二进制文件
sudo chmod +x /usr/local/bin/docker-compose
(3)测试安装
sudo docker-compose --version
二、Dockerfile编写
选择LNMP(Linux+Nginx+Mysql+PHP)
参考资料:Docker docker-compose 配置lnmp开发环境
参考这里面的dockerfile-compose.yml文档的时候要注意一下volumes的设置,我参考以后遇到了一些小问题
(1)Nginx
Dockerfile:
FROM nginx:latest
default.conf:
server {
listen 80;
server_name localhost;
location / {
root /var/www/html;
index index.html index.htm index.php; # 增加index.php
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /var/www/html;
}
location ~ \.php$ {
root /var/www/html; # 代码目录
fastcgi_pass phpfpm:9000; # 修改为phpfpm容器
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; # 修改为$document_root
include fastcgi_params;
}
}
(2)Mysql
Dockerfile:
FROM mysql:5.7
(3)PHP
Dockerfile:
FROM php:5.6-fpm
RUN apt-get update && apt-get install -y \
libfreetype6-dev \
libjpeg62-turbo-dev \
libpng12*-dev \
vim \
&& docker-php-ext-install pdo_mysql \
&& docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
&& docker-php-ext-install gd \
(4)创建index.html
(5)创建index.php
<?php phpinfo();?>
三、使用Compose实现多容器运行机制
(1)文档结构如下:
前面写的时候漏了index.php文档,html部分的结构应为是如下这样:
(因为先执行了docker-compose.yml文件才发现漏了,文档结构变得比较复杂,就没再截执行之后的文档结构了)
(2)编写compose文件
docker-compose.yml:
nginx:
build: ./nginx
ports:
- "80:80"
links:
- "phpfpm"
volumes:
- ./html/:/var/www/html/
- ./nginx/conf/default.conf:/etc/nginx/conf.d/default.conf
phpfpm:
build: ./phpfpm
ports:
- "9000:9000"
volumes:
- ./html/:/var/www/html/
links:
- "mysql"
mysql:
build: ./mysql
ports:
- "13306:3306"
volumes:
- ./mysql/data/:/var/lib/mysql/
environment:
MYSQL_ROOT_PASSWORD : 123456
(3)执行docker-compose
1.因为之前遇到了一些错误,需要停止并移除已运行的部分
sudo docker-compose down
2.执行
sudo docker-compose up -d --build
第一次执行耗费的时间比较长,大概1个小时左右,要耐心耐心。
但是出现了问题,记录在后面啦。
解决之后就成功啦!
四、服务测试
参考资料:PHP 连接 MySQL
(1)nginx测试
(2)php+nginx测试
(3)数据库连接
1.编辑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();
}
2.在浏览器查看一下
(4)创建数据库
1.编辑index.php文档
<?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 myDBPDO";
// 使用 exec() ,因为没有结果返回
$conn->exec($sql);
echo "数据库创建成功<br>";
}
catch(PDOException $e)
{
echo $sql . "<br>" . $e->getMessage();
}
$conn = null;
?>
2.在浏览器查看一下
3.查看数据库
sudo docker exec -it compose-lnmp_mysql_1 /bin/bash
mysql -u root -p
查看已经存在的数据库
show databases;
(5) 创建数据表
1.编辑index.php文档
<?php
$servername = "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 stu (
ID INT(9) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
NAME VARCHAR(30) NOT NULL,
MAJOR VARCHAR(30) NOT NULL
)";
// 使用 exec() ,没有结果返回
$conn->exec($sql);
echo "数据表 stu 创建成功";
}
catch(PDOException $e)
{
echo $sql . "<br>" . $e->getMessage();
}
$conn = null;
?>
2.在浏览器查看一下
3.进入数据库并查表
use myDBPDO
show tables;
(6)表记录的插入
1.编辑index.php文档
<?php
$servername = "mysql";
$username = "root";
$password = "123456";
$dbname="myDBPDO";
try {
$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
// set the PDO error mode to exception
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// 开始事务
$conn->beginTransaction();
// SQL 语句
$conn->exec("INSERT INTO stu (ID, NAME, MAJOR)
VALUES ('171709030', 'Cathy', 'Industrial Design')");
$conn->exec("INSERT INTO stu (ID, NAME, MAJOR)
VALUES ('031702000', 'Zero', 'Computer Science')");
$conn->exec("INSERT INTO stu (ID, NAME, MAJOR)
VALUES ('031702001', 'One', 'Computer Science')");
// 提交事务
$conn->commit();
echo "新记录插入成功";
}
catch(PDOException $e)
{
// 如果执行失败回滚
$conn->rollback();
echo $sql . "<br>" . $e->getMessage();
}
$conn = null;
?>
2.在浏览器查看一下
3.查询
select * from stu;
(7)表记录的修改
1.编辑index.php文档
<?php
$servername = "mysql";
$username = "root";
$password = "123456";
$dbname="myDBPDO";
try {
$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
// set the PDO error mode to exception
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// SQL 语句
$conn->exec("UPDATE stu SET MAJOR='Computer Science' WHERE ID=171709030");
echo "记录修改成功";
}
catch(PDOException $e)
{
// 如果执行失败回滚
$conn->rollback();
echo $sql . "<br>" . $e->getMessage();
}
$conn = null;
?>
2.在浏览器查看一下
3.查询
select * from stu;
可以看到表记录已被修改
(8)表记录的删除
1.编辑index.php文档
<?php
$servername = "mysql";
$username = "root";
$password = "123456";
$dbname="myDBPDO";
try {
$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
// set the PDO error mode to exception
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// SQL 语句
$conn->exec("DELETE FROM stu where ID=031702000");
echo "记录删除成功";
}
catch(PDOException $e)
{
// 如果执行失败回滚
$conn->rollback();
echo $sql . "<br>" . $e->getMessage();
}
$conn = null;
?>
2.在浏览器查看一下
3.查询
select * from stu;
可以看到此时相应记录已被删除
五、增加phpmyadmin容器,实现web端的数据库管理
(1)编辑docker-compose.yml文档
在文档中增加
phpmyadmin:
build: ./phpmyadimin
container_name: "phpmyadmin"
ports:
- "8080:80"
links:
- "mysql"
environment:
- PMA_ABRITRARY=1
- PMA_HOST=mysql
(2)编写phpmyadmin的Dockerfile
#基础镜像
FROM phpmyadmin/phpmyadmin:latest
#声明暴露的端口
EXPOSE 8080
(3)用浏览器访问https://localhost:8080/
输入用户名和密码执行
这边遇到了无法登陆的问题,解决方法写在后面了
成功!
(4)点击数据库可以看到所有已存在的数据库
(5)查看myDBPDO数据库中的stu表
(6)表记录的插入,修改和删除
插入:
可以看到已经插入了NAME为Zero学生的记录
修改:
可以看到将NAME为Zero学生的MAJOR修改为English
删除:
可以看到已经将NAME为Zero学生的记录删除
六、遇到的问题及解决方法
(1)按照官方教程安装Docker-compose时出现如下问题:
原因:主要原因是安全设置的问题
解决方法:
执行如下命令:
git config http.sslVerify "false"
若出现如下错误:
fatal: not in a git directory
再继续执行:
git config --globle http.sslVerify "false"
问题就解决啦
(2)执行docker-compose时出现如下问题:
问题一:
将docker-compose.yml文档中如下部分中的3306:3306改成13306:3306就解决了
mysql:
build: ./mysql
ports:
- "13306:3306"
做期末大作业的时候也遇到了这个问题,又查找了一些资料
发现其实原因是本地mysql服务自动打开了,与docker的冲突,使docker的mysql服务无法映射到本地
解决方法是把本地的mysql服务关闭
service mysql stop
但是又有了新的问题
问题二:
翻阅了其他博客发现是文档中的三个volumes设置都有问题
举其中一个为例子,剩下的也是这样修改
将
volumes:
- /home/compose-lnmp/html/:/var/www/html/
- /home/compose-lnmp/nginx/conf/default.conf:/etc/nginx/conf.d/default.conf
修改为
volumes:
- ./html/:/var/www/html/
- ./nginx/conf/default.conf:/etc/nginx/conf.d/default.conf
就解决啦
(3)增加phpmyadmin容器,在web端登录的时候遇到了如下问题:
在docker-compose.yml文档中phpmyadmin部分的environment内增加了一行
- PMA_HOST=mysql
结果登录的时候显示
mysqli_real_connect(): (HY000/2002): Connection refused
原因是数据库没有启动
service mysql start
这样就可以登录啦!
七、花费时间
作业名称 | 耗时(小时) |
---|---|
Docker-compose的安装 | 0.5 |
Dockerfile编写以及使用Compose实现多容器运行机制 | 12 |
服务测试 | 4 |
增加phpmyadmin容器 | 4 |
博客编写 | 1.5 |
总计 | 22 |
八、小结
我怎么也没想到步步是坑,第一步就遇到了问题,好不容易完成了前三个部分,本以为服务测试部分遇到的问题会少一些,结果还是有很细的一些小问题,比如servername设置错误,还有因为粗心漏看一个字母导致数据库一直打不开等等,说起来其实还是不够细心,选做部分也遇到了一个问题,其实两个步骤就能解决,但是由于两个解决方法的博客是分开的,第一步做对了我还在怀疑是不是我哪里弄错了,折腾了很久。这样零零散散也做了两个白天,终于做完了!!!解决问题看到结果真的很有成就感!!!
小结其实是做完每个部分之后记录下来的感受,在解决完第一步的时候我还洋洋洒洒写下“经历过第一次实践,以及之前的SDN课和LINUX课,我已经有了比较好的心态面对这些坑:)(给一个朴实无华的微笑),毕竟办法总比困难多,与其抵触它们,不如耐心地去解决它们,解决之后就会很开心。”这样的话,做到第三部分的时候我默默删除了它哈哈哈哈,抵触是不抵触,耐心是真的没了,心态崩也是真的崩了,主要是解决方案都要尝试过才知道能不能成功,有的方案很零散,要东拼西凑才能凑出一个能解决我遇到的问题的方案,而且有时候修改了小小的一个部分,结果都会很离谱。做这个实践真的要很有耐心而且要有很好的心态!!
总之这次实验很波折,但是也收获了很多,学会了web服务器、数据库、开发程序等服务的组装,进行了一些数据库的操作,同时在选做部分学会了增加phpmyadmin容器,实现web端的数据库管理,对docker有了进一步的熟悉,最后希望自己下一次心态能更好,耶。