欢迎来到站长天空!

其它服务器

当前位置: 主页 > 服务器 > 其它服务器

Dockerfile及新型容器镜像构建技术详解

时间:2025-12-13 08:30:02|栏目:其它服务器|点击:

目录
  • 一、容器镜像分类
    • 1、操作系统类
    • 2、应用类
  • 二、容器镜像获取方法
    • 1、在dockerhub直接下载
    • 2、把操作系统中文件系统打包为容器镜像
    • 3、把正在运行的容器打包为容器镜像,即docker commit
    • 4、通过dockerfile实现容器镜像的自定义以及生成
  • 三、dockerfile
    • 1、dockerfile介绍
    • 2、dockerfile指令
      • 构建类指令
      • 设置类指令
    • 3、dockerfile基本组成
      • 4、dockerfile生成容器镜像过程
        • 5、dockerfile生成容器镜像案例
          • dockerfile生成容器镜像步骤
        • 6、使用Dockerfile生成Nginx容器镜像
          • 7、Dockerfile生成容器镜像优化的方法
            • a、减少镜像分层
            • b、清理无用数据

        一、容器镜像分类

        1、操作系统类

        centos
        ubuntu
        自行制作

        2、应用类

        tomcat
        nginx
        mysql
        redis

        二、容器镜像获取方法

        1、在dockerhub直接下载

        docker pull centos:latest

        2、把操作系统中文件系统打包为容器镜像

        3、把正在运行的容器打包为容器镜像,即docker commit

        [root@mylinux1 ~]# docker ps
        CONTAINER ID   IMAGE              COMMAND                   CREATED        STATUS         PORTS                                                                                                                             NAMES
        
        ca081c0529d1   mysql:5.5          "docker-entrypoint.s…"   28 hours ago   Up 2 minutes   0.0.0.0:8888->3306/tcp, :::8888->3306/tcp                                                                                         my_mysql
        
        [root@mylinux1 ~]# docker commit ca081c0529d1 mysql:v1.0
        
        [root@mylinux1 ~]# docker images
        REPOSITORY                TAG               IMAGE ID       CREATED          SIZE
        mysql                     v1.0              d404d78aa797   3 years ago      205MB
        
        [root@mylinux1 ~]# docker run --name new_mysql -d mysql:v1.0
        2fd23f7e01889fbdc74e02305c910a8d8d2ddb48f00241b83469c671d82e586f
        
        [root@mylinux1 ~]# docker ps
        CONTAINER ID   IMAGE                    COMMAND                   CREATED         STATUS         PORTS                                                                                                                             NAMES
        2fd23f7e0188   mysql:v1.0               "docker-entrypoint.s…"   4 seconds ago   Up 3 seconds   3306/tcp                                                                                                                          new_mysql
        
        ca081c0529d1   mysql:5.5                "docker-entrypoint.s…"   28 hours ago    Up 4 minutes   0.0.0.0:8888->3306/tcp, :::8888->3306/tcp                                                                                         my_mysql
        
        

        4、通过dockerfile实现容器镜像的自定义以及生成

        三、dockerfile

        1、dockerfile介绍

        Dockerfile是一种能够被Docker程序解释的剧本。Dockerfile由一条一条的指令组成,并且有自己的书写格式和支持的命令。当我们需要在容器镜像中指定自己额外的需求时,只需在Dockerfile上添加或修改指令,然后通过docker build生成我们自定义的容器镜像(image)。

        Dockerfile及新型容器镜像构建技术详解

        2、dockerfile指令

        构建类指令

        用于构建image
        其指定的操作不会在运行image的容器上执行(FROM、MAINTAINER、RUN、ENV、ADD、COPY)

        设置类指令

        用于设置image属性
        其指定的操作将在运行image的容器中执行(CMD、ENTRYPOINT、USER、EXPORT、VOLUME、WORKDIR、ONBUILD)

        Dockerfile及新型容器镜像构建技术详解

        FROM指令用于指定其构建新镜像所使用的基础镜像
        FROM指令必须是Dockerfile文佳中的首条命令
        FROM指令指定的基础image可以是官方远程仓库中的,也可以位于本地仓库的
        格式:FROM :
        例如:FROM centos:latest

        RUN指令用于构建镜像中执行命令,有以下两种格式

        Dockerfile及新型容器镜像构建技术详解

        注意:按优化的角度来讲:当有多条要执行的命令,不要使用多条RUN,尽量使用&&符号与\符号连接成一行。因为多条RUN命令会让镜像建立多层
        (总之就是会变得臃肿了)。

        Dockerfile及新型容器镜像构建技术详解

        CMD:不同于RUN,CMD用于指定在容器启动时所要执行的命令,而RUN用于指定镜像构建时所要执行的命令

        Dockerfile及新型容器镜像构建技术详解

        每个Dockerfile只能有一条CMD命令。如果指定了多条命令,只有最后一条会被执行。
        如果用户启动容器时候指定了运行的命令,则会覆盖掉CMD指定的命令。

        EXPORT:用于指定容器在运行时监听的端口

        Dockerfile及新型容器镜像构建技术详解

        ENV:用于指定一个环境变量

        Dockerfile及新型容器镜像构建技术详解


        ADD:用于把宿主机上的文件拷贝到镜像中

        Dockerfile及新型容器镜像构建技术详解

        COPY:与ADD指令类似,但是COPY的源文件只能时本地文件

        Dockerfile及新型容器镜像构建技术详解

        ENTRYPOINT:与CMD非常类似

        Dockerfile及新型容器镜像构建技术详解

        VOLUME:用于把宿主机里的目录与容器里的目录映射
        只指定挂载点,docker宿主机映射的目录为自动生成的

        Dockerfile及新型容器镜像构建技术详解

        Dockerfile及新型容器镜像构建技术详解

        3、dockerfile基本组成

        基础镜像信息
        维护者信息
        镜像操作指令
        容器启动时执行指令

        4、dockerfile生成容器镜像过程

        Dockerfile及新型容器镜像构建技术详解

        5、dockerfile生成容器镜像案例

        dockerfile生成容器镜像步骤

        第一步:创建一个文件夹(目录)
        第二步:在文件夹(目录)中创建Dockerfile(固定)文件并编写,以及其他文件
        第三步:使用docker build命令构建镜像
        第四步:使用构建的镜像启动容器

        6、使用Dockerfile生成Nginx容器镜像

        [root@mylinux1 dockerfile_nginx]# ls
        Dockerfile  index.html
        
        [root@mylinux1 dockerfile_nginx]# cat index.html 
        nginx is running
        
        [root@mylinux1 dockerfile_nginx]# vim Dockerfile 
        
        FROM centos:centos7
        
        MAINTAINER "1181068365@qq.com"
        
        RUN yum -y install wget
        
        RUN wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
        
        RUN yum -y install nginx
        
        ADD index.html /usr/share/nginx/html/
        
        RUN echo "daemon off;" >> /etc/nginx/nginx.conf
        
        EXPOSE 80
        
        CMD /usr/sbin/nginx
        

        生成镜像

        [root@mylinux1 dockerfile_nginx]# docker build -t centos7-nginx:v1.0 .
        [+] Building 69.6s (11/11) FINISHED                                                              
         => [internal] load build definition from Dockerfile                                        0.0s
         => => transferring dockerfile: 405B                                                        0.0s
         => [internal] load .dockerignore                                                           0.0s
         => => transferring context: 2B                                                             0.0s
         => [internal] load metadata for docker.io/library/centos:centos7                          25.6s
         => CACHED [1/6] FROM docker.io/library/centos:centos7@sha256:be65f488b7764ad3638f236b7b51  0.0s
         => [internal] load build context                                                           0.0s
         => => transferring context: 114B                                                           0.0s
         => [2/6] RUN yum -y install wget                                                          15.9s
         => [3/6] RUN wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.rep  1.5s
         => [4/6] RUN yum -y install nginx                                                         24.3s 
         => [5/6] ADD index.html /usr/share/nginx/html/                                             0.1s 
         => [6/6] RUN echo "daemon off;" >> /etc/nginx/nginx.conf                                   1.2s 
         => exporting to image                                                                      0.8s 
         => => exporting layers                                                                     0.8s 
         => => writing image sha256:337b3bac42dda5f878cb671f3306f7753a0693bbddb74388663c943d51ca20  0.0s 
         => => naming to docker.io/library/centos7-nginx:v1.0                                       0.0s 
        
        
        [root@mylinux1 dockerfile_nginx]# docker images | grep "centos7-nginx"
        centos7-nginx             v1.0                             337b3bac42dd   11 minutes ago   657MB
        

        运行容器

        [root@mylinux1 dockerfile_nginx]# docker run -d centos7-nginx:v1.0
        62b15bc281b433f213f019d7ae9f1ef0ceb2f2d6ee98972d58029f28c548b0ab
        

        查看运行的容器

        [root@mylinux1 dockerfile_nginx]# docker inspect "62b" | address
        -bash: address: 未找到命令
        [root@mylinux1 dockerfile_nginx]# docker inspect "62b" | grep "IPAddress"
                    "SecondaryIPAddresses": null,
                    "IPAddress": "172.17.0.5",
                            "IPAddress": "172.17.0.5",
        [root@mylinux1 dockerfile_nginx]# curl http://172.17.0.5
        nginx is running
        
        [root@mylinux1 dockerfile_nginx]# docker inspect "62b" | address
        -bash: address: 未找到命令
        [root@mylinux1 dockerfile_nginx]# docker inspect "62b" | grep "IPAddress"
                    "SecondaryIPAddresses": null,
                    "IPAddress": "172.17.0.5",
                            "IPAddress": "172.17.0.5",
        [root@mylinux1 dockerfile_nginx]# curl http://172.17.0.5
        nginx is running
        

        7、Dockerfile生成容器镜像优化的方法

        a、减少镜像分层

        Dockerfile中包含多种指令,如果涉及到部署最多使用的算是RUN命令了,使用RUN命令时,不建议每次安装都使用一条单独的RUN命令,可
        以把能够合并安装指令合并为一条,这样就可以减少镜像分层。

        Dockerfile及新型容器镜像构建技术详解

        优化内容如下

        Dockerfile及新型容器镜像构建技术详解

        b、清理无用数据

        一次RUN形成新的一层,如果没有在同一层删除,无论文件是否最后删除,都会带到下一层,所以要在每一层清理对应的残留数据,减小
        镜像大小。
        把生成容器镜像过程中部署的应用软件包做删除处理

        以上就是Dockerfile及新型容器镜像构建技术详解的详细内容,更多关于Dockerfile及新型容器镜像构建的资料请关注其它相关文章!

        上一篇:docker中配置hosts的方法实现

        栏    目:其它服务器

        下一篇:Docker Compose详细介绍

        本文标题:Dockerfile及新型容器镜像构建技术详解

        本文地址:https://zz.feitang.co/server/30515.html

        广告投放 | 联系我们 | 版权申明

        申明:本站所有的文章、图片、评论等,均由网友发表或上传并维护或收集自网络,属个人行为,与本站立场无关。

        如果侵犯了您的权利,请与我们联系,我们将在24小时内进行处理、任何非本站因素导致的法律后果,本站均不负任何责任。

        联系QQ:257218569 | 邮箱:257218569@qq.com

        Copyright © 2018-2025 站长天空 版权所有 Powered by EyouCms冀ICP备14023439号