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

 更新时间:2023年04月18日 08:44:07   作者:敲代码敲到头发茂密  
本文详细介绍了dockerfile以及新型容器镜像构建技术,文章中通过详细的代码示例介绍了dockerfile生成容器镜像器的全过程,感兴趣的小伙伴可以参考一下

一、容器镜像分类

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)。

在这里插入图片描述

2、dockerfile指令

构建类指令

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

设置类指令

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

在这里插入图片描述

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

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

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

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

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

在这里插入图片描述

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

在这里插入图片描述


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

在这里插入图片描述

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

在这里插入图片描述

ENTRYPOINT:与CMD非常类似

在这里插入图片描述

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

在这里插入图片描述

在这里插入图片描述

3、dockerfile基本组成

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

4、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命令,可
以把能够合并安装指令合并为一条,这样就可以减少镜像分层。

在这里插入图片描述

优化内容如下

在这里插入图片描述

b、清理无用数据

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

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

相关文章

  • Docker中的文件/文件夹的挂载映射方式

    Docker中的文件/文件夹的挂载映射方式

    通过命令行在宿主机与Docker容器间挂载和映射文件夹,实现数据共享,具体步骤包括:在宿主机创建文件夹并使用Docker命令将其挂载到容器指定位置,需注意容器名称与ID的使用差异
    2024-11-11
  • Docker安装部署分布式数据库 OceanBase的详细过程

    Docker安装部署分布式数据库 OceanBase的详细过程

    这篇文章主要介绍了Docker安装部署分布式数据库 OceanBase,快速的体验 OceanBase 的自动化部署过程,及了解 OceanBase 集群安装成功后的目录特点和使用方法,需要的朋友可以参考下
    2022-06-06
  • Docker运行镜像以及退出、删除容器的实现方式

    Docker运行镜像以及退出、删除容器的实现方式

    这篇文章主要介绍了Docker运行镜像以及退出、删除容器的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-03-03
  • 更改docker默认数据目录的方法步骤

    更改docker默认数据目录的方法步骤

    本文主要介绍了更改docker默认数据目录的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-01-01
  • 超级简洁的使用YUM安装docker

    超级简洁的使用YUM安装docker

    这篇文章主要给大家介绍了关于使用YUM安装docker的相关资料,内容简明扼要并且容易理解,绝对能使你眼前一亮,需要的朋友可以参考下
    2023-08-08
  • Centos 6.5中安装docker的步骤(简洁版)

    Centos 6.5中安装docker的步骤(简洁版)

    这篇文章主要介绍了Centos 6.5中安装docker的步骤(简洁版),需要的朋友可以参考下
    2016-10-10
  • 用docker部署RabbitMQ环境的详细介绍

    用docker部署RabbitMQ环境的详细介绍

    这篇文章主要介绍了用docker部署RabbitMQ环境,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-07-07
  • Docker部署mysql一主一从的操作方法

    Docker部署mysql一主一从的操作方法

    这篇文章主要介绍了Docker部署mysql一主一从,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-05-05
  • IDEA通过Docker插件部署SpringBoot项目的过程详解

    IDEA通过Docker插件部署SpringBoot项目的过程详解

    在idea中如何通过Docker插件部署SpringBoot项目呢?很多朋友在配置过程中走了很多误区,今天小编给大家分享一篇教程关于IDEA通过Docker插件部署SpringBoot项目的过程,感兴趣的朋友一起看看吧
    2021-11-11
  • Docker中部署Redis并挂载配置文件

    Docker中部署Redis并挂载配置文件

    本文主要介绍了Docker中部署Redis并挂载配置文件,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06

最新评论