第3次系统综合实践
安装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
Dockerfile编写(LNMP)
目录结构
nginx Dockerfile
#first apache test #FROM httpd:latest FROM nginx:latest LABEL Author=kingbob DATE=2020.4.18 #ENV mypath /kb/nginx #WORKDIR $mypath #COPY default.conf /etc/nginx/conf.d #COPY index.html /kb/nginx EXPOSE 7799 #CMD ["/bin/bash"] #ENTRYPOINT ["zhi_ling","can_shu","xiangmu_wenjian"]
- php Dockerfile
FROM php:7.4-fpm LABEL Author=kingbob DATE=2020.5.2 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
- mysql Dockerfile
FROM mysql:5.7 LABEL maintainer=kingbob DATE=2020.4.22 #设置密码登录 ENV MYSQL_ROOT_PASSWORD=123456 ENV MYSQL_ALLOW_EMPtY_PASSWORD no #设置免密登录 #ENV MYSQL_ALLOW_EMPTY_PASSWORD yes #将所需文件放到容器中 #COPY setup.sh /mysql/setup.sh #COPY schema.sql /mysql/schema.sql #COPY privileges.sql /mysql/privileges.sql #设置容器启动时执行的命令 #CMD ["sh", "/mysql/setup.sh"]
- docker-compose.yml
version: ‘3‘ services: nginx: image: kbnginx_image #镜像名 container_name: kbnginx #容器名 build: context: ./web_nginx #工作路径 dockerfile: df_nginx #指定dockerfile文件 ports: - "10010:7799" #暴露端口 volumes: - ./web:/kb/nginx #磁盘映射,与default.conf中定义的一致,本地/容器内修改文件后,另一方都会同步更新 - ./web_nginx/conf/default.conf:/etc/nginx/conf.d/default.conf #挂载配置文件 php: image: kbphp_image container_name: kbphp build: context: ./web_php dockerfile: df_php environment: MYSQL_PASSWORD: 123456 #设置好环境变量,在php代码中使用变量名直接引用 volumes: - ./web:/kb/php mysql: image: kbsql_image container_name: mysql build: context: ./mysql dockerfile: df_mysql ports: - "3306:3306" volumes: - ./mysql/data:/var/lib/mysql
- default.conf
server { listen 7799;#监听端口 server_name localhost; #charset koi8-r; #access_log /var/log/nginx/host.access.log main; location / { # root /usr/share/nginx/html; root /kb/nginx; #与Docker-compose里的路径相同,定义服务器的默认网站根目录位置 index index.html index.htm;#定义首页索引文件名称 } #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 /usr/share/nginx/html; } # proxy the PHP scripts to Apache listening on 127.0.0.1:80 # #location ~ \.php$ { # proxy_pass http://127.0.0.1; #} # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 # location ~ \.php$ { root /kb/php; #与Docker-compose里的路径相同 fastcgi_pass kbphp:9000; #与Docker-compose里的容器名相同 fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } # deny access to .htaccess files, if Apache‘s document root # concurs with nginx‘s one # #location ~ /\.ht { # deny all; #} }
- index.php
- index.html
hello world!
使用Compose实现多容器运行机制
目录
运行docker-compose
sudo docker-compose up -d --build
- 关闭docker-compose的容器
sudo docker-compose down
查看容器及镜像
浏览器查看
服务测试
这里使用PDO连接mysql
连接,修改index.php
<?php $servername = "mysql";//dockercompose里的mysql容器名 $username = "root"; $password = "123456";//密码也可以直接使用dockercompose中的变量名 try { $conn = new PDO("mysql:host=$servername", $username, $password); echo "连接成功"; } catch(PDOException $e) { echo "faild:"; echo $e->getMessage(); } ?>
- 数据库创建
<?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 db_test"; // 使用 exec() ,因为没有结果返回 $conn->exec($sql); echo "数据库创建成功<br>"; } catch(PDOException $e) { echo $sql . "<br>" . $e->getMessage(); } $conn = null; ?>
- 创建表
<?php $servername = "mysql"; $username = "root"; $password = "123456"; $dbname="db_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; ?>
- 插入数据
<?php $servername = "mysql"; $username = "root"; $password = "123456"; $dbname="db_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 (‘bao‘, ‘zihan‘, ‘‘)"); $conn->exec("INSERT INTO user (firstname, lastname) VALUES (‘king‘, ‘bob‘)"); // 提交事务 $conn->commit(); echo "新记录插入成功"; } catch(PDOException $e) { // 如果执行失败回滚 $conn->rollback(); echo $sql . "<br>" . $e->getMessage(); } $conn = null; ?>
- 删除/修改数据
<?php $servername = "mysql"; $username = "root"; $password = "123456"; $dbname="db_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("UPDATE user SET lastname=‘kb‘ WHERE lastname=‘bob‘"); $conn->exec("DELETE FROM user where firstname=‘bao‘"); // 提交事务 $conn->commit(); echo "新记录!"; } catch(PDOException $e) { // 如果执行失败回滚 $conn->rollback(); echo $sql . "<br>" . $e->getMessage(); } $conn = null; ?>
选做
增加一个phpmyadmin容器,实现web端的数据库管理
- docker-compose.yml文件中添加
phpmyadmin: image: kbphp_image container_name: kbphpmyadmin build: context: ./web_phpmyadmin dockerfile: df_phpmyadmin ports: - "8080:80" # phpmyadmin默认监听80 environment: PMA_HOST: mysql #指定mysql服务所在的host
- 新增df_phpmyadmin的Dockerfile
#基础镜像 FROM phpmyadmin/phpmyadmin #作者信息 MAINTAINER kingbob #声明暴露的端口 EXPOSE 8080
运行docker-compose,完成
用浏览器访问localhost:8080
root登录
查看表
插入
删除修改只要在这个页面上点编辑和删除即可
问题
不得不说,这次问题还是有点多的,有些坑踩进去好久才跳出来
一开始就是各种配置文件的问题了,各个参数一定要对应上,像上述的yml文件和default.conf的端口还有目录的对应关系,上面已经提及
然后就是可以成功运行docker-compose以后死活在浏览器上进入端口看不到结果,从上午整到中午,搜了无数个网页,还是没查出啥问题,然后偶然用docker ps看容器时发现nginx和mysql没有出现在运行容器之列,然后尝试强行把nginx启动也没有办法启动,接着下午又开始尝试各种办法让nginx可以启动,在试了各种方法且检查了各种配置依旧没有结果后,去看了下其他人安装,按照他们的安装目录,我把index.html和index.php这两个文件单独放在一个文件夹下,再次运行,这时候终于。。nginx的容器启动了
接下来再去浏览器上查阅index.html和index.php的时候死活连接不上,根本没法显示文件里的信息,接着又是一顿操作,第二天,在进行无数次的搜索后,终于在一个论坛上发现了一个人说的一句话“localhost不是在默认端口上要加上自己配置的端口号才能访问编制的文件”,修改了端口号终于能正确访问。
还有就是在进行docker-compose down时出现了关闭错误,然后强制关闭容器也没办法关闭,后来看了网上的方法后才得以关闭
这个问题是docker-compose里的格式问题,编写docker-compose尽量不要用tab键对齐,要不然容易出现这种错误
接下来就是在连接数据库的时候出现始终没办法连接上数据库的错误,在无数次检查了自己配置文件还有配置密码都没有问题后,也问了群里的一些同学还是没有结果,耗时将近一天经历无数次崩溃,最后,虚拟机死机了,然后重启虚拟机,再次访问,连接成功了。。它就这样成功了。。
小结
这次作业的心路历程真的复杂,很多意想不到的坑,果然人生总要经历大起大落落落落落落落,不过还是学到很多东西,也感谢前面的大佬提供的方法,让我更快从坑里爬起来