sayoko

导航

2020系统综合实验 第3次实践作业

一个最终的应用通常需要组装多个容器提供的多个服务。以web服务为例,需要完成web服务器、数据库、开发程序等服务的组装,典型的如LAMP(Linux+Apache+Mysql+PHP)或LNMP(Linux+Nginx+Mysql+PHP)。Docker compose是作为定义和运行多容器的工具,用户可以使用 YML 文件来配置应用程序需要的所有服务。本次作业需要各位实践Docker compose,各位可以在第二次实践作业的基础之上开展,要求如下:

(1)完成Docker-compose的安装

参考资料:Install Docker Compose

curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

(不是参考资料中的命令

sudo chmod +x /usr/local/bin/docker-compose

这个命令是将可执行权限应用于二进制文件

docker-compose --version

查看版本,确认安装成功。

(2)Dockerfile编写

要求:

  • LNMP/LAMP选择一种;
  • 分别构建web、php应用、数据库等镜像服务,php镜像亦有提供php:-apache的变体;
  • 提示:php连接数据库需要安装必要的核心扩展部件(PHP Core Extensions)安装方法可参考官方镜像介绍。
选择LNMP(linux,nginx,mysql,php)

各文件如下

default.conf
server {
    listen       8010;        #修改映射端口
    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$ {
        root           /home/docker-web/php;          #修改工作目录
        fastcgi_pass   sphp:9000;        #修改为容器名
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name; 
        include        fastcgi_params;
    }

}
dockerfile_nginx
FROM nginx
MAINTAINER sayoko
EXPOSE 8010
dockerfile_php
FROM php:7.4-fpm
MAINTAINER sayoko
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
dockerfile_mysql
FROM mysql
MAINTAINER sayoko
ENV MYSQL_ROOT_PASSWORD 123456
ENV MYSQL_ALLOW_EMPTY_PASSWORD no

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

docker-compose.yml
version: "3"

services:

 nginx:

image: snginx_image                #指定镜像名

container_name: snginx             #指定容器名

build:

  context: .

  dockerfile: dockerfile_nginx      #指定dockerfile文件

ports:

  - "80:8010"                       #修改端口映射

volumes:

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

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



 php:

image: sphp_image 

container_name: sphp 

build:

  context: .

  dockerfile: dockerfile_php 

environment:

  MYSQL_PASSWORD: 123456            #设置好环境变量,在php代码中使用变量名直接引用

volumes:

  - ./web:/home/docker-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: 

  - "8050:80" # phpmyadmin默认监听80

environment:



  PMA_HOST: mysql                     #指定mysql服务所在的host




(4)服务测试

要求和提示:

  • 包括但不限于测试数据库连接、数据库新建、表新建、表记录的插入修改和删除是否成功(pdo或mysqli均可);
  • 相关测试代码可直接参考PHP与MySQL的教程

修改index.php文件
连接成功:

创建数据库成功:

创建表成功:

插入数据成功:

修改数据成功:

删除数据成功:

(5)选做

  • 增加一个phpmyadmin容器,实现web端的数据库管理。
dokcerfile_phpmyadimin
FROM phpmyadmin/phpmyadmin           
MAINTAINER sayoko
EXPOSE 8050

打开8050口

(6)总结问题以及解决方法

Q:光荣的在第一步安装就出小问题了,用教程里的太慢了慢到卡掉

解决:使用了其他命令,成功完成安装。

Q:执行docker-compose build时候的错误,应该是php那里什么地方没写好(我忘记了)(因为改了好多好多好多次了)

解决:重新把每个文件重新认真检查了一下

Q:打开网页发现显示 SQLSTATE[HY000] [2002] No such file or directory

解决:

[这里](https://segmentfault.com/q/1010000007356940/a-1020000007367966 里这么说) 这么说

以及其实很多地方我都不懂,看别人博客都不知道为什么要这样的,去学习了很多比如容器挂载,mysql和php的连接,yml文件的书写规则,简单的了解了一下php语言,收获还是挺多的。总用时记不清了,因为中间有时候失败了就隔两天再重新继续做,但我估计应该是2个下午+1个晚上+1个早上(写博客)的时间。

还有就不知道为啥我下载东西(比如开头这个)就特别慢,执行docker-compose build命令的时候也特别特别特别慢,装东西慢然后我去干其他事情,回来就发现失败的事情发生了好多好多好多次。

希望下次作业能做的顺利(每次都祈祷)

posted on 2020-05-05 10:29  sayoko  阅读(261)  评论(0编辑  收藏  举报