Docker简介
- Docker依赖写时复制(copy-on-write),使修改应用程序非常迅速。
- Docker推荐单个容器只运行一个应用或进程,鼓励面向服务的架构和微服务架构。
- Docker的核心组件包括:
- Docker客户端与服务器:Docker是一个C/S架构,客户端连接到服务端(Docker守护进程)执行相关命令,Docker提供CLI和RESTful API两种控制方式。
- Docker镜像:用户基于镜像来运行容器,镜像是基于联合(Union)文件系统的一种层式结构,由一系列指令一步一步构建出来。
- Registry:保存用户构建的镜像,类似Maven的中央仓库。
- 容器:容器基于镜像启动,其中运行应用程序。
容器
- docker run将运行指定镜像的容器,如果本地不存在该进行则去Docker Hub Registry下载。
- 运行的容器的主机名就是容器的ID,是一个UUID,在docker命令知道容器ID时可以类似git那样只写前几位。
- 正常情况下当退出容器时该容器就已经停止了。
- 容器默认不会打开端口,需要在docker run -p/-P
- -P可以在宿主机上随机选择一个位于49153~65535中的某个端口与容器内部开放端口映射
- -p则自己指定映射,完整格式为 宿主ip:宿主port:docker port 其中前两者可以省略,省略则自动分配
镜像
- Docker镜像是由文件系统叠加而成。
- 最底层是引导文件系统,即bootfs,启动后会被移到内存中而引导文件系统则会被卸载。
- 第二层是root文件系统rootfs,是一种或多种操作系统。
- 后续就是利用联合加载(union mount)技术在root层加载更多的只读文件。
联合加载指一次同时加载多个文件系统,但是外面看起来只能看到一个文件系统。
- 最顶端是一个可读写文件系统,用于Docker中的应用运行。修改一个文件时这个文件首先会从该读写层下面的只读层复制到读写层,修改后只读版本依然存在,但是被上层的读写层覆盖,这即写诗复制(copy-on-write)
- Docker镜像中除了顶层的文件系统其他均为只读。
Register
- 仓库名后加冒号和标签名指定仓库中某一唯一镜像。
ubuntu:12.10
- 仓库包括用户仓库(user repository)和顶层仓库(top-level repository)
- 用户仓库命名由用户名和仓库名组成,如
suolu/ubuntu
- 顶层仓库由Docker公司和优质基础镜像厂商管理,用户基于这些镜像进行构建自己的镜像。
- pull镜像时如果不指定镜像的tag,则默认下载latest标签的镜像。
Dockerfile
- 一般不推荐用docker commit构建镜像而用Dockerfile的定义文件和docker build命令构建镜像。
- 保存Dockerfile的目录即构建环境,Docker称为上下文或者构建上下文,Docker会在构建镜像时将构建上下文和该上下文中的文件和目录上传到Docker守护进程。
- Dockerfile中执行流程如下:
- Dock而从基础镜像运行一个容器
- 执行一条指令,对容器做修改
- 执行类似docker commit的操作,提交一个新的镜像层
- Docker再基于刚刚提交的镜像层运行一个新容器
- 执行Dockerfile中的下一条指令
- 构建时每执行一条指令都会返回一个镜像ID,当构建失败可通过docker run该镜像做调试。
- 构建过程中之前的镜像层都可以看作缓存,当重新构建时可以从失败命令的前一个镜像层开始,除非build命令设置--no-cache。
格式
-
FROM,指定基础镜像,后续指令均基于该镜像
-
MAINTAINER,指定作者以及邮箱等
-
RUN,该指令会在shell中使用通过
/bin/sh -c
来执行 -
EXPOSE,告诉Docker服务端容器暴露的端口号,供互联系统使用。
-
CMD,指定容器启动时要运行的命令。同一个Dockerfile只认最后一个,且docker run中的命令将覆盖CMD。
CMD ["/bin/bash"] //默认启动容器打开一个shell
- ENTRYPOINT,与CMD类似,但是该指令提供的命令不会被docker run覆盖,docker run中命令将作为该指令中的命令的参数。
- WORKDIR,为后续的 RUN 、 CMD 、 ENTRYPOINT 指令配置工作目录。
- ENV,构建镜像过程中增加环境变量。
- USER,指定该镜像启动时所使用的用户。
- VOLUME,向镜像创建容器添加卷。
- ADD,将构建环境下的文件和目录复制到镜像中。对于源是tar或RUL能自动解析。
- COPY,与ADD类似,但是其只是简单的复制,不会做其他操作。
- ONBUILD,添加触发器,其执行时机在于被当作其他基础镜像时,在FROM后马上执行。