zoukankan      html  css  js  c++  java
  • 2020系统综合实践 第2次实践作业

    Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。
    基本结构:一般分为四部分,基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。

    (1) 实现一个自定义的web容器服务

    推荐apache或nginx,要求标明镜像作者信息,安装必要的工具以方便维护;设定你自己的web存放目录,安全起见,请将默认的监听端口80更改为你自定义的端口,并且声明暴露的端口,容器启动时,能直接进入web代码的存放目录。
    首先我们查看一下本地拥有的镜像
    sudo docker images

    下载nginx镜像
    sudo docker pull nginx

    再次查看镜像以验证nginx是否下载成功
    sudo docker images

    启动nginx容器并查看其配置信息

    sudo docker run --name nginx-test -p 8080:80 -d nginx
    sudo docker exec -it [容器id] /bin/bash
    cd /etc/nginx/conf.d
    cat default.conf
    

    得到default.conf的内容

    在主目录中创建web文件夹并在该文件下创建文件,直接把终端里显示的内容复制到新文件中,命名为default.conf,修改配置文件监听端口为7777和根目录为/home/qinhonghao/web

    在同一目录下创建dockerfile文件:

    在同一目录创建自己的html文件:

    打开dockerfile文件存放目录并构建镜像:

    cd /home/qinhonghao/web
    sudo docker build -t nginx_webtest .
    

    要注意,nginx_webtest是所要构建镜像的名称,.表示上下文,千万不能漏掉,否则会错误。
    验证查看nginx_webtest是否构建成功:
    sudo docker images

    可以看到,nginx_webtest已经构建成功。
    运行nginx_webtest容器:
    sudo docker run --name nginx_webtest -d -p 8080:7777 nginx_webtest

    查看localhost:8080的显示

    (2) 实现一个自定义的数据库容器服务

    可选择Mysql,Mariadb等,要求标明镜像作者信息,为了方便维护,需要能够查看容器内的配置信息,包括但不限于网络、应用配置文件等。在环境变量中设置好数据库的root密码且不允许空密码登录,创建一个测试数据库,指定用户名和密码。

    pull一个mysql镜像
    cd /home/qinhonghao/web
    sudo su
    sudo docker pull mysql:5.7

    创建构建mysql镜像所需的文件

    Dockerfile:

    #基础镜像
    FROM mysql:5.7
    
    #维护者信息
    MAINTAINER qinhonghao 2648619171@qq.com
    
    #设置不允许空密码登陆,且设置root密码
    ENV MYSQL_ALLOW_EMPTY_PASSWORD no
    ENV MYSQL_ROOT_PASSWORD=ymt123456
    
    #将所需文件放到容器中
    COPY setup.sh /home/qinhonghao/mysql/setup.sh
    COPY schema.sql /home/qinhonghao/mysql/schema.sql
    COPY privileges.sql /home/qinhonghao/mysql/privileges.sql
    
    
    #设置容器启动时执行的命令
    CMD ["sh", "/home/qinhonghao/mysql/setup.sh"]
    

    容器启动脚本setup.sh

    #!/bin/bash
    set -e
    
    #查看mysql服务的状态,方便调试,这条语句可以删除
    echo `service mysql status`
    
    echo '1.启动mysql....'
    #启动mysql
    service mysql start
    sleep 3
    echo `service mysql status`
    
    echo '2.开始导入数据....'
    #导入数据
    mysql < /home/qinhonghao/mysql/schema.sql
    echo '3.导入数据完毕....'
    
    sleep 3
    echo `service mysql status`
    
    #重新设置mysql密码
    echo '4.开始修改密码....'
    mysql < /home/qinhonghao/mysql/privileges.sql
    echo '5.修改密码完毕....'
    
    #sleep 3
    echo `service mysql status`
    echo `mysql容器启动完毕,且数据导入成功`
    
    tail -f /dev/null
    

    Mysql的数据库脚本命令schema.sql

    -- 创建数据库
    create database `docker_mysql` default character set utf8 collate utf8_general_ci;
    
    use docker_mysql;
    
    -- 建表
    DROP TABLE IF EXISTS user;
    
    CREATE TABLE user (
      `id` varchar(20) NOT NULL,
      `name` varchar(20) DEFAULT NULL,
      `sex` varchar(10) DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
    
    -- 插入数据
    INSERT INTO user (`id`, `name`, `sex`)
    VALUES
        ('1001','qhh','man');
    

    Mysql权限设置命令privileges.sql

    use mysql;
    select host, user from user;
    -- 因为mysql版本是5.7,因此新建用户为如下命令:
    create user qaq identified by '123456';
    -- 将docker_mysql数据库的权限授权给创建的qaq用户,密码为123456:
    grant all on docker_mysql.* to qaq@'%' identified by '123456' with grant option;
    -- 这一条命令一定要有:
    flush privileges;
    
    

    构建数据库

    在工作目录下运行docker build命令

    docker build -t xm_mysql .

    docker images

    运行容器并查看是否创建成功

    docker run --name sqlqhh -p 3306:3306 -d xm_mysql
    docker ps

    进入容器,使用指定用户名和密码进入数据库

    docker exec -it sqlqhh /bin/bash
    mysql -u qaq -p

    查看已经存在的数据库

    show databases;

    进入数据库并且查表,然后使用exit退出

    use docker_mysql
    select * from user;
    exit

    使用root密码登录并查看数据库

    mysql -u root -p
    show databases;

    查看mysql的配置信息

    show variables;

    退出容器,查看日志信息

    docker logs sqlqhh

    查看这个容器的信息

    sudo docker inspect sqlqhh

    (3)实践小结

    在本次实践作业我遇到了些许问题:
    1、nginx和mysql镜像下载特别特别慢,我也没考虑加速,所以浪费了很多时间在下载方面,心态也受到了一些影响。
    2、build指令建立镜像的时候,在任务一和任务二都忘记在最后面加“.”,以致于异常,下次一定不要忘记了。
    3、在利用数据库镜像建立并运行容器时,进入容器目录经常会失败,百度查了一下原因发现可能是容器自动挂掉了没在运行,所以我用docker start 容器来开启再进入容器,发现还是不行,然后我到班级群去问同学,然后又试了把Dockerfile和setup.sh文件的相对路径/mysql/xxx改为绝对路径/home/qinhonghao/mysql/xxx,再试也不行,后面又试着把镜像删除了再创建,但是仍然不见有用。然后我不得不静下心了(实在是没招),然后当我用docker ps -a来查看时,发现了一个问题,我发现我有好多个容器对应同一个数据库镜像,这会不会有可能导致资源的占用发生一些错误呢?反正现在我也没有办法了,我断然地把数据库镜像和对应的所有容器都删除了(真解气),然后按之前的步骤重新来,果然没问题了,能顺利进入到容器。。虽然我不能很确定这是解决问题的关键,但是至少过去了。

  • 相关阅读:
    【Java8】 @FunctionalInterface 函数式接口
    集合使用copy与mutableCopy的区别
    GCD中的dispatch_sync、dispatch_sync 分别与串行、并行队列组合执行小实验
    podspec文件介绍
    iOS系统app崩溃日志手动符号化
    webView文本长按显示英文
    深拷贝
    view向全屏延伸时的属性设置
    iOS 模拟器截屏快捷键
    mysql 优化常用语句
  • 原文地址:https://www.cnblogs.com/yangminting/p/12756030.html
Copyright © 2011-2022 走看看