• 系统综合实践_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的一些指令还需要做进一步的理解和探究。

  • 相关阅读:
    Unity快速运行模式与减少编译等待时间
    神器 Trello Bug Tracker 使用介绍
    优化UGUI的ScrollRect
    Unity开源搜索引擎
    游戏技术分享网站 CEDEC
    帧同步技术总结
    Unity Text自动缩放文本
    系统知识坑洼之旅文件系统篇其一文件夹也是个文件?
    [代码修订版] Python 踩坑之旅进程篇其五打不开的文件
    [代码修订版] Python 踩坑之旅 [进程篇其四] 踩透 uid euid suid gid egid sgid的坑坑洼洼
  • 原文地址:https://www.cnblogs.com/honger125/p/12724255.html
Copyright © 2020-2023  润新知