到目前为止,已经安排了两次实践作业,通过前两次的实践作业,我们已经完成了docker的入门和单个容器服务的定制,这是一个很好的开始。现在我们更进一步。
一个最终的应用通常需要组装多个容器提供的多个服务。以web服务为例,需要完成web服务器、数据库、开发程序等服务的组装,典型的如LAMP(Linux+Apache+Mysql+PHP)或LNMP(Linux+Nginx+Mysql+PHP)。Docker compose是作为定义和运行多容器的工具,用户可以使用 YML 文件来配置应用程序需要的所有服务。本次作业需要各位实践Docker compose,各位可以在第二次实践作业的基础之上开展,要求如下:

(1)完成Docker-compose的安装

参考资料: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    #赋予权限
docker-compose --version                      #查看是否安装成功

(2)Dockerfile编写

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

搭建LNMP-nginx:latest、mysql:latest、php:7.4-fpm

基于前两次实验已经下载了前两个镜像,现只需下载php:7.4-fpm

sudo docker pull php:7.4-fpm

*在主目录下构建一下配置文件和目录(部分配置文件可以在第二次实验配置文件的基础上 用cp命令复制过去,在进行修改,工作量会减少哦)

编写配置文件

*dockerfile_nginx

#基于什么镜像
FROM nginx
#作者,联系方式
MAINTAINER ruinzly <1511490721@qq.com>

#COPY default.conf /etc/nginx/conf.d/
#COPY web/ /usr/share/nginx/myweb/

CMD ["nginx","-g","daemon off;"]
#暴露端口2506
EXPOSE 2506

*dockerfile_php

FROM php:7.4-fpm
MAINTAINER ruinzly

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 ruinzly
#配置环境变量
ENV USERNAME root                       #定义用户名称
ENV MYSQL_ALLOW_EMPTY_PASSWORD no       #设置不允许免密登录
ENV MYSQL_ROOT_PASSWORD 123456          #设置root下mysql登录密码

*default.conf

#nginx的配置文件
server {
    listen       2506;  #修改映射端口
    server_name  localhost;

    #charset koi8-r;
    #access_log  /var/log/nginx/host.access.log  main;


 server_name  localhost;      

    #charset koi8-r;
    #access_log  /var/log/nginx/host.access.log  main;

    location / {      
        root   /web/html;           #修改工作目录,访问自定义该目录下的文件(./web/html)            
        index index.html index.htm;
        autoindex on;
    }

    #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;
    }
location ~ \.php$ {
        root           /web/php;    ##修改工作目录,访问自定义该目录下的文件(./web/html)   
        fastcgi_pass   php:9000;   
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
      # include        fastcgi.conf;
     }
}

*docker-compose.yml

 php:
    image: compose_php:test
    container_name: compose_php
    build:
      context: .
      dockerfile: dockerfile_php
    environment:
      MYSQL_ROOT_PASSWORD: 123456
    volumes:
      - ./web:/web/php

 mysql:
    image: compose_sql:test
    container_name: compose_sql
    build:
      context: .
      dockerfile: dockerfile_mysql
    ports:
      - 3306:3306
      #   environment:
      # - MYSQL_ROOT_PASSWORD=123456        
    volumes:
      - ./data_mysql:/var/lib/mysql
  • index.html
Welcome,you are sucessfully visit static html!
  • index.php
<?php phpinfo();?>

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

编写compose文件,完成上述LNMP/LAMP的微服务组合部署。
参考资料:Get started with Docker Compose

开启docker-conpose

docker-compose up -d --build

(执行成功的样子)

查看镜像、正在运行的容器

docker images
docker ps

保证三个容器正常运行的前提下,火狐访问localhost/index.html和localhost/inden.php

4)服务测试

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

测试数据库连接

*修改index.php

<?php
$servername = "compose_sql";
$username = "root";
$password = "123456";

try {
    $conn = new PDO("mysql:host=$servername;", $username, $password);
    echo "恭喜你终于连接成功!";
}
catch(PDOException $e)
{
    echo $e->getMessage();
}
?>

*创建数据库myDBPDO

 <?php
$servername = "compose_sql";
$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 myDBPDO";

    // 使用 exec() ,因为没有结果返回
    $conn->exec($sql);

    echo "数据库创建成功<br>";
}
catch(PDOException $e)
{
    echo $sql . "<br>" . $e->getMessage();
}

$conn = null;

*进入容器查看是否真的生成了数据库

*创建表格Ruin_table_2,往里面插入数据

<?php
$servername = "compose_sql";
$username = "root";
$password = "123456";
$dbname = "myDBPDO";
try {
    $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
    // 设置 PDO 错误模式,用于抛出异常
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    // 使用 sql 创建数据表
    $sql = "CREATE TABLE Ruin_table_2 (
    id INT(10)  PRIMARY KEY,
    sex VARCHAR(20) NOT NULL,
    username VARCHAR(30) NOT NULL
    )";

    // 使用 exec() ,没有结果返回
    $conn->exec($sql);
    echo "数据表 Ruin_table_2 创建成功!";
}
catch(PDOException $e)
echo $sql . "<br>" . $e->getMessage();


try {
    $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
    // 设置 PDO 错误模式,用于抛出异常
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $sql = "INSERT INTO Ruin_table_2 (id, sex, username)
    VALUES (031702506, 'female', 'Zhong Luying')";
    // 使用 exec() ,没有结果返回
    $conn->exec($sql);
    echo "新记录插入成功!";
}
catch(PDOException $e)
{
    echo $sql . "<br>" . $e->getMessage();
}


$conn = null;

?>

*进入compose_sql查看是否生成表格Ruin_table和插入数据

#进入root权限
sudo su
mysql -u root -p
use myDBPDO;
show tables;
select * from Ruin_table_2;

*修改数据和删除数据
再插入一条数据

 <?php
$servername = "compose_sql";
$username = "root";
$password = "123456";
$dbname = "myDBPDO";

try {
    $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
    // 设置 PDO 错误模式,用于抛出异常
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $sql = "INSERT INTO Ruin_table_2 (id, sex, username)
    VALUES (031702504, 'female', 'LinRui')";
    // 使用 exec() ,没有结果返回
    $conn->exec($sql);
    echo "新记录插入成功!";
}
catch(PDOException $e)
{
    echo $sql . "<br>" . $e->getMessage();
}


$conn = null;

删除数据

做完记得docker-compose down

docker-compose down

(5)总结

途中遇到的问题

  • docker-compose up后查看容器nginx启动后立马关闭;
    解决方式:
    查看nginx的日志
docker log compose_nginx

查看完后发现相关的配置文件有错

  • 在访问localhost/index.php 出现file not found错误
    解决方式:
    查看cmpose_php日志
docker log compose_php

[error] 1507#0: *22 FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream, client: 10.0.0.1, server: www.wordpress.com, request: "GET /info.p

解决方式:修改php的配置文件参照该文

感想

这次实验大概花了24小时左右,中间因为滥用chmod导致很多文件的权限有问题,只能够恢复各种文件,重头来过。做的过程中有点不太顺利,因为不熟练造成的,但是做出来还是很开心的!

posted on 2020-05-07 01:20  ruinzly  阅读(297)  评论(0编辑  收藏  举报