2020系统综合实践 第3次实践作业
一 完成Docker-compose的安装
-
下载Docker Compose的当前稳定版本
sudo curl -L --fail https://github.com/docker/compose/releases/download/1.25.5/run.sh -o /usr/local/bin/docker-compose
-
将可执行权限应用于二进制文件
sudo chmod +x /usr/local/bin/docker-compose
-
创建指向/usr/bin目录的符号链接
ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
-
测试安装
docker-compose --version
二 Dockerfile编写
-
文件结构
-
index.html
ok
-
index.php
<?php phpinfo();?>
-
mysql文件夹的dockerfile
#基础镜像
FROM mysql:5.7
#镜像作者
MAINTAINER t
#设置不允许免密登录并设置root密码
ENV MYSQL_ALLOW_EMPTY_PASSWORD no
ENV MYSQL_ROOT_PASSWORD=123456
- default.conf
server {
listen 2223; #修改映射端口
server_name localhost;
location / {
root /www/html; # 定义服务器的默认网站根目录位置,自动生成,注意这是容器的目录,不是主机的目录
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html; # 定义错误提示页面
location = /50x.html {
root /usr/share/nginx/html;
}
location ~ \.php$ { # 通过PHP脚本到127.0.0.1:9000的FastCGI服务器监听
root /www/html; # 定义服务器的默认网站根目录位置,自动生成
fastcgi_pass php:9000; # 修改php服务器端口
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;# 修改为$document_root
include fastcgi_params;
}
}
- nginx的dockerfile
#基础镜像
FROM nginx:latest
#镜像作者
MAINTAINER t
#暴露端口
EXPOSE 2223
- php文件夹的dockerfile
# 基础镜像
FROM php:7.4-fpm
# 镜像作者
MAINTAINER t
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
三 使用Compose实现多容器运行机制
- docker-compose.yml的编写
version: "3"
services:
# nginx服务
nginx:
image: nginx_image # 镜像名
container_name: nginx_container # 容器名
build: ./nginx
ports:
- "80:2223" # 暴露端口
volumes:
- ./html:/www/html # 将主机当前目录的上级html目录,挂载到容器的/zzq/html目录
- ./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:
- ./html:/www/html
# mysql服务
mysql:
image: mysql_image
container_name: mysql_container
build: ./mysql
ports:
- "3306:3306"
volumes:
- ./mysql/data:/var/lib/mysql
-
运行docker-compose
sudo docker-compose up -d --build
-
查看容器
-
访问index.html和index.php
四 服务测试
4.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();
}
?>
- 访问index.php
4.2 创建数据库
- 修改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 dockerComposeDB"; //修改数据库名
// 使用 exec() ,因为没有结果返回
$conn->exec($sql);
echo "数据库创建成功<br>";
}
catch(PDOException $e)
{
echo $sql . "<br>" . $e->getMessage();
}
$conn = null;
?>
-
访问index.php
-
进入容器查看数据库是否创建完成
4.3 创建表
- 修改index.php
<?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_list(
id int(4) not null primary key,
name varchar(16) not null
)";
// 使用 exec() ,没有结果返回
$conn->exec($sql);
echo "数据表 student_list 创建成功";
}
catch(PDOException $e)
{
echo $sql . "<br>" . $e->getMessage();
}
$conn = null;
?>
- 访问index.php
4.4 插入数据
- 修改index.php
<?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_list (id,name)
VALUES ('1','ruanruan')");
$conn->exec("INSERT INTO student_list (id,name)
VALUES ('2','alian')");
$conn->exec("INSERT INTO student_list (id,name)
VALUES ('3','xiaomian')");
$conn->exec("INSERT INTO student_list (id,name)
VALUES ('4','taotao')");
// 提交事务
$conn->commit();
echo "插入学生数据成功";
}
catch(PDOException $e)
{
$conn->rollback();
echo $sql . "<br>" . $e->getMessage();
}
$conn = null;
?>
-
访问index.php
-
进入容器查看插入是否成功
4.5 修改数据
- 修改index.php
<?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_list SET name='xiaolei' WHERE id='1'");
// 提交事务
$conn->commit();
echo "修改数据成功";
}
catch(PDOException $e)
{
$conn->rollback();
echo $sql . "<br>" . $e->getMessage();
}
$conn = null;
?>
-
访问index.php
-
进入容器查看
4.6 删除数据
- index.php的修改
<?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_list WHERE id <3");
// 提交事务
$conn->commit();
echo "删除数据成功";
}
catch(PDOException $e)
{
$conn->rollback();
echo $sql . "<br>" . $e->getMessage();
}
$conn = null;
?>
- 进入容器查看
五 增加一个phpmyadmin容器,实现web端的数据库管理
- 修改phpmyadmin中的dockerfile
#基础镜像
FROM phpmyadmin/phpmyadmin
#维护者信息
MAINTAINER t
#暴露端口
EXPOSE 8080
- 在docker-compose.yml的末尾添加如下语句
phpmyadmin:
image: phpmyadmin_image
container_name: myphpmyadmin_container
build: ./phpmyadmin
ports:
- "8080:80"
environment:
PMA_HOST: mysql
- 访问网址localhost:8080,如图,可任意进行插入,修改,删除等操作。
六 总结
- 遇到的困难
1,dockerfile的编写步骤中要处理的文件很多,大概卡了两个小时运行docker-compose时一直error,后来翻到河马同学的博客,决定修改文件的结构让它更清晰,一番折腾终于看见了三个done。还好有快照,省了很多时间。
2,每次安装东西总会出现锁,解决方法:用收藏夹中的四五个方法轮番试验,杀死占用资源的进程。 - 花费的时间
四个半小时。