第三次实践作业
一.完成Docker-compose的安装
-
下载Docker Compose的当前稳定版本
sudo curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
-
将可执行权限应用于二进制文件
sudo chmod +x /usr/local/bin/docker-compose
-
创建指向/usr/bin目录的符号链接
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
-
测试安装
docker-compose --version
二.Dockerfile编写
要求:
- LNMP/LAMP选择一种;
- 分别构建web、php应用、数据库等镜像服务,php镜像亦有提供php:-apache的变体;
- 提示:php连接数据库需要安装必要的核心扩展部件(PHP Core Extensions)安装方法可参考官方镜像介绍。
1.前期工作
建立docker_compose文件夹;在docker_compose文件夹里分别建立web文件夹作为nginx,php的工作目录和挂载容器卷的目录,建立mysql_data作为mysql挂载容器卷的目录,建好的文件目录如下:
2.编写dockerfile
-
dockerfile_nginx
#基础镜像 FROM nginx #作者信息 MAINTAINER weng<669765291@qq.com> #声明暴露的端口 EXPOSE 2020
-
dockerfile_mysql
#基础镜像 FROM mysql #作者信息 MAINTAINER weng<669765291@qq.com> #设置root密码 ENV MYSQL_ROOT_PASSWORD 123456 #设置不可免密登录 ENV MYSQL_ALLOW_EMPTY_PASSWORD no
-
dockerfile_php
#基础镜像 FROM php:7.4-fpm #作者信息 MAINTAINER weng<669765291@qq.com> FROM php:7.4-fpm 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
-
index.html
hahahahaha!!!
-
index.php
<?php phpinfo();?>
三.使用Compose实现多容器运行机制
1.修改配置文件
将配置文件default.conf从运行的nginx容器中复制到本机
-
首先运行一个nginx容器
docker run -it nginx /bin/bash
-
查看正在运行的容器
docker ps -a
-
复制配置文件
docker cp 4da6c0756043:/etc/nginx/conf.d/default.conf .
-
可以在当前目录下看到default.conf这个文件
修改配置文件
-
default.conf
修改server部分
server { listen 2020; #修改映射端口 server_name localhost; #charset koi8-r; #access_log /var/log/nginx/host.access.log main; location / { root /web/html; #修改工作目录 index index.html index.htm; }
修改配置文件中PHP部分,注意将其原先每行前的注释符号“#”去掉
location ~ \.php$ { root /web/php; #修改工作目录 fastcgi_pass myphp:9000; #修改为容器名 fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; # 修改为$document_root include fastcgi_params; }
2.编写dockerfile-compose.yml文件
version: "3"
services:
nginx:
image: mynginx_image #指定镜像名
container_name: mynginx #指定容器名
build:
context: .
dockerfile: dockerfile_nginx #指定dockerfile文件
ports:
- "80:2020" #修改端口映射
volumes:
- ./web:/web/html #挂载容器卷,本地/容器内修改文件后,另一方都会同步更新;
- ./default.conf:/etc/nginx/conf.d/default.conf #挂载配置文件
php:
image: myphp_image
container_name: myphp
build:
context: .
dockerfile: dockerfile_php
environment:
MYSQL_PASSWORD: 123456 #设置好环境变量,在php代码中使用变量名直接引用
volumes:
- ./web:/web/php #挂载工作目录到本机web目录
mysql:
image: mysql_image
container_name: mysql
build:
context: .
dockerfile: dockerfile_mysql
ports:
- "3306:3306"
volumes:
- ./mysql_data:/var/lib/mysql #挂载容器卷,实现数据同步,防止数据丢失
phpmyadmin:
image: myphpmyadmin_image
container_name: myphpmyadmin
build:
context: .
dockerfile: dockerfile_phpmyadmin
ports:
- "8080:80" # phpmyadmin默认监听80
environment:
PMA_HOST: mysql #指定mysql服务所在的host
3.执行与检验
(1)查看docker_compose文件夹的树状结构
(2)执行docker-compose文件
docker-compose up -d --build
(3)查看镜像和容器
docker images
docker ps -a
(4)访问localhost/index.html(或者localhost:80)和localhost/index.php
四.服务测试
1.检测PHP是否能够成功连接Mysql数据库,参考菜鸟教程
修改宿主机~/docker_compose/web目录下的index.php文件
<?php
$servername = "mysql"; #注意这里要用自己自定义的Mysql的容器名
$username = "root";
$password = "123456"; #密码也可以直接使用yml中的变量名
try {
$conn = new PDO("mysql:host=$servername", $username, $password);
echo "连接成功";
}
catch(PDOException $e)
{
echo $e->getMessage();
}
访问localhost/index.php
2.在index.php文件中创建数据库,参考菜鸟教程
<?php
$servername = "mysql";
$username = "root";
$password = "123456";
try {
$conn = new PDO("mysql:host=$servername", $username, $password);
echo "连接成功";
$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;
?>
进入mysql容器,利用root身份进入数据库,查询数据库可以发现已经创建了 myDBPDO数据库
sudo docker exec -it mysql /bin/bash
mysql -u root -p
show databases;
3.在myDBPDO数据库中创建Student表,参考菜鸟教程
<?php
$servername = "mysql";
$username = "root";
$password = "123456";
$dbname="myDBPDO"; #变量设置
try {
$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password); #选择数据库
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// 使用 sql 创建数据表
$sql = "CREATE TABLE Student (
id INT(9) UNSIGNED PRIMARY KEY,
name VARCHAR(30) NOT NULL
)";
// 使用 exec() ,没有结果返回
$conn->exec($sql);
echo "数据表 Student 创建成功";
}
catch(PDOException $e)
{
echo $sql . "<br>" . $e->getMessage();
}
$conn = null;
?>
访问localhost/index.php
在mysql容器中,选中myDBPDO数据库,先后两次查看table
use myDBPDO
show tables;
4.向表中插入数据,参考菜鸟教程
<?php
$servername = "mysql";
$username = "root";
$password = "123456";
$dbname="myDBPDO";
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 Student (id,name)
VALUES (031702336, 'Lin TongXue')");
$conn->exec("INSERT INTO Student (id,name)
VALUES (031702340, 'zhang Tongxue')");
$conn->exec("INSERT INTO Student (id,name)
VALUES (031702341, 'Huang Tongxue')");
// 提交事务
$conn->commit();
echo "新记录插入成功";
}
catch(PDOException $e)
{
// 如果执行失败回滚
$conn->rollback();
echo $sql . "<br>" . $e->getMessage();
}
$conn = null;
?>
去数据库中查询
select * from Student
五.增加一个phpmyadmin容器,实现web端的数据库管理
1.访问localhost:8080/index.php;端口号跟yml文件中映射一致
2.在这里可以看到所有的Database,选择myDBPDO数据库
3.选择Student表,进入后可以看到表里的数据
六.问题与总结
在参考了几个很早就做完的大神的博客下,实验过程很顺利。在此要特别提一下这位大神:“Monster--”,博客确实写的很好,我就是照着他的一步步做下来的,基本没出现什么问题,通用性很强。
-
遇到的一个问题是在执行docker-compose文件时,输入
docker-compose up -d --build
,结果在执行过程中遇到如下错误:一开始不知道错在哪,后来在仔细查看了报错信息后,发现是容器名已经被使用了。在dockers-compose文件中修改了容器名后再次执行就可以了。
-
花费的时间:大概做了六七个小时吧。昨天晚上做了两三个小时后卡住了,就直接跑去睡觉,睡到三点半醒了,洗漱一下,做到七点就做完了。早上的好处就是注意力比较集中,精神好。