系统结构综合实践-第三次作业
1.docker-compose的安装
在Linux中安装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
sudo chmod +x /usr/local/bin/docker-compose
最后使用docker-compose --version检查一下安装是否成功即可
2.Dockerfile和docker-compose.yml文件的编写
(1)Nginx
Dockerfile
FROM nginx:latest
修改default.conf文件
server {
listen 80;
server_name localhost;
location / {
root /var/www/html; #与dockercompose中的路径相对应
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
这里额外安装了vim编辑器,便于在容器中修改文件。但是后面通过 volumes的挂载可以将宿主机中的文件映射到容器中,关键文件的修改在宿主机中进行就可以了,更方便。
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)web文件
index.html
nginx build success!!!!
index.php
<?php
phpinfo();
?>
(5)docker-compose.yml
docker-compose.yml的编写参考了博客
https://www.cnblogs.com/blogscc/p/9473123.html
整个实验过程最重要的一步。
个人认为最重要的是volumes和links这两个
volumes决定了宿主机到容器的文件映射
links决定了容器要连接到哪一个容器,让谁为我们提供服务,后面总结的时候会放一张图来解释这个links的过程。
version: "3"
services:
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:
- "3306:3306"
volumes:
- ./mysql/data/:/var/lib/mysql/
environment:
MYSQL_ROOT_PASSWORD : 123456
文件目录的结构
最后运行sudo docker-compose up -d
查看一下各个容器的运行状态
4.服务测试
(1)首先查看一下index.html和index.php
(2)测试能否正常连接数据库
以下测试代码参考菜鸟教程
https://www.runoob.com/php/php-mysql-connect.html
通过修改index.php文件进行测试
<?php
$servername = "mysql"; #这里使用的servername要与yml文件中的links相匹配
$username = "root";
$password = "123456";
try {
$conn = new PDO("mysql:host=$servername", $username, $password);
echo "connect success!";
}
catch(PDOException $e)
{
echo $e->getMessage();
}
?>
(3)测试新建数据库testDB
<?php
$servername = "mysql";
$username = "root";
$password = "123456";
try {
$conn = new PDO("mysql:host=$servername", $username, $password);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
echo "connect success";
$sql = "CREATE DATABASE testDB";
$conn->exec($sql);
echo "create database success";
}
catch(PDOException $e)
{
echo $sql . "<br>" . $e->getMessage();
}
$conn = null;
?>
进入MySQL所在容器查看是否创建成功
(4)测试新建表Book
<?php
$servername = "mysql";
$username = "root";
$password = "123456";
$dbname="testDB";
try {
$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password); #选择数据库
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// 使用 sql 创建数据表
$sql = "CREATE TABLE Book (
id INT(9) UNSIGNED PRIMARY KEY,
name VARCHAR(30) NOT NULL
)";
$conn->exec($sql);
echo "create table Book success";
}
catch(PDOException $e)
{
echo $sql . "<br>" . $e->getMessage();
}
$conn = null;
?>
(5)测试在表中插入数据
<?php
$servername = "mysql";
$username = "root";
$password = "123456";
$dbname="testDB";
try {
$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// 开始事务
$conn->beginTransaction();
// SQL 语句
$conn->exec("INSERT INTO Book (id,name)
VALUES (1001, 'java')");
$conn->exec("INSERT INTO Book (id,name)
VALUES (1002, 'python')");
$conn->exec("INSERT INTO Book (id,name)
VALUES (1003, 'network')");
// 提交事务
$conn->commit();
echo "insert success";
}
catch(PDOException $e)
{
// 如果执行失败回滚
$conn->rollback();
echo $sql . "<br>" . $e->getMessage();
}
$conn = null;
?>
(6)测试删除与修改数据
<?php
$servername = "mysql";
$username = "root";
$password = "123456";
$dbname="testDB";
try {
$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// 开始事务
$conn->beginTransaction();
// SQL UPDATE 语句
$conn->exec("UPDATE Book SET name='Clanguage' WHERE id=1003");
//SQL DELETE语句
$conn->exec("DELETE FROM Book where id=1001");
// 提交事务
$conn->commit();
echo "updata and delete success";
}
catch(PDOException $e)
{
// 如果执行失败回滚
$conn->rollback();
echo $sql . "<br>" . $e->getMessage();
}
$conn = null;
?>
5.选做
增加一个phpmyadmin容器,实现web端的数据库管理。
参考了博客
https://www.cnblogs.com/yin5th/p/9778685.html
只需要在原来的docker-compose.yml后面新增如下内容并且在新增一个建立phpmyadmin的Dockerfile
Dockerfile
FROM phpmyadmin/phpmyadmin:latest
然后在相应的目录下执行
docker-compose down
docker-compose up -d
查看以下重新执行完docker-compose的容器结构
接下来通过localhost的 9090端口即可访问phpmyadmin
可以看到我们在上个实验中新建的数据库testDB以及新建的表 Book
通过可视化的界面可以对后台数据库进行管理真的是非常的方便
碰到的问题
1.
在执行docker-compose up的时候卡在这里卡了好久。
尝试解决的办法:
参考了博客
https://www.cnblogs.com/PyKK2019/p/11062019.html
添加两行代码进行换源
RUN sed -i s@/archive.ubuntu.com/@/mirrors.aliyun.com/@g /etc/apt/sources.list
RUN apt-get clean
但我这里并没成功换源,下一次下载的时候还是官方的源,并不是阿里的源。。。。。。
但是第二天下载的时候速度却谜之快,也算解决了吧。。。。。
后来在群里看到别人由提到不同的换源方法,这里码一下,下次可以试试:
# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ buster main contrib non-free
# deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ buster main contrib non-free
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ buster-updates main contrib non-free
# deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ buster-updates main contrib non-free
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ buster-backports main contrib non-free
# deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ buster-backports main contrib non-free
deb https://mirrors.tuna.tsinghua.edu.cn/debian-security buster/updates main contrib non-free
# deb-src https://mirrors.tuna.tsinghua.edu.cn/debian-security buster/updates main contrib non-free
总结一哈
1.什么是docker-compose
这个问题在我开始做实验之前困扰了我很久。
后来我在B站上找到了这个视频教程,解释的简单明了,思路清晰,非常值得一看
https://www.bilibili.com/video/BV1Wt411w72h
这是一张比较简洁的原理图 ,可以帮助我们理解容器之间是怎样协同工作的 。
下面这张图就较为详细的展示了容器到宿主机,以及nginx如何充当反向代理的,对于我们理解docker-compose.yml文件该如何编写很有帮助。
简单来说,docker-compose是一个定义和运行docker多容器的工具。不需要我们再单独去创建一个个容器,可以一次通过yml文件创建并启动所有服务。
2.nginx的文件配置问题
这里还是还是参考了那位up对于nginx的 讲解(真是宝藏up
https://www.bilibili.com/video/BV1Bx411Z7Do
这里对于nginx匹配规则和负载均衡的讲解可以说对新人非常友好了
花费的时间
查阅资料+动手实验 +写博客大约用时9小时,比预计的久了一些