2020系统综合实践 第3次实践作业
1.完成Docker-compose的安装
- 下载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
- 创建指向/usr/bin目录的符号链接
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
- 测试安装
docker-compose --version
2.Dockerfile编写
要求:
LNMP/LAMP选择一种;
分别构建web、php应用、数据库等镜像服务,php镜像亦有提供php:
提示:php连接数据库需要安装必要的核心扩展部件(PHP Core Extensions)安装方法可参考官方镜像介绍。
-
各文件的编写
-
目录结构
dockerfile_phpmyadmin是选做的
mysql文件夹用于存放mysql所需的一些文件 -
dockerfile_nginx
#基础镜像 FROM nginx #作者信息 MAINTAINER lyh<471727250@qq.com> #声明暴露的端口 EXPOSE 2020
-
dockerfile_mysql
#基础镜像 FROM mysql #作者信息 MAINTAINER lyh<471727250@qq.com> #设置root密码 ENV MYSQL_ROOT_PASSWORD 123456 #设置不可免密登录 ENV MYSQL_ALLOW_EMPTY_PASSWORD no
-
dockerfile_php
#基础镜像 FROM php:7.4-fpm #作者信息 MAINTAINER lyh<471727250@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
it's a html
-
index.php
<?php phpinfo();?>
-
default.conf
server { listen 2020; #修改映射端口 server_name localhost; location / { root /lyh/html; #修改工作目录 index index.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } location ~ \.php$ { root /lyh/php; #修改工作目录 fastcgi_pass myphp:9000; #修改为容器名 fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } }
-
docker-compose.yml
version: "3" services: nginx: image: mynginx_image #指定镜像名 container_name: mynginx #指定容器名 build: context: . dockerfile: dockerfile_nginx #指定dockerfile文件 ports: - "80:2020" #修改端口映射 volumes: - ./web:/lyh/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 volumes: - ./web:/lyh/php mysql: image: mysql_image container_name: mysql build: context: . dockerfile: dockerfile_mysql ports: - "3306:3306" volumes: - ./mysql_data:/var/lib/mysql
-
3.使用Compose实现多容器运行机制
- 运行docker-compose
sudo docker-compose up -d --build
成功 - 查看容器和镜像
- 访问
localhost/index.html
localhost/index.php
4.服务测试
-
参考教程PHP 连接 MySQL
-
连接测试
修改、./web/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(); }
-
创建数据库
下面的代码创建一个名为lyh_test的数据库<?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 lyh_test"; // 使用 exec() ,因为没有结果返回 $conn->exec($sql); echo "数据库创建成功<br>"; } catch(PDOException $e) { echo $sql . "<br>" . $e->getMessage(); } $conn = null; ?>
sudo docker exec -it mysql /bin/bash
mysql -u root -p
show databases;
-
创建数据表
<?php $servername = "mysql"; $username = "root"; $password = "123456"; $dbname="lyh_test"; try { $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password); // 设置 PDO 错误模式,用于抛出异常 $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // 使用 sql 创建数据表 $sql = "CREATE TABLE user ( id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY, firstname VARCHAR(30) NOT NULL, lastname VARCHAR(30) NOT NULL, email VARCHAR(50), reg_date TIMESTAMP )"; // 使用 exec() ,没有结果返回 $conn->exec($sql); echo "数据表 user 创建成功"; } catch(PDOException $e) { echo $sql . "<br>" . $e->getMessage(); } $conn = null; ?>
use lyh_test
show tables
-
向数据表插入数据
<?php $servername = "mysql"; $username = "root"; $password = "123456"; $dbname="lyh_test"; 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 user (firstname, lastname, email) VALUES ('Yuhao', 'Lin', 'john@example.com')"); $conn->exec("INSERT INTO user (firstname, lastname) VALUES ('Jiayi', 'Zhao')"); // 提交事务 $conn->commit(); echo "新记录插入成功"; } catch(PDOException $e) { // 如果执行失败回滚 $conn->rollback(); echo $sql . "<br>" . $e->getMessage(); } $conn = null; ?>
select * from user
-
删除数据
只需要将上面的sql语句改为$conn->exec("UPDATE user SET lastname='lin' WHERE lastname='Lin'"); $conn->exec("DELETE FROM user where lastname='Zhao'");
select * from user
5.选做
增加一个phpmyadmin容器,实现web端的数据库管理。
-
在docker-compose.yml文件中增加
phpmyadmin: image: myphpmyadmin_image container_name: myphpmyadmin build: context: . dockerfile: dockerfile_phpmyadmin ports: - "8080:80" # phpmyadmin默认监听80 environment: PMA_HOST: mysql #指定mysql服务所在的host
-
dockerfile_phpmyadmin
#基础镜像 FROM phpmyadmin/phpmyadmin #作者信息 MAINTAINER lyh<471727250@qq.com> #声明暴露的端口 EXPOSE 8080
-
用浏览器访问
http://localhost:8080/
此处的端口由yml文件中给出,使用root账户登录
-
既可以使用sql语句操作数据库,也能够通过鼠标来操作,感觉跟navigate差不多
6.实验过程中遇到的问题
- 使用tree时
显示被占用
删除后仍然出错
按照提示操作也出错
最后按照网上查到的方法
sudo rm /var/lib/dpkg/updates/*
sudo apt-get update
sudo apt-get upgrade
成功解决 - 目录配置
由于个人的粗心大意,在按照教程操作时,会漏掉一些需要自己手动配置的路径等,然后通过浏览器访问的时候一直报404
这里记录一下需要个人配置的目录- default.conf
- docker-compose.yml
千万千万注意仔细检查目录是否与本机文件存储路径匹配(血泪
- default.conf
7.小结
做完了发现其实真的不难,难的主要是需要自己去上网搜索一些资料进行参照的学习,很多配置需要在自己理解的基础上进行修改,而且还要比较细心,因为粗心有的代码没有写对我浪费了好多时间,感觉我也太蠢了。 好在网上能查到的资料不少,而且在我之前已经有几位大佬做完了,给我提供了很多思路,非常感谢。
每周小技巧(假
- ubuntu虚拟机不支持一次性粘贴太多从windows上复制的文本,在windows先创建文本,再拖到ubuntu中
时间统计
- 查资料3小时
- 动手3小时
- 写博客1小时
- 合计7小时左右