Docker Note

镜像

「镜像由文件系统叠加」

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 //登录到 Hub

  • docker pull imagename:tag

  • 镜像目录 /var/lib/docker

  • 容器目录 /var/lib/docker/containers

  • 用户仓库 - 用户名/仓库名 顶层仓库 - 仓库名

构建镜像

  1. docker commit //不推荐

只提交镜像和容器状态的差异部分,容器 ID,目标镜像仓库名/镜像名,-m 提交信息,–author 作者信息,:标签。

  1. 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 之后。 只能被继承一次

  1. 自动构建

连接含 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