1 Docker架构概述
- Docker提供了一个开发、打包、运行app的平台
- 把app和底层infrastructure隔离开来
Docker Engine
- 后台进程
- REST API Server
- CLI 接口
Docker架构
底层技术支持
Namespace:做隔离 pid、net、ipc、mnt、uts Control groups:做资源限制 Union file systems:Container 和 image 的分层
2 Docker Image概述
- 文件和meta data的集合( root filesystem )
- 分层的,并且每一层都可添加改变
- 删除文件,成为一个新的image
- 不同image可共享相同的layer
- image 本身是 read-only
- dockerimage结构
从基本的看起,一个典型的 Linux 文件系统由 bootfs 和 rootfs 两部分组成,
- bootfs(boot file system) 主要包含 bootloader 和 kernel,bootloader 主要用于引导加载 kernel,当 kernel 被加载到内存中后 bootfs 会被 umount 掉
- rootfs (root file system) 包含的就是典型 Linux 系统中的/dev,/proc,/bin,/etc 等标准目录和文件
- docker image 中最基础的两层结构
不同的 linux 发行版(如 ubuntu 和 CentOS ) 在 rootfs 这一层会有所区别,体现发行版本的差异性。 传统的 Linux 加载 bootfs 时会先将 rootfs 设为 read-only,然后在系统自检之后将 rootfs 从 read-only 改为 read-write,然后就可在 rootfs 上进行读写操作了 但 Docker 在 bootfs 自检完毕之后并不会把 rootfs 的 read-only 改为 read-write,而是利用 union mount(UnionFS 的一种挂载机制)将 image 中的其他的 layer 加载到之前的 read-only 的 rootfs 层之上,每一层 layer 都是 rootfs 的结构,并且是read-only 的。所以,我们是无法修改一个已有镜像里面的 layer 的!只有当我们创建一个容器,也就是将 Docker 镜像进行实例化,系统会分配一层空的 read-write 的 rootfs ,用于保存我们做的修改。一层 layer 所保存的修改是增量式的,就像 git 一样。
2.2 image的获取
image的获取-1
image的获取-2
3 DIY Base Image
容器镜像
1 必备常识
- 通过Image创建( copy )
- 在Image layer(只读)之上建立一个container layer (可读写)
- 可类比OOP:类和实例 image 相当于一个类,container 就是每个实例
- Image负责app的存储和分发,Container负责运行app
Dockerfile
代码语言:javascript复制FROM scratch
ADD hello /
CMD ["/hello"]
代码语言:javascript复制docker container ls
当前无运行的容器
代码语言:javascript复制docker container ls -a
显示所有运行和已退出的容器
CONTAINER ID | IMAGE | COMMAND | CREATED STATUS PORTS NAMES |
---|---|---|---|
// 如果本地没有,则默认拉取最新的远程镜像
docker run centos
但如果直接这么运行,直接就退出了,啥也看不到。
这时就想要
2 交互式运行容器
代码语言:javascript复制docker run -it centos
代码语言:javascript复制docker container ls -a
现在查看就是 up 状态了
- 现在退出刚才运行的 centos
- 再次查看容器状态
- 可还发现有很多重复的退出的容器 centos,怎么删除重复的呢
- 经过一顿
docker container rm
即可
3 构建自定义的 Docker image
- 先进入原 image centos
由于本身没有 vim,我们正好安装下
代码语言:javascript复制yum install -y yum
安装完成后,退出该 image
- 提交刚才安装过 vim 的新的image
- 可见的确大点
- 我们直接见证 image 的变迁历史即可
但不推荐这种创建新 image 的方式,因为别人不知道这个 image 到底经历了啥,即是否安全呢?
所以我们就常通过创建 Dockerfile 文件明晰 image 变化。
代码语言:javascript复制FROM centos
RUN yum install -y vim
代码语言:javascript复制docker build -t javaedge/centos-vim-new .
从日志可见中间有个临时中转生成的 image,最后完成时被删除。
代码语言:javascript复制[ ] Building 20.9s (6/6) FINISHED
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 77B 0.0s
=> [internal] load metadata for docker.io/library/centos:latest 0.0s
=> [1/2] FROM docker.io/library/centos 0.0s
=> => resolve docker.io/library/centos:latest 0.0s
=> [2/2] RUN yum install -y vim 20.3s
=> exporting to image 0.5s
=> => exporting layers 0.5s
=> => writing image sha256:6fa5d61ccad62a224b2fd2d8d8526aa52bc12f42c6b27ab31e7df1f62768705d 0.0s
=> => naming to docker.io/javaedge/centos-vim-new 0.0s
所以以后直接分享 Dockerfile 即可,别人拿到文件就能创建自己想要的 image。