Docker镜像原理
- Docker镜像是由特殊的文件系统叠加而成
- 最底层是bootfs,并使用宿主机的bootfs
- 第二层是root文件系统rootfs,称为base image
- 然后在往上可以叠加其他的镜像文件
- 统一文件系统(Union File System)技术能够将不同的层整合成一个文件系统,为这些层提供了一个统一的视角,这样就隐藏了多层的存在,在用户的角度看来,只存在一个文件系统。
- 一个镜像可以放下另一个镜像的上面,位于下面的镜像称为父镜像,最底层的镜像称为基础镜像。
- 当从一个镜像启动容器时,docker会在最顶层加载一个读写文件系统作为镜像。
镜像制作
1,容器转为镜像
docker commit 容器id 镜像名称:版本号
#压缩镜像文件
docker save -o 压缩文件名称 镜像名称:版本号
#解压缩
docker load -i 压缩文件名称
注意:镜像不能传输,压缩文件可以传输
2,dockerfile
- dockerfile是一个文本文件
- 包含了一条条指令
- 每一条指令构建一层镜像,基于基础镜像,最终建成一个新的镜像
- 对于开发人员:可以为开发团队提供一个完全一致的开发环境
- 对于测试人员:可以直接拿开发室所够贱的镜像或者通过dockerfile文件构建一个新的镜像开始工作了
- 对于运维人员:在部署时,可以实现应用的无缝移植
Dockerfile指令(上)
#First Dockerfile
FROM ubuntu:14.04
MAINTAINER becomehero
RUN apt-get update
RUN apt-get install nginx
#RUN apt-get update && apt-get install nginx
EXPOSE 80
#Comment 注释信息
INSTRUCTION argument指令是以大写指令名开始,后面是参数
- FROM
from <IMAGE>
from <IMAGE>:<TAG>
#必须是已经存在的镜像
#基础镜像
#dockerfile中第一条非注释命令
- MAINTAINER
MAINTAINER <name>
#指定镜像的作者信息,包含镜像的所有者和联系信息
-
RUN
指定当前镜像中运行的命令 -
RUN (shell模式)
/bin/sh -c command
RUN echo hello -
RUN [“executable”,“param1”,“param2”] (exec模式)
可以指定其他形式的shell来运行
RUN ["/bin/bash","-c",“echo hello”]
注意:每一个run指定都会在当前镜像的上层创建一个新的镜像来运行指定的命令。 -
EXPOSE
EXPOSE […]
指定运行该镜像容器使用的端口,可以指定一个或多个端口
构建指定了,运行时也还是要指定$ docker run -p 80 …
Dockerfile指令(下)
- CMD
- ENTERYPOINT
- ADD
- COPY
- VOLUME
- WORKDIR
- ENV
- USER
- ONBUILD
CMD
CMD command param1 param2(shell模式)
CMD [“executable”,“param1”,“param2”] (exec模式)
CMD [“param1”, “param2”] (作为ENTRYPOINT指令的默认参数)
注意:RUN是在容器构建时运行,CMD容器运行时运行。docker run 如果指定了容器运行时的命令,CMD指令将被覆盖
ENTRYPOINT
不会被覆盖
ADD/COPY 源文件 目标文件
ADD 包含类似tar的解压功能
如果单纯复制文件,docker推荐使用COPY
VOLUME ["/data"]
WORKDIR /path/to/workdir#通常使用绝对路径
ENV
USER daemon(不指定默认使用root)
USER nginx#使用nginx用户
USER user
USER user:group
USER user: gid
UNBUILD [INSTRUCTION]
镜像触发器
当一个镜像被其他镜像作为基础镜像时执行
会在构建实插入指令
案例:自定义centos7镜像,要求:
1,默认登录路径为/usr
2,可以使用vim
#定义一个父镜像
FROM centos7
#定义作者信息
MAINTAINER test
#执行安装vim
RUN yum install -y vim
WORKDIR /usr
CMD /bin/bash
案例:定义dockerfile,发布springboot项目
…
docker服务编排
- 服务编排概念
- docker compose概述
- 案例