一.docker镜像的分层结构

docker查看镜像构建 docker镜像构建的三种方式_docker

docker查看镜像构建 docker镜像构建的三种方式_Dockerfile_02


特点:共享宿主机的内核(内核使用的物理机的内核)

base镜像提供的是最小linux的发行版(镜像层最多127层)

同一个docker主机可以运行多种linux发行版

由于docker采用的分层结构所以资源可以共享(即共同使用的资源只需要存在一份)

copy-on-write可写容器层,在使用时是将下面的镜像层内容复制到容器层进行修改并对修改的内容进行保存,而镜像层的内容是只读的不会被修改。

docker的读取方式采用的是从上至下的读取。

二.镜像的构建

(1)docker commit构建
第一步 运行容器
docker run -it --name 容器名 镜像
docker start 容器名 开启容器 ctrl+D (退出) ctrl+p+q(暂时挂起后台运行)
docker attach 容器名 连接上容器
第二步 修改容器内容
vi 或者 echo xxxx> 文件名
第三步 将运行容器保存为新的镜像
docker commit vm1( 容器) test:v1 镜像

docker images查看镜像状态
docker ps -a 查看容器状态
docker rm 容器 #删除容器
docker -f rm 容器 #强制删除容器
(2)dockerfile的创建
在根目录创建一个dockerfile文件夹
mkdir dockerfile
vim dockerfile
FROM busybox
RUN echo testfile > file1
docker build -t test:v2
dockerfile的参数
FROM 每个Dockerfile的第一条指令都应该是FROM。FROM指令指定一个已经存在的镜像,后续指令都是将基于该镜像进行,这个镜像被称为基础镜像(base iamge)。在这里ubuntu:latest就是作为新镜像的基础镜像。也就是说Dockerfile构建的新镜像将以ubuntu:latest操作系统为基础。在运行一个容器时,必须要指明是基于哪个基础镜像在进行构建。

MAINTAINER MAINTAINER指令,这条指令会告诉Docker该镜像的作者是谁,以及作者的邮箱地址。这有助于表示镜像的所有者和联系方式

RUN 在这些命令之后,RUN指令会在当前镜像中运行指定的命令。这里我们通过RUN指令更新了APT仓库,安装nginx包,并创建了一个index.html文件。像前面说的那样,每条RUN指令都会创建一个新的镜像层,如果该指令执行成功,就会将此镜像层提交,之后继续执行Dockerfile中的下一个指令。默认情况下,RUN指令会在shell里使用命令包装器/bin/sh -c 来执行。如果是在一个不支持shell的平台上运行或者不希望在shell中运行(比如避免shell字符串篡改),也可以使用exec格式的RUN指令,通过一个数组的方式指定要运行的命令和传递给该命令的每个参数:RUN [“apt-get”, “install”, “-y”, “nginx”]

EXPOSE EXPOSE指令是告诉Docker该容器内的应用程序将会使用容器的指定端口。这并不意味着可以自动访问任意容器运行中服务的端口。出于安全的原因,Docker并不会自动打开该端口,而是需要你在使用docker run运行容器时来指定需要打开哪些端口。可以指定多个EXPOSE指令来向外部公开多个端口,Docker也使用EXPOSE指令来帮助将多个容器链接。

COPY 把文件从build context复制到镜像,支持两种形式:COPY src dest 和 COPY [“src”, “dest”],src必须指定build context中的文件或目录

ADD 用法与COPY类似,不同的是src可以是归档压缩文件,文件会被自动解压到dest,也可以自动下载URL并拷贝到镜像:ADD html.tar /var/www

ENV 设置环境变量,变量可以被后续的指令使用:ENV HOSTNAME sevrer1.example.com
WORKDIR 为RUN、CMD、ENTRYPOINT、ADD和COPY指令设置镜像中的当前工作目录,如果目录不存在会自动创建。

CMD 与 ENTRYPOIN 这两个指令都是用于设置容器启动后执行的命令,但CMD会被docker run后面的命令行覆盖,而ENTRYPOINT不会被忽略,一定会被执行。docker run后面的参数可以传递给ENTRYPOINT指令当作参数。Dockerfile中只能指定一个ENTRYPOINT,如果指定了很多,只有最后一个有效。