第3次实践作业

1、完成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 //更改文件权限,让用户可读可写可执行

sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose //添加软连接,有的时候这步不做也可以

done!

2、Dockerfile编写

  • mkdir docker-compose

  • 在docker-compose目录下新建这些文件

  • dockerfile-nginx

FROM nginx
MAINTAINER lzh
EXPOSE 3000
  • dockerfile-php
FROM php:7.4-fpm
MAINTAINER lzh
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 \            //pdo,用来连接数据库
    && docker-php-ext-configure gd --with-freetype --with-jpeg \
    && docker-php-ext-install -j$(nproc) gd
  • dockerfile-mysql
FROM mysql:5.7
MAINTAINER lzh
ENV MYSQL_ROOT_PASSWORD admin
ENV MYSQL_ALLOW_EMPTY_PASSWORD no
  • default.conf(nginx的配置文件)
    server {
    listen       3000;      //   暴露端口  
    server_name  localhost;

    location / {
        root   /home/docker-web/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文件位置
        root           /home/docker-web/php;         //php工作目录 
        fastcgi_pass   container_php:9000;           //这个好像是因为nginx本身不处理php,所以要借用fastcgi接口和php容器连接,让php处理,二者通过端口9000用tcp/ip协议通信 
        fastcgi_index  index.php;                  
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name; 
        include        fastcgi_params;
    }

}
  • web文件夹和mysql_data文件夹
用来和容器中的目录关联,web是用来更改php来实现远程操纵数据库,mysql_data相当于在本机做个备份

3、使用Compose实现多容器运行机制

  • compose文件编写
version: "3"

services:

 nginx:

  image: image_nginx                #指定镜像名

  container_name: container_nginx             #指定容器名

  build:

   context: .

   dockerfile: dockerfile-nginx      #指定dockerfile文件

  ports:

   - "8080:3000"                       #端口映射,要和dockerfile中的对应

  volumes:

   - ./web:/home/docker-web/html                 #挂载容器卷,本地/容器内修改文件后,另一方都会同步更新;

   - ./default.conf:/etc/nginx/conf.d/default.conf     #挂载配置文件



 php:

  image: image_php 

  container_name: container_php 

  build:

   context: .

   dockerfile: dockerfile-php 

  environment:

   MYSQL_PASSWORD: admin            #环境变量,mysql的密码为admin

  volumes:

   - ./web:/home/docker-web/php                  #挂载工作目录到本机web目录


 mysql:

  image: image_mysql 

  container_name: container_mysql

  build:

   context: .

   dockerfile: dockerfile-mysql

  ports:

   - "3306:3306"

  volumes:

    - ./mysql_data:/var/lib/mysql       #挂载容器卷,实现数据同步,防止数据丢失
     
  • sudo docker compose up -d --build

    这一步的话建议先把所有的镜像都pull到位,这样就会比较快,在安装的时候可能会遇到问题,比如如果虚拟机上已经有apache或者某个代理网站服务器占用了80端口,而在之前的compose里面又将nginx映射到80端口,那就有可能会报错如下:

    这个只需要到compose下把nginx里面的port改一下就好了,看到如下信息就代表启动成功了。

    验证的话,可以在之前的web文件夹下创建一个index.html,随便写点东西,然后再用浏览器访问127.0.0.1:8080(如果是80端口的话就不用指明端口号了),就可以看到如下结果:

    然后是,要访问的如果不是index.html,就需要指明文件的具体名,再新建一个php,随便写点东西进去,访问结果如下:

4、服务测试

  • 前言
    在做这一步的时候,因为我没有php和pdo的任何相关知识,导致我的截图里面的代码,在错误返回这一块是有问题的,因为我没有为我的游标pdo设置错误模块的属性,所以其实起不到检测错误的效果,所以截图的时候我是一边看着数据库,一边写php,后面虽然改了过来,但是...这个值得记录的错误难道就不要了吗我是真的不想重新再码一遍了,球球了,所以我保留了错误的截图,并且会在图里面指明写错的地方。
  • 数据库连接
  • 数据库创建

在数据库中验证数据库lzh_mysql是否被创建

  • 表的创建

    在数据库中验证表Student是否有被创建
  • 数据的插入

    再做一次插入,用来做对比
  • 数据的更新
  • 数据的删除

5、增加一个phpmyadmin容器,实现web端的数据库管理

  • 在compose里添加一下代码
 phpmyadmin:

  image: image_phpmyadmin

  container_name: container_phpmyadmin

  build: 

   context: .

   dockerfile: dockerfile-phpmyadmin

  ports: 

   - "8050:80"             //这里要用80,因为这个容器服务监听的是80端口,不管dockerfile中expose了什么,这里都要写80,如果一定要改监听端口的话可能需要修改配置文件。
  
environment:

   PMA_HOST: mysql
  • 再创建一个dockerfile-phpmyadmin
FROM phpmyadmin/phpmyadmin           
MAINTAINER lzh
EXPOSE 8050
  • 重新up一下compose

    就可以在网页端管理了

6、总结

实验的主要问题就在于对pdo不了解,之前没有接触过。在错误控制这一块栽了大跟头,明明只需要添加一个模块,但却足足花了一下午的时间去排。时间的话,不知道怎么算,毕竟很早就开始观望了,但是迟迟没有自己下手,就是想少走点弯路,结果总想要去把别人代码删掉一些,导致花了不少时间。经验的话...平常多学点东西,用起来就不会这么不熟练。按照完整时间块来算的话,是一个晚上(完成实验过程4小时)+一下午(修改代码找问题3小时+写博客1小时)。

posted @ 2020-05-08 16:28  031702627李至恒  阅读(177)  评论(0编辑  收藏  举报