镜像的分层结构
- 共享宿主机的kernel
- base镜像提供的是最小的Linux发行版
- 同一docker主机支持运行多种Linux发行版采用分层结构的最大好处是:共享资源
- 新镜像是从 base 镜像一层一层叠加生成的。每安装一个软件,就在现有镜像的基础上增加一层。
Docker镜像要采用分层结构
共享资源
base镜像
base 镜像简单来说就是不依赖其他任何镜像,完全从0开始建起。
其他镜像都是建立在他的之上,可以比喻为大楼的地基
base 镜像不依赖其他镜像,从 scratch 构建;其他镜像可以之为基础进行扩展。
所以,能称作 base 镜像的通常都是各种 Linux 发行版的 Docker 镜像,比如 Ubuntu, Debian, CentOS 等。
镜像的写时复制特性
Docker的这种机制我们称之为写时复制。
镜像是用来创建容器的,是容器的只读模板,默认可以从 docker hub 上下载
commit构建镜像
docker commit构建新镜像三部曲:
- 运行容器
- 修改容器
- 将容器保存为新的镜像
缺点:
- 效率低、可重复性弱、容易出错
- 使用者无法对镜像进行审计,存在安全隐患
docker ps
将容器保存为新的镜像
docker commit 3be43c7fa968 busybox:v1
查看指定镜像的创建历史
docker history busybox:latest
docker history busybox:v1
发现v1中使用了原来的busybox的两层,并且在上面新建了一层,叠加在上面
docker ps
docker rm -f 3be43c7fa968 #删除正在运行的容器需要-f参数强制删除
docker run -it --rm busybox:v1
dockerfile方式
demo1:拷贝文件
COPY:把文件从build context复制到镜像
支持两种形式:COPY src dest 和 COPY ["src", "dest"]
src必须指定build context中的文件或目录
创建一个Dockerfile
1.dockerfile的目录不要再根目录下,因为默认创建时会把当前目录的所有数据发送给docker引擎,如果在根目录下,就会把根下的所有数据发送给docker进行构建,这显然时不合理的
2.COPY参数要求要拷贝的文件必须在当前目录,不能写绝对路径,只能是相对路径。拷贝的目的地可以是目录或文件
mkdir docker
cd docker/
vim Dockerfile
FROM busybox #指定开始的镜像,若镜像不存在,会去拉取该镜像
COPY testfile / #把当前目录下的testfile文件拷贝到容器的根目录下
echo redhat > testfile
删除之前的镜像(没有做过之前的实验可忽略此步骤)
docker images
docker rmi busybox:v1
docker rmi busybox:v2
docker images
构建镜像
docker build -t demo:v1
docker history demo:v1
demo2:RUN在容器中运行命令
RUN:在容器中运行命令并创建新的镜像层,常用于安装软件包:
RUN yum install -y vim
修改Dockerfile
<font color=dahoc>step1 修改Dockerfile:
vim Dockerfile
FROM busybox
COPY testfile /
RUN echo hello nigar !! > file1
构建镜像
docker build -t demo:v2
测试
docker run -it demo:v2
demo3:镜像分层的缓存特性
修改Dockerfile
vim Dockerfile
FROM busybox
COPY testfile /
RUN echo hello nigar !! > file1
RUN echo hello nigar !! > file2
构建镜像
docker build -t demo:v3
测试
demo4:ADD自动解压文件
ADD:用法与COPY类似,不同的是src可以是归档压缩文件,文件会被自动解压到dest,也可以自动下载URL并拷贝到镜像:
ADD html.tar /var/www
ADD http://ip/html.tar /var/www
放一个nginx的压缩包在/root/docker下,修改Dockerfile
vim Dockerfile
FROM busybox
ADD nginx-1.16.1.tar.gz /
构建镜像
docker build -t demo:v4 .
测试
demo5:ENV定义环境变量
修改Dockerfile
vim Dockerfile
FROM busybox
ENV hostname server1
ADD nginx-1.16.1.tar.gz / #定义环境变量hostname为server1
构建镜像
docker build -t demo:v5 .
测试
demo6:VOLUME声明数据卷,在封装应用容器时常用
修改Dockerfile
vim Dockerfile
FROM busybox
ENV hostname server1
ADD nginx-1.16.1.tar.gz /
VOLUME ["/data"]
构建镜像
docker build -t demo:v6 .
查看镜像的创建历史
进入容器,创建文件
查看demov6的挂载信息
进入目录,查看到刚刚创建的文件file
释放数据卷
demo7:WORKDIR设置镜像中的当前工作目录
测试
demo8:CMD与ENTRYPOINT
测试