镜像
「镜像由文件系统叠加」
bootfs - 最底端的引导系统,容器启动后会移入内存,而引导系统会被卸载(unmount)以留出更多内存给 initrd 磁盘镜像使用。
rootfs - 传统 Linux 引导先只读加载 root,引导结束完成完整性检查后切换为读写模式。Docker 中 root 永远只能是只读状态,利用联合加载(union mount)在 root 文件系统层上加载更多的只读文件系统。

「一个镜像可以放到另一个镜像顶部」
位于下层的是父镜像(parent image),最底部的称为基础镜像(base image)。从一个镜像启动容器时,Docker 会在镜像最顶层加载一个读写文件系统。
初始读写层为空,当文件发生变化时,应用到读写层。如修改文件,先将文件从只读层复制到读写层,只读版本依然存在,被读写层的副本隐藏,这就是 COW——写时复制(copy on write)。
创建一个新容器的时候,Docker 会构建一个镜像栈,并在顶层添加一个读写层。这个读写层加上下面的只读层以及一些配置数据,构成一个容器。
docker run
- [-i] STDIN
- [-t] 伪tty
- [-v] 挂载卷 :ro :rw
- [–name] 设置容器名
- [-d] detached
- [-p] port
- [-P] Dockerfile’s EXPOSE
- [-e] 环境变量
- [-w] 工作目录
- [–link] 连接容器
- [–cidfile] 截获容器 ID 并将其保存到指定文件
docker start | stop | ps | attach | images | search | rm | rmi | build
docker login
//登录到 Hubdocker pull imagename:tag
镜像目录
/var/lib/docker
容器目录
/var/lib/docker/containers
用户仓库 -
用户名/仓库名
顶层仓库 -仓库名
构建镜像
- docker commit //不推荐
只提交镜像和容器状态的差异部分,容器 ID,目标镜像仓库名/镜像名,-m 提交信息,–author 作者信息,:标签。
- docker build 和 Dockerfile 文件
Dockerfile 所在目录就是构建环境(build environment),Docker 称此环境为上下文(context)或构建上下文(build context),构建时将构建上下文和该上下文中的文件和目录上传到 Docker 守护进程。
指令逐条执行,每条指令都会创建一个新的镜像层并对镜像进行提交。
FROM
第一条指令,指定基础镜像(base image)
MAINTAINER
作者信息,邮件地址
RUN
在当前镜像内执行命令,默认在 shell 里使用命令包装器
/bin/sh -c
执行。如在不支持 shell 平台运行或不希望在 shell 中运行(比如避免 shell 字符串篡改),可以使用exec 格式的 RUN 指令
RUN ["apt-get", "install", "-y", "nginx"]
EXPOSE
使用容器的指定端口。出于安全原因,不自动打开,需在 docker run 的时候指定打开哪些端口。可以指定多个 EXPOSE 指令公开多个端口。也可帮助多个容器连接。
ENV
环境变量,比如设置 REFRESHED_AT 2016-05-15,命中 ENV 指令时重置 apt-get 缓存。持久保存到镜像创建的容器中。
CMD
指定容器器启动时执行的命令。如有多条只执行最后一条。可被 run 参数覆盖。推荐使用数组语法以原样执行。
ENTRYPOINT
run
中指定参数作为参数再次传递给 ENTRYPOINT 指定的命令。ENTRYPOINT ["/usr/sbin/nginx"]
CMD ["-h"]
WORKDIR
设置容器内工作目录,ENTRYPOINT CMD 在此目录下执行,-w 可覆盖。
USER
指定镜像以何用户运行,默认 root。
用户名/UID:组名/GID
VOLUME
基于此镜像创建的容器创建一个挂载点。例:
["/opt/project"]
ADD
构建目录下的文件/目录(以是否“/”结尾判断) -> 目的文件位置(镜像)。不存在将被创建,默认 UID/GID 0。
COPY
同 ADD。不作提取/解压。
ONBUILD
为镜像添加 trigger,被用作其它镜像的基础镜像时触发。构建中插入新指令,(被认为)紧跟在 FROM 之后。 只能被继承一次。
- 自动构建
连接含 Dockerfile 的仓库,推送代码即触发一次镜像构建。
容器网络
可以直接使用 172.17._._,但容器重启后地址可能会改变。
172.16 ~ 172.30
docker0 虚拟以太网桥,连接容器和本地宿主网络。每创建一个容器就创建一组互联的网络接口,一端作为容器里的 eth0,另一端 veth* 是宿主机接口,绑定到 docker0 网桥。
--link
连接容器名:连接后容器的别名
通过连接容器,可以让父容器直接访问任意子容器的公开端口,而不需要使用 -p 标志公开端口。被连接的容器必须运行在同一个 Docker 宿主机上。Docker 在父容器的 /etc/hosts 文件写入连接信息,还有包含连接信息的环境变量。重启自动更新 hosts。
出于安全或其它原因,可以强制 Docker 只允许有连接的容器之间互相通信。需要在启动 Docker 守护进程时加上 --icc=false
标志,关闭所有没有连接的容器间的通信。
网络模式
host
共享宿主机网络 namespace
bridge [默认]
连接到 docker0 网桥
none
不配置网络
container
与容器共享网络 namespace