系统综合实践_2

1、Dockerfile相关信息


  • Dockerfile

    Dockerfile是一个包含用于组合映像的命令的文本文档。可以使用在命令行中调用任何命令。Docker通过读取Dockerfile中的指令自动生成映像。docker build命令用于从Dockerfile构建映像。可以在docker build命令中使用-f标志指向文件系统中任何位置的Dockerfile。

  • 基本结构

    Dockerfile一般分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。

  • 文件说明

    Docker以从上到下的顺序运行Dockerfile的指令。为了指定基本映像,第一条指令必须是FROM。一个声明以#字符开头则被视为注释。可以在Docker文件中使用RUN,CMD,FROM,EXPOSE,ENV等指令。

  • 常用指令

Dockerfile语法详解

  • FROM:指定基础镜像,必须是第一条指令
  • ADD:将宿主机目录下的文件复制到镜像中
  • COPY:复制指令,与ADD相比,COPY的只能是本地文件
  • EXPOSE:暴露容器运行时的监听端口给外部
  • ENV:设置环境变量
  • RUN:容器构建时要运行的命令
  • CMD:容器启动时要运行的命令
  • ENTRYPOINT:启动时的默认命令。与CMD相比,ENTRYPOINT不会被运行的command覆盖,而CMD则会被覆盖
  • VOLUME:容器数据卷,用于数据保持和持久化工作
  • WORKDIR:指定在容器创建后,终端默认登录的进来工作目录,落脚点
  • ONBUILD:当构建一个被继承的Dockerfile时运行命令。父镜像在被子镜像继承后父镜像的onbuild被触发

2、自定义的web容器服务(nginx)


  • 拉取nginx镜像

  • 输入命令获取nginx镜像

     sudo docker pull nginx 
    

  • 查看本地镜像,nginx拉取成功
  • 运行nginx

  • 运行容器命令

     sudo docker run --name <name> -p 8080:80 -d nginx
    
  • 通过浏览器直接访问端口8080查看nginx服务

  • 编辑配置文件

  • 创建文件夹myweb

  • 查看nginx配置信息

     sudo docker exec -it <image id> /bin/bash
     cd /etc/nginx/conf.d
     cat default.conf
    

  • 将上述信息复制到一个新的文件中,修改端口(80=>4052)和根目录,命名default.conf并保存在自己所创文件夹中

  • 编写index.html文件,保存在自己所创文件夹中

  • 编写Dockerfile文件,保存在自己所创文件夹中

  • 构建镜像

  • 构建命令

     sudo docker build -t <Name> .
    

  • 查看本地镜像,hcr_nginx已在本地镜像中,构建成功
  • 运行容器,映射端口

   sudo docker run --name <Name> -d -p <port1>:<port2> <Name>

  • 查看结果

  • 浏览器访问端口(4052),会显示自己所编写的index.html文件的内容

3、自定义的数据库容器服务(mysql)


  • 主要参考博客

让docker中的mysql启动时自动执行sql文件

  • 拉取一个较稳定的mysql版本

  • 拉取mysql镜像,据说使用最新版本会有问题,因此这里选择mysql5.7

     sudo docker pull mysql:5.7
    

  • 查看本地镜像,mysql拉取成功
  • 编辑配置文件

  • 创建文件夹

  • 编写Dockerfile

  • 编写容器启动脚本setup.sh
    先导入数据,然后再设置用户和权限。因为mysql容器一开始为免密登录,Dockerfile中有如下设置:ENV MYSQL_ALLOW_EMPTY_PASSWORD yes,此时执行导入数据命令不需要登录验证操作。如果是先执行权限操作,那么导入数据则需要登录验证,整个过程就麻烦了许多。

  • 编写schema.sql并导入数据

  • 编写mysql权限设置命令privileges.sql

  • 创建镜像

   docker build -t <Name> .

查看本地镜像,hcr_mysql已在本地镜像中,创建成功

  • 启动容器,映射端口

   docker run --name <Name> -d -p <>port1>:<port2> <name>

查看本地正在运行的容器,hcr_mysql在列表中

  • 验证结果

  • 进入容器,使用docker用户登录数据库

     docker exec -it <容器ID> /bin/bash
     mysql -u <Sql_Name> -p
    

  • 切换数据库

     use docker_mysql;
    

  • 查看数据库中的表

     show tables;
    

  • 查看表中数据

     select * from user;
    

  • 查看容器配置信息

    使用docker inspect命令,该命令会返回一个json字符串,里面以key-value的格式准备了该容器相关的信息,内容十分丰富,可以一次性取得全部内容,也可以返回指定key对应的信息。

   sudo docker inspect <容器ID>
   sudo docker inspect -f {<key>} <容器ID>
  • 查看全部信息

  • 查看容器端口映射

4、问题&解决


  • 构建镜像的命令docker build -t <Name> .中,“.”表示上下文,很容易被忽略。
  • 在做自定义web容器服务做到最后一步在浏览器访问端口时显示未连接。经过排查发现是default.conf文件根目录修改时漏掉了“/”,文件修改后,删除原来的容器和镜像,然后重新创建运行即可。
  • 在执行数据库切换、查询等数据库内部的操作时,如果命令末尾没有“;”,mysql会认为该句还没输入完整,系统不会执行该语句。

5、总结

    一开始看到题目和要求时,毫无思路,在网上搜索了一会仍旧是一头雾水,无从下手。后来静下心研究了一下Dockerfile,总算是有了一点头绪,果然做事不能太心浮气躁,还是得循序渐进,一步一步慢慢来。通过本次作业完成的2个Dockerfile编写实践,懂得如何使用Dockerfile文件来实现自定义镜像,大致知道了编写Dockerfile的基本流程:编辑配置文件=>编辑Dockerfile(如何构建镜像)=>构建镜像=>运行容器。不过对于Dockerfile的一些指令还需要做进一步的理解和探究。

posted @ 2020-04-24 09:32  Mys_02  阅读(180)  评论(0编辑  收藏  举报