• 2020系统综合实践 第2次实践作业


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

    拉取nginx镜像以获取它的默认配置文件

    docker pull nginx
    

    查看是否成功获取镜像

    docker images
    

    为了方便管理,先创建一个文件夹mydocker

    mkdir mydocker
    


    在正式开始编写Dockerfile之前,我们需要先准备好nginx配置文件和自己的网页

    先用拉来的镜像运行一个nginx容器

    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
    

    vim在mydocker文件夹中创建一个default.conf文件,然后将默认配置文件复制进去

    接下来修改配置文件,自定义监听端口和根目录

    然后新建一个index.html文件,并编写一个最简单的网页以供测试

    万事具备,现在我们可以开始编写Dockerfile了,vim新建一个名为Dockerfile的文件就可以往里写东西了

    #基础镜像
    FROM nginx
    
    #镜像作者
    MAINTAINER Tinor
    
    #设置工作目录
    WORKDIR /home/tinor/mydocker
    
    #复制配置文件以及自己的web存放目录
    COPY default.conf /etc/nginx/conf.d/
    COPY index.html /home/tinor/mydocker/
    
    #暴露端口
    EXPOSE 8008
    

    先删掉之前的nginx容器

    docker ps #找到容器id
    docker rm -f [容器id]
    


    在存放Dockerfile的目录下构建镜像

    docker build -t mynginx .
    

    用自定义镜像运行容器

    docker run --name tinor_nginx -d -p 8008:2333 mynginx
    

    进入容器看看是会直接进入设定的工作目录下

    sudo docker exec -it [容器id] /bin/bash
    pwd
    

    可以看到容器已经进入设定的工作目录中

    最后是去浏览器查看之前准备的网页是否能正常访问

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

    为了方便管理,依然先创建一个名为mysql的文件夹
    然后在该文件夹中分别创建如下四个文本文件,用于编写MySQL的配置文件

    1.编写Dockerfile

    #基础镜像
    FROM mysql:5.7
    #镜像作者
    MAINTAINER Tinor
    #设置不允许免密登录并设置root密码
    ENV MYSQL_ALLOW_EMPTY_PASSWORD no
    ENV MYSQL_ROOT_PASSWORD=123456
    #将配置文件放到容器中
    COPY setup.sh /mysql/setup.sh
    COPY schema.sql /mysql/schema.sql
    COPY privileges.sql /mysql/privileges.sql
    #设置容器启动时执行的命令
    CMD ["sh", "/mysql/setup.sh"]
    

    2、编写容器启动脚本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 < /mysql/schema.sql
    echo '3.导入数据完毕....'
    
    sleep 3
    echo `service mysql status`
    
    #重新设置mysql密码
    echo '4.开始修改密码....'
    mysql < /mysql/privileges.sql
    echo '5.修改密码完毕....'
    
    #sleep 3
    echo `service mysql status`
    echo 'mysql容器启动完毕,且数据导入成功'
    
    tail -f /dev/null
    

    3、需要导入数据的mysql脚本命令schema.sql

    -- 创建数据库
    create database `docker_mysql` default character set utf8 collate utf8_general_ci;
     
    use docker_mysql;
     
    -- 建表
    DROP TABLE IF EXISTS Student;
     
    CREATE TABLE Student (
     `Sno` bigint(20) NOT NULL,
     `Sname` varchar(255) DEFAULT "",
     `Ssex` varchar(10) DEFAULT "Male"
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
     
    -- 插入数据
    INSERT INTO Student (`Sno`, `Sname`,`Ssex`)
    VALUES
      (031702441,'Tinor','Male');
    

    4、mysql权限设置命令privileges.sql

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

    创建镜像

    docker build -t tinor_mysql .
    

    运行容器

    docker run --name tinor_mysql -d -p 2441:2441 tinor_mysql
    

    进入容器

    docker exec -it [容器id] /bin/bash
    

    使用docker用户登录数据库

    mysql -u docker -p
    

    切换至docker_mysql数据库

    use docker_mysql
    

    查看Student表中的数据

    select * from Student;
    


    测试根节点登录密码

    exit
    mysql -u root -p
    


    可以看到使用root用户登录数据库的时候需要输入密码

    最后是查看容器的配置信息

    docker inspect [容器id]
    

    信息很长,只截取了一部分

    3.遇到的问题

    (1)第一个问题

    在第一个实验中
    第一次运行容器

    在浏览器访问自己的网页,但是发现不是我自己的网页

    看了看这个网页的内容,应该是nginx的官方的一个欢迎界面,想起来为了获取配置文件的时候曾经运行过一个nginx的容器,应该是8080端口被那个容器占用了(但是我不明白我明明把那个容器删除掉了还会继续占用端口,而且还能继续访问那个网页)。看来这个端口暂时是用不了,此路不通,那咱就另寻他路。
    于是我把自定义的镜像和由其生成的容器都删掉,然后修改Dockfile的端口为8008,重新构建重新运行容器。


    然后再去浏览器访问,发现就可以了。

    后来我在新运行的容器里面找到了nginx的欢迎页面的html文件

    我以为是这两个文件占用了8080端口,于是我把这两个文件删了,但是在浏览器访问localhost:8080依然可以看到那个欢迎页面,没办法,不能再折腾了,这个问题就先放着吧。
    (2)第二个问题
    在第一个实验中,我没有按照老师要求“安装必要的工具以方便维护”,很大的原因就是我对不熟悉nginx和web开发,所以根本就不知道该安装说明工具,但是这不代表我就没有去学习这一方面的知识,我在B站看了一个视频,老师以自定义centos为例,初始的centos没有安装很多工具,甚至连vim都没有,如果希望centos容器运行的时候就有vim,只需要在Dockerfile中使用"RUN yun -y install vim"就可以。所以其实老师说的“安装必要的工具以方便维护”应该也是使用RUN指令让镜像在构造的时候就安装某些管理工具,但是我遇到的问题就是不知道应该安装什么工具,由于最近课业太多也没时间去深入研究,所以我希望在以后需要的时候再安装相关工具。

  • 相关阅读:
    dba_tables表中的num_rows与count(*)的值为何不同
    Mysql查询数据库中的表名/模糊查询
    Nginx配置静态文件(浏览器的缓存)
    UEditor支持数学公式
    小程序H5的自动登录(后台Shiro)
    Ubuntu的邮件发送
    Infosec Tool List
    检测configMap,重载Pod内的业务容器
    CNI calico插件使用注意事项
    kspan 集群度量方案
  • 原文地址:https://www.cnblogs.com/Tinor/p/12762110.html
Copyright © 2020-2023  润新知