第3次实践作业
(1)完成Docker-compose的安装
参考:https://www.runoob.com/docker/docker-compose.html
#下载 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
#测试是否安装成功:
$ docker-compose --version
(2)Dockerfile编写
docker安装php
参考:https://www.runoob.com/docker/docker-install-php.html
Dockerfile_nginx:
FROM nginx
MAINTAINER linrui <1215349235@qq.com>
EXPOSE 2504
nginx的default.conf
server {
listen 2504;
server_name localhost;
#charset koi8-r;
#access_log /var/log/nginx/host.access.log main;
location / {
root /usr/share/nginx/myweb; #nginx容器内web存放目录
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
location ~ \.php$ {
root /www; #php容器内代码文件存放目录
fastcgi_pass myphp:9000; #修改容器名
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
Dockerfile_php
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 \
Dockerfile_mysql
#基础镜像
FROM mysql:5.7
#作者信息
MAINTAINER linui <1215349235@qq.com>
#设置不可免密登录
ENV MYSQL_ALLOW_EMPTY_PASSWORD no
#定义用户名称
ENV USERNAME root
#设置root下mysql登录密码
ENV MYSQL_ROOT_PASSWORD=123456
Dockerfile_phpmyadmin
FROM phpmyadmin/phpmyadmin
LABEL author=linrui
EXPOSE 8085
(3)使用Compose实现多容器运行机制
构建一个项目目录
编写docker-compose.yml
version: "3"
services:
nginx:
image: mynginx #指定镜像名
container_name: myngin #指定容器名
build:
context: ./nginx #dockerfile文件所在目录
dockerfile: Dockerfile_nginx #指定dockerfile文件
ports:
- "8080:2504" #修改端口映射
volumes:
- ./html:/usr/share/nginx/myweb #挂载容器卷,本地/容器内修改文件后,另一方都会同步更新;
- ./nginx/default.conf:/etc/nginx/conf.d/default.conf #挂载配置文件
php:
image: php-fpm5.6/v2
container_name: myphp
build:
context: ./phpfpm
dockerfile: Dockerfile_php
environment:
MYSQL_PASSWORD: 123456 #设置好环境变量,在php代码中使用变量名直接引用
volumes:
- ./html:/www #挂载工作目录到本机web目录
mysql:
image: mysql_lr
container_name: mysql
build:
context: ./mysql
dockerfile: Dockerfile_mysql
ports:
- "3306:3306"
volumes:
- ./mysql/mysql_data:/var/lib/mysql #挂载容器卷,实现数据同步,防止数据丢失
phpmyadmin:
image: my-phpmyadmin
container_name: myadm
build:
context: .
dockerfile: Dockerfile_phpmyadmin
ports:
- "8085:80" # phpmyadmin默认监听80
environment:
PMA_HOST: mysql # 指定mysql服务所在的host
构建运行
docker-compose up -d --build #
(4)服务测试
1.nginx+php测试
浏览器访问localhost:8080/index.php(注意:如果修改了端口号要加上端口号,否则默认是80)
2.php+mysql测试
参考:https://www.runoob.com/php/php-mysql-connect.html
连接mysql
修改本地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();
}
?>
查看浏览器
创建数据库
<?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容器查看数据库是否创建成功
docker exec -it mysql /bin/bash
mysql -u root -p
show databases;
创建数据表
<?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;
?>
查看浏览器
mysql容器内查看
use myDBPDO
show tables;
插入数据
<?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 (031702504, 'LinRUI')");
$conn->exec("INSERT INTO Student (id,name)
VALUES (031702505, 'CHEN')");
$conn->exec("INSERT INTO Student (id,name)
VALUES (031702506, 'ZHONG')");
$conn->exec("INSERT INTO Student (id,name)
VALUES (031702507, 'Huang')");
// 提交事务
$conn->commit();
echo "新记录插入成功";
}
catch(PDOException $e)
{
// 如果执行失败回滚
$conn->rollback();
echo $sql . "<br>" . $e->getMessage();
}
$conn = null;
?>
访问浏览器
数据库查看
修改和删除数据
<?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 UPDATE 语句
$conn->exec("UPDATE Student SET name='LINR' WHERE id=031702504");
//SQL DELETE语句
$conn->exec("DELETE FROM Student where id=031702505");
// 提交事务
$conn->commit();
echo "修改,删除成功";
}
catch(PDOException $e)
{
// 如果执行失败回滚
$conn->rollback();
echo $sql . "<br>" . $e->getMessage();
}
$conn = null;
?>
查看浏览器
查看数据库
3.phpmyadmin测试
参考:https://blog.csdn.net/u012767761/article/details/78238487
地址栏输入localhost:8085/index.php进入主界面
创建数据库
输入数据库名,选择 “utf8_general_ci ”,点击创建
在左侧栏就可以看见你创建的数据库
修改数据库
点击database数据库,在“新建数据表”下面的文本框中输入数据表的名称以及字段数,然后点击“执行”按钮
在成功创建数据表之后,将显示数据表结构的界面,在该界面的表单中输入各个字段的详细信息
修改数据表
进入到数据表结构页面中,在这里可以通过改变数据表的结构来修改表
这里设置一个主键
删除数据表
点击数据表进入数据表结构页面中,右上角有一个“操作按钮”在“更多”里,点击进入操作页面,在右下角有一个“删除数据或者数据表”
(5)总结
实验花了大概17个小时,主要用在编写和修改配置文件,还有测试的时候遇到的一些麻烦
1.nginx+php测试的时候我在浏览器访问localhost/index.php出现连接失败,于是在配置文件中找了很久错误,最后觉得应该没什么问题了但是还是访问不了,但是访问localhost:8080可以看到html的网页,最后发现是端口问题,http默认访问的端口号是80,但是我修改成了8080,所以应该要访问localhost:8080/index.php
2.docker-compose up之后mysql容器总是开启之后一会自己退出,docker logs mysql查看容器日志发现错误如图
这个地方耗了特别久,查了百度上的方法都没有成功,而且在容器内安装vim的时候,容器无数次自动退出,比如安装到一半的时候退出了,不得不重新启动再安装,安装完修改配置文件的时候,改到一半还没保存就退出了......最后还是不太明白为什么会出现这种情况,我的解决方法是修改了上一次实验mysql的Dockerfile,然后重新构建,不知道上一次的Dockerfile哪里有问题