[云原生1.] Docker镜像的创建

文章目录

  • 1. Docker镜像概述
    • 1.1 简介
    • 1.2 镜像结构的分层详解
  • 2. 创建Docker镜像的方法类别
    • 2.1 基于已有镜像创建
      • 2.1.1 创建流程
      • 2.1.2 示例
    • 2.2 基于本地模板创建
      • 2.2.1 示例
    • 2.3 基于Dockerfile 创建
  • 3. 联合文件系统(UnionFS)
    • 2.1 简介
    • 2.2 特性
  • 4. Dockerfile的详细介绍
    • 4.1 常用相关操作命令
      • 4.1.1 命令选项
      • 4.1.2 CMD 和 ENTRYPOINT 的区别
      • 4.1.3 ADD 和 COPY 的区别
    • 4.2 Dockerfile镜像的构建步骤
    • 4.3 示例
      • 4.3.1 建立工作目录
      • 4.3.2 创建并编写Dockerfile文件
      • 4.3.3 编写执行脚本
      • 4.3.4 创建测试页面
      • 4.3.5 使用Dockerfile生成镜像
      • 4.3.6 使用新的镜像运行容器并测试
      • 4.3.7 测试
  • 5. 如何缩小镜像的体积大小?

1. Docker镜像概述

1.1 简介

镜像是创建容器的基础

是一个只读的模板文件,里面包含运行容器中的应用程序所有需要的所有内容(应用程序文件、配置文件、运行库文件、依赖包等)

1.2 镜像结构的分层详解

[云原生1.] Docker镜像的创建_第1张图片
Docker 镜像由多个只读层组成,每个层都包含了文件系统的一部分。

这些层按照从底向上的顺序依次叠加,形成一个完整的镜像

镜像的最底层是一个基础镜像(Base Image),上面叠加了一系列更高层的镜像,每个层都是前一个层的增量变化。

在容器启动时,Docker 引擎会将这些层通过联合文件系统合并成一个容器文件系统

在容器运行过程中,Docker 引擎将修改操作写入一个可写层(Writeable Layer),该层仅保存容器运行时的状态和数据。

这种分层和联合文件系统的设计使得镜像的创建和传播非常高效,节省了存储空间和下载时间。

2. 创建Docker镜像的方法类别

创建镜像有三种方法,分别为

  • 基于已有镜像创建
  • 基于本地模板创建
  • 基于Dockerfile创建。

2.1 基于已有镜像创建

基于已有镜像创建主要使用 docker commit 命令。

#基本格式
docker commit [选项] 容器ID/名称 仓库名称:[标签]

##常用选项##
-m 说明信息;
-a 作者信息;
-p 生成过程中停止容器的运行。

2.1.1 创建流程

先用现有镜像创建启动容器 docker run
再进入容器进行内容更新 docker exec
最后提交成新的镜像 docker commit

2.1.2 示例

#首先启动一个镜像,在容器里做修改
docker create -it centos:7 /bin/bash

docker ps -a
#查看当前容器

在这里插入图片描述

#然后将修改后的容器提交为新的镜像,需要使用该容器的 ID 号创建新镜像
docker commit -m "new" -a "centos" a733d9ef8f01  centos:test

docker images

在这里插入图片描述

2.2 基于本地模板创建

通过导入操作系统模板文件生成镜像,模板可以从 OPENVZ 开源项目下载。

#下载地址为http://openvz.org/Download/template/precreated

2.2.1 示例

#从网站下载
wget http://download.openvz.org/template/precreated/debian-7.0-x86-minimal.tar.gz

[云原生1.] Docker镜像的创建_第2张图片

#导入为镜像
cat debian-7.0-x86-minimal.tar.gz | docker import - debian:test

[云原生1.] Docker镜像的创建_第3张图片

2.3 基于Dockerfile 创建

除了手动生成Docker镜像之外,可以使用Dockerfile自动生成镜像。

Dockerfile是由多条的指令组成的文件,其中每条指令对应 Linux 中的一条命令,Docker 程序将读取Dockerfile 中的指令生成指定镜像。

Dockerfile结构大致分为四个部分:

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

Dockerfile每行支持一条指令,每条指令可携带多个参数,支持使用以“#“号开头的注释。

3. 联合文件系统(UnionFS)

2.1 简介

Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下
AUFSOverlayFSDevicemapper 都是一种 UnionFS

Union文件系统是Docker镜像的基础
镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。

2.2 特性

一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。

#示例
docker pull nginx

[云原生1.] Docker镜像的创建_第4张图片

4. Dockerfile的详细介绍

4.1 常用相关操作命令

4.1.1 命令选项

