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


    第2次实践作业

    上一次作业同学们实现了docker环境的安装和基本配置,已经能够从docker的官方镜像仓库中拉取镜像,初步实现了入门。然而,从官方仓库拉取的镜像是最简单的镜像,在实际应用中经常需要根据需求额外修改镜像,这就涉及到了镜像的定制。在docker中我们可以使用Dockerfile文件实现自定义镜像,本次作业需要完成2个Dockerfile编写实践,掌握编写Dockerfile文件的基本方法。

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

    推荐apachenginx,要求标明镜像作者信息,安装必要的工具以方便维护;设定你自己的web存放目录,安全起见,请将默认的监听端口80更改为你自定义的端口,并且声明暴露的端口,容器启动时,能直接进入web代码的存放目录。

    1.从 docker hub拉取nginx作为基础镜像

    sudo docker pull nginx
    sudo docker images
    

    2.创建nginx容器并运行

    sudo docker run --name nginx-test -p 8080:80 -d nginx
    

    3.在本地浏览器验证nginx服务器是否启动成功

    ifconfig -a
    192.168.62.128:8080
    

    4.找到nginx服务器的配置信息

    sudo docker attach <容器ID>
    

    5.更改nginx服务器配置信息

    sudo docker cp <容器ID>:/etc/nginx/conf.d/default.conf <宿主机路径(.表示当前目录)>
    

    6.编写HTML网页,用于替换初始的页面

    <!DOCTYPE html>
    <html>
    <head>
    	<title>test</title>
    </head>
    <body>
    	<h1>hello world</h1>
    	<h2>yzl5203</h2>
    </body>
    </html>
    
    

    7.编写Dockerfile文件

    #获取基础镜像
    FROM nginx
    #标注作者信息
    MAINTAINER yzl5203 
    #替换配置文件
    COPY default.conf /etc/nginx/conf.d/
    #替换初始网页 
    COPY index.html  /usr/web/ 
    #设置对外暴露端口
    EXPOSE 80
    

    8.用Dockerfile文件创建一个镜像

    sudo docker build -t mynginx:v2 .
    sudo docker images
    

    9.验创建nginx服务器并验证

    sudo docker run --name my_nginx -p 80:8080 -d mynginx:v2
    sudo docker ps
    


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

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

    1.创建并mysql文件夹

    sudo mkdir ~/mysql
    cd ~/mysql
    

    2.创建Dockerfile文件

    FROM mysql:5.7
    
    #设置免密登录
    ENV MYSQL_ALLOW_EMPTY_PASSWORD yes
    
    #将所需文件放到容器中
    COPY setup.sh /mysql/setup.sh
    COPY schema.sql /mysql/schema.sql
    COPY privileges.sql /mysql/privileges.sql
    
    #设置容器启动时执行的命令
    CMD ["sh", "/mysql/setup.sh"]
    

    3.编写容器启动脚本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
    

    4.编写导入数据的mysql脚本命令schema.sql

    -- 创建数据库
    create database `test_mysql` default character set utf8 collate utf8_general_ci;
     
    use test_mysql;
     
    -- 建表
    DROP TABLE IF EXISTS test;
     
    CREATE TABLE test (
     `id` bigint(20) NOT NULL,
     `age` bigint(20) NOT NULL,
     `name` varchar(255) DEFAULT ""
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
     
    -- 插入数据
    INSERT INTO test (`id`,`age`,`name`) VALUES (1999,0,'yzl');
    INSERT INTO test (`id`,`age`,`name`) VALUES (2020,21,'yzl')
    
    

    5.编写权限设置命令privileges.sql

    use mysql;
    select host, user from user;
    -- 新建用户为如下命令:
    create user docker identified by '19991026';
    -- 将test_mysql数据库的权限授权给创建的docker用户,密码为19991026:
    grant all on test_mysql.* to docker@'%' identified by '19991026' with grant option;
    -- use privileges
    flush privileges;
    
    

    6.执行Dockerfile,创建镜像

    sudo docker build -t mysql:v1 .
    

    7.创建并运行容器,查看容器状态,查看日志文件

    sudo docker run -d -p 13306:3306 mysql:v1
    sudo docker logs <容器ID>
    

    8.进入容器

    docker exec -it <容器ID> /bin/bash
    

    9.使用指定用户名和密码进入数据库

    mysql -u lin -p
    

    10.查看数据库信息

    use test_mysql;
    show tables;
    select * from test;
    

    (3)小结

    1.Nginx的Dockerfile文件

    #获取基础镜像
    FROM nginx
      
    #标注作者信息
    MAINTAINER yzl5203 
    
    #替换配置文件
    COPY default.conf /etc/nginx/conf.d/
    
    #替换初始网页 
    COPY index.html  /usr/web/ 
    
    #设置对外暴露端口
    EXPOSE 80
    

    2.Mysql的Dockfile文件

    FROM mysql:5.7
    
    #设置免密登录
    ENV MYSQL_ALLOW_EMPTY_PASSWORD yes
    
    #将所需文件放到容器中
    COPY setup.sh /mysql/setup.sh
    COPY schema.sql /mysql/schema.sql
    COPY privileges.sql /mysql/privileges.sql
    
    #设置容器启动时执行的命令
    CMD ["sh", "/mysql/setup.sh"]
    

    3.Dockerfile总结

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

    FROM:指定基础镜像,必须为第一个命令

    FROM <image>
    FROM <image>:<tag>
    

    MAINTAINER: 维护者信息

    MAINTAINER <name>
    

    RUN:构建镜像时执行的命令

    RUN <命令行命令>
    RUN ["可执行文件", "参数1", "参数2"]
    

    ADD:将本地文件添加到容器中,tar类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,类似wget。
    ADD 的缺点:在不解压的前提下,无法复制 tar 压缩文件。

    ADD <src>... <dest>
    ADD ["<src>",... "<dest>"] 用于支持包含空格的路径
    

    COPY:功能类似ADD,但是不会自动解压文件,也不能访问网络资源

    COPY <src>... <dest>
    COPY ["<src>",... "<dest>"] 
    

    CMD:类似于 RUN 指令,用于运行程序,但二者运行的时间点不同:

    • CMD 在docker run 时运行。
    • RUN 是在 docker build
    CMD ["executable","param1","param2"] (执行可执行文件,优先)
    CMD ["param1","param2"] (设置了ENTRYPOINT,则直接调用ENTRYPOINT添加参数)
    CMD command param1 param2 (执行shell内部命令)
    

    ENTRYPOINT:类似于 CMD 指令,但其不会被 docker run 的命令行参数指定的指令所覆盖,而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序。但是, 如果运行 docker run 时使用了 --entrypoint 选项,此选项的参数可当作要运行的程序覆盖 ENTRYPOINT 指令指定的程序。如果 Dockerfile 中如果存在多个 ENTRYPOINT 指令,仅最后一个生效。

    ENTRYPOINT ["executable", "param1", "param2"] (可执行文件, 优先)
    ENTRYPOINT command param1 param2 (shell内部命令)
    

    LABEL:用于为镜像添加元数据

    LABEL <key>=<value> <key>=<value> <key>=<value> ...
    

    ENV:设置环境变量

    ENV <key> <value>
    ENV <key1>=<value1> <key2>=<value2>...
    

    EXPOSE:指定于外界交互的端口

    EXPOSE <port1> [<port2>...]
    

    VOLUME:用于指定持久化目录

    VOLUME <path>
    VOLUME [<path1>,<path2>...]
    

    WORKDIR:工作目录,类似于cd命令

    WORKDIR <path>
    

    USER:用于指定执行后续命令的用户和用户组,这边只是切换后续命令执行的用户(用户和用户组必须提前已经存在)。

    USER <user>[:<group>]
    

    ARG:构建参数,与 ENV 作用一至。不过作用域不一样。ARG 设置的环境变量仅对 Dockerfile 内有效,也就是说只有 docker build 的过程中有效,构建好的镜像内不存在此环境变量。

    ARG <name>[=<default value>]
    

    ONBUILD:用于设置镜像触发器

    ONBUILD [INSTRUCTION]
    

    4.念念碎

    • 没有镜像源,是真pull得慢。最后还是挂了VPN,直接起飞
    • 最开始没接触过nginx,然后花了一下午的时间来了解nginx是什么
    • nginx一直想替换初始的html,然后找了好久文件位置,然后又花了一点时间解决了替换问题
    • mysql最初用新版本,不知道哪里出现了问题,一直弄不了。最后换到了5.7版本
  • 相关阅读:
    kolla-ansible安装openstack(Ocata)
    OpenStack 虚机网卡的创建过程
    C语言 IPv6 十六进制 转 十进制
    python IPv6 十进制和十六进制互转
    ICMPv6 Packet Types and Codes
    scapy IPv6 NS NA报文构造
    最接近的数 牛客网 程序员面试金典 C++ Python
    最近公共祖先 牛客网 程序员面试金典 C++ Python
    有向路径检查 牛客网 程序员面试金典 C++ Python
    检查是否是BST 牛客网 程序员面试金典 C++ java Python
  • 原文地址:https://www.cnblogs.com/cc1219032777/p/12755377.html
Copyright © 2020-2023  润新知