容器镜像管理

容器镜像概述

容器镜像是容器的模板,容器是镜像的运行实例。runtime根据容器镜像创建容器。

容器镜像挂载在容器根目录下,是为容器中的应用提供隔离后执行环境的文件系统
容器镜像打包了整个操作系统的文件和目录(rootfs),当然也包括应用本身。即,应用及其运行所需的所有依赖,都被封装在容器镜像中。保证了本地环境和云端环境的高度一致
容器镜像采用分层结构:
所有容器共享宿主机Kernel,并且不能修改宿主机Kernel。即,容器运行过程中使用容器镜像里的文件,使用宿主机OS上的Kernel
镜像是不可以修改的,不可以超过128层

将镜像上传至镜像仓库

华为云,阿里云等提供页面上传镜像功能,可以使用上传按钮将镜像文件上传。
也可以使用客户端上传,需容器引擎版本1.11.2及以上。
1、使用root用户登录容器引擎所在主机
2、在华为云容器镜像服务-我的镜像页面获取登录指令并复制到节点上执行
3、上传镜像

docker tag [{镜像名称}:{版本名称}] swr.cn-north-4.myhuaweicloud.com/{组织名称}/{镜像名称}:{版本名称}
docker push swr.cn-north-4.myhuaweicloud.com/{组织名称}/{镜像名称}:{版本名称}

容器镜像制作

  • 打包镜像 docker save httpd:latest -o httpd
  • 将打包后镜像解压 docker load -i httpd
  • 将修改后的容器(运行的容器)提交副本形成镜像 docker commit [容器ID] [镜像名]:[tag]
  • 使用Dockerfile制作镜像

Dockerfile详述

Dockerfile简介
  • Dockerfile是一个包含了一系列命令的文本文件,这些命令可以用来构建一个容器镜像
  • Dockerfile文件中的注释以“#”开始
  • 在Dockerfile所在的目录,使用命令docker build构建镜像;或者在命令docker build后添加-f选项,用来指定Dockerfile的具体位置
  • 在命令docker build后面添加-t选项,用来为创建的镜像指定tag
Dockerfile结构
Dockerfile语法
  • FROM
    1、在制作镜像时,通常会以一个镜像为基础,然后在其基础上进行修改,作为基础的镜像就叫基础镜像,也被称为base镜像
    2、Scratch是一个特殊的基础镜像,表示一个空白的镜像,制作Linux发行版镜像时,通常会使用scratch作为基础镜像
    3、在Dockerfile中,使用FROM命令指定基础镜像,不可以省略,必须是Dockerfile的第一条有效指令
  • label
    1、使用LABEL指令添加镜像描述信息,描述信息以键值对的形式体现。描述信息用来对镜像进行说明,例如该镜像的作者、用途等元数据
    2、\color{red} {镜像描述信息是非必选内容}
    3、一个LABEL指令后面可添加多个键值对,也可以多次使用LABEL设置多条信息在LABEL指令后使用“/”进行换行
  • RUN
    1、Dockerfile在容器构建时使用RUN指令在容器内执行某些操作,例如安装软件、创建文件等
    2、RUN指令可以在同一Dockerfile中多次出现,每执行一次,镜像就会增加一层
    3、一条RUN指令后面可以执行多条命令,命令之间使用“&&”隔开;使用RUN指令如果要进行换行,需使用“\”
  • COPY和ADD
    1、COPY指令可以将宿主机的文件拷贝到镜像当中
    2、ADD指令和COPY指令的作用一样,也是将宿主机上的文件拷贝到镜像中,且ADD可以将tar、gz等格式的压缩包在拷贝到镜像中后自动解压,并将压缩包从镜像中删除
  • WORKDIR
    1、Dockerfile在容器构建时使用WORKDIR指令切换容器的工作目录,如果所指定的工作目录不存在,WORKDIR会自动创建该目录
    2、在Dockerfile中可多次使用WORKDIR来切换目录
  • ENV
    1、ENV指令创建环境变量
    2、可多次使用ENV来创建多个环境变量
  • EXPOSE
    1、EXPOSE指令宣告镜像启动时暴露的端口,运行容器时默认映射的端口
    2、如果需要暴露多个端口,可依次列在EXPOSE后面
    3、如果要指定端口协议,格式为“EXPOSE 端口号/协议”,例如:“EXPOSE 80/tcp”
  • VOLUME
    1、VOLUME指令将容器中的文件或目录挂载到宿主机上
    2、使用VOLUME指令挂载的文件或目录自动映射到宿主机的/var/lib/docker/volumes/volume name/_data目录下
    3、删除容器时,由容器映射出来的数据默认不会同时被删除;如果需要同时删除,需要在删除容器时添加-v选项
  • CMD
    1、CMD指令设置镜像启动时执行的命令
    2、CMD后面的命令可以被运行容器时运行的命令所覆盖
  • ENTRYPOINT
    1、ENTRYPOINT指令设置镜像启动时执行的命令
    2、ENTRYPOINT与CMD不同,所执行的命令不会被覆盖,后面一般是一个脚本,用于容器启动时执行一些初始化配置
    3、ENTRYPOINT和CMD同时存在时,CMD中的内容会作为ENTRYPOINT的参数或选项,ENTRYPOINT要具备执行脚本的能力,一般会在脚本的最后加个 exec "$@"执行所有参数
#!/bin/bash


if [ ! -z $CONTENT ]; then
    echo "$CONTENT" > /usr/share/nginx/html/index.html
fi

exec "$@"

4、如果要在脚本中运行多个命令,前面的命令要加&在后台运行,最后一个在前台运行,否则如果都在前台只会运行第一个,如果都在后台最后一个命令执行完就推出了

Dockerfile建议
  • 尽可能选择轻量级基础镜像
  • 优化镜像层缓存
  • 尽可能减少镜像层数
  • 分阶段构建
  • 尽量将Dockerfile相关文件放在同一目录


    优化前

    优化后
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容