选项 功能
FROM 指定基础镜像(是Dockerfile的第一行指令)
MAINTAINER 指定镜像维护人信息(可选)
RUN 指定Linux命令,如果要执行连续多条命令时建议用 ; 或 && 或 <
EXPOSE 指定容器应用的端口
ENV 设置镜像的环境变量
ADD/COPY 复制文件/目录到镜像里
VOLUME 指定容器的匿名数据卷
USER 指定容器的运行用户
WORKDIR 指定后续镜像层的工作目录
ARG 指定构建镜像时传入的参数变量 docker build --build-arg 变量=值
CMD/ENTRYPOINT 指定容器启动时执行的命令

4.1.2 CMD 和 ENTRYPOINT 的区别

  • 共同点:都可以用来指定容器启动命令
  • 区别:ENTRYPOINT指定的容器启动命令优先级更高,如果CMDENTRYPOINT同时存在,那么CMD指定的内容将作为ENTRYPOINT指定的容器启动命令的选项或参数使用
#容器启动时运行的命令优先级
docker run --entrypoint="命令" > 镜像里的ENTRYPOINT指定的命令 > docker run ... 镜像 命令 > 镜像里的CMD指定的命令

4.1.3 ADD 和 COPY 的区别

  • 共同点:都可以将本地的文件/目录复制到镜像里
  • 区别:ADD还可以通过URL下载文件复制到镜像里,还能将本地的压缩包解压后复制到镜像里(URL下载和压缩包解压特性不能同时使用)

4.2 Dockerfile镜像的构建步骤

  1. 先在第一行用 FROM 指令指定基础镜像
  2. 还可以再用 MAINTAINER 指定镜像维护人信息(可跳过)
  3. 之后用 RUN EXPOSE ENV ADD COPY 等指令编写构建镜像的过程
  4. 结尾用 CMD/ENTRYPOINT 指定容器启动时执行的命令
  5. 最后用 docker build -t 新镜像名:标签 . [-f Dockerfile文件路径] 命令构建镜像

4.3 示例

4.3.1 建立工作目录

mkdir  /opt/apache
cd  /opt/apache

4.3.2 创建并编写Dockerfile文件

vim Dockerfile

#基于的基础镜像
FROM centos:7
#维护镜像的用户信息
MAINTAINER this is apache image <hmj>
#镜像操作指令安装apache软件
RUN yum -y update
RUN yum -y install httpd
#开启 80 端口
EXPOSE 80
#复制网站首页文件
ADD index.html /var/www/html/index.html

//方法一:
#将执行脚本复制到镜像中
ADD run.sh /run.sh
RUN chmod 755 /run.sh
#启动容器时执行脚本
CMD ["/run.sh"]


//方法二:
ENTRYPOINT [ "/usr/sbin/apachectl" ]
CMD ["-D", "FOREGROUND"]

4.3.3 编写执行脚本

vim  run.sh

rm -rf /run/httpd/*							#清理httpd的缓存
/usr/sbin/apachectl -D FOREGROUND			#指定为前台运行

#因为Docker容器仅在它的1号进程(PID为1)运行时,会保持运行。如果1号进程退出了,Docker容器也就退出了。

4.3.4 创建测试页面

echo "this is test web" > index.html

[云原生1.] Docker镜像的创建_第5张图片

4.3.5 使用Dockerfile生成镜像

docker build -t httpd:centos .   		
#注意别忘了末尾有"."

[云原生1.] Docker镜像的创建_第6张图片

4.3.6 使用新的镜像运行容器并测试

#使用新镜像运行容器
docker run -d -p 1216:80 httpd:centos

在这里插入图片描述

docker ps -a

在这里插入图片描述

#######如果有网络报错提示########
[Warning] IPv4 forwarding is disabled. Networking will not work.

解决方法:
vim /etc/sysctl.conf
net.ipv4.ip_forward=1

sysctl -p
systemctl restart network
systemctl restart docker

4.3.7 测试

http://192.168.67.100:1216

[云原生1.] Docker镜像的创建_第7张图片

5. 如何缩小镜像的体积大小?

  1. 尽可能的采用小体积的基础镜像
  2. 尽可能的减少Dockerfile指令的数量
  3. 在RUN指令里添加安装软件后清空yum/apt缓存、软件包的命令
  4. 使用多级(多阶段)构建的方法
FROM 第一阶段的基础镜像 AS 别名
......
FROM 第二阶段的基础镜像
COPY --from=别名  第一阶段构建的文件/目录  当前阶段的路径
.....
CMD/ENTRYPOINT 指定容器启动时执行的命令

你可能感兴趣的:(云原生,docker,容器)