docker入门学习文档二
第一章 深入了解容器
1.1 容器技术结构图
从图中可以看出,绿蓝红三种颜色的层组合起来就是一台Host主机,在Kernel层之上通过Container技术的三个要点:隔离(namespace),限制(cgroup),记录(chroot)
来虚拟出一个个容器,并管理他们
隔离:
通过namespace机制来避免一些系统级的冲突。
因为每个容器都可以当做一个独立的OS,那么他们就拥有自己的pid进程号等信息,如果这些东西和Host中的相冲突怎么办?毕竟容器不是自己在虚拟化的环境中独立安装一个OS,而是依赖于Host的OS
这时候就可以通过namespace来避免这些冲突,每个容器拥有自己的namespace来管理各自的系统信息
限制:
在Host看来,每个Container都只是一个普通的进程(当时在Container中的应用看来,这些Container都是一个OS),那么怎么来限制这些进程的CPU使用,时间片等资源呢?
cgroup是linux内核提供的限制,记录和隔离进程组所用的资源
记录:
上面说过,每个Container都可以当做一个独立的OS,既然它是一个OS那么肯定有自己的文件系统,那么问题又来了,每个Container都有自己的FS,Host也有自己的FS,这么多独立的FS要怎么管理?
chroot隔离根文件系统,怎么个说法呢?例如Host的根目录下有a,b目录,并且分别被两个Container当做其根目录。在Host角度来看,ab只是根目录下的两个普通文件夹而已,而对于Container a来说/a就是其根目录;对于Container b来说/b就是其根目录
1.2 docker层次图
*
最底层的lxc,aufs都收kernel内核中运行的
lxc:Linux Container,是Linux上的一种实现Container虚拟化的技术,早期的Docker就基于lxc实现的,最新的版本中已经用libcontainer代替了
aufs:Advanced multi layer Unification FileSystem,翻译成中文就是高级的,分层的,联合的文件系统,它最总要的内容就是可以将两个目录合并在一起,并可以设置操作权限(read-only/read-write)。Docker使用aufs来实现分层的文件管理
倒数第二层的Debian和BusyBox都是在Kernel之上的Image,Image就是一个镜像,可以通过这个镜像来创建多个Container,Image在aufs中是只读的
中间层就是通过Image创建出来的Container,Container在aufs中是可读可写的,通过一个只读的Image创建出一个Container,可以对这个Container进行修改(如上图中添加了一个emacs),然后在打包成一个不可读的Image,而这个Image又可以创建出基于它的Container
通过上面的描述不难得出一个结论:Docker中的Image是层层关联的,每个Image都有一个Parent Image(只有一个除外,那就是Base Image,即最基本的镜像,其他的Image都是在Base Image基础上得到的),使用一个Image时,Docker会找到其Parent Image直到Base Image
Docker在启动Container的时候, aufs会将下层的文件系统设置成read-only,然后将Container的read-write挂载到下层的文件系统之上,构成一个完整的文件系统
在Container中所做的修改不会影响到其所属的Image(因为它是只读的,通过COW技术将要修改的文件复制到read-write层并改写),如果没有保存这个Container(将其打包成一个新的Image),那么当这个Container生命周期结束之后,所做的修改都会消失
这种机制的好处就是,每个阶段的Image都可以进行大量的重用,在创建Container的时候只需要加入不同的部分即可,而不用每次都将全部所需加载一遍
第二章 docker-compose
2.1 docker-compose简介
Compose 项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排。
我们知道使用一个 Dockerfile 模板文件,可以让用户很方便的定义一个单独的应用容器。然而,在日常工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况。
例如要实现一个 Web 项目,除了 Web 服务容器本身,往往还需要再加上后端的数据库服务容器,甚至还包括负载均衡容器等。
Compose 恰好满足了这样的需求。
它允许用户通过一个单独的 docker-compose.yml 模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)。
Compose 中有两个重要的概念:
- 服务 (service):
一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。 - 项目 (project):由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml 文件中定义。
Compose 的默认管理对象是项目,通过子命令对项目中的一组容器进行便捷地生命周期管理。
Compose 项目由 Python 编写,实现上调用了 Docker 服务提供的 API 来对容器进行管理。因此,只要所操作的平台支持 Docker API,就可以在其上利用 Compose 来进行编排管理。
2.2 docker-compose 安装
2.2.1 Docker for Mac 、Docker for Windows 自带 docker-compose 二进制文件,安装 Docker 之后可以直接使用。
2.2.2 linux
在 Linux 上的也安装十分简单,从 官方 GitHub Release [https://github.com/docker/compose/releases] 处直接下载编译好的二进制文件即可。
例如,在 Linux 64 位系统上直接下载对应的二进制包。
$ sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose
国内源安装
curl -L https://get.daocloud.io/docker/compose/releases/download/1.24.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
2.2.3 pip
x86_64 架构的 Linux 建议按照上边的方法下载二进制包进行安装,如果计算机的架构是 ARM (例如,树莓派),再使用 pip 安装。
这种方式是将 Compose 当作一个 Python 应用来从 pip 源中安装。
执行安装命令:
sudo pip install -U docker-compose
可以看到以下的输出,证明安装成功了
Collecting docker-compose
Downloading docker-compose-1.17.1.tar.gz (149kB): 149kB downloaded
...
Successfully installed docker-compose cached-property requests texttable websocket-client docker-py dockerpty six enum34 backports.ssl-match-hostname ipaddress
第三章 docker-compose 编排容器
3.1 docker-compose 编排myblog 容器
创建docker-compose.yaml
version: "3.7"
services:
app:
image: myblog:latest
ports:
- 8081:8000
之后运行
docker-compose up -d
我们在自己浏览器中就可以打开了
可以通过docker-compose 来管理docker 容器了
第四章 docker-compose 命令详解
-d 在后台运行服务容器。
--no-color 不使用颜色来区分不同的服务的控制台输出。
--no-deps 不启动服务所链接的容器。
--force-recreate 强制重新创建容器,不能与 --no-recreate 同时使用。
--no-recreate 如果容器已经存在了,则不重新创建,不能与 --force-recreate 同时使用。
--no-build 不自动构建缺失的服务镜像。
-t, --timeout TIMEOUT 停止容器时候的超时(默认为 10 秒)。
docker-compose up //启动yml文件定义的 container
docker-compose up -d //后台运行
docker-compose up --help //查看up帮助
docker-compose -f docker-compose.yml up //-f 指定yml文件
docker-compose stop //停止
docker-compose start
docker-compose ls //查看
docker-compose down //停止删除
docker-compose ps
docker-compose images
docker-compose exec {service_name} {bash}
模板文件是使用 Compose 的核心,涉及到的指令关键字也比较多。但不用担心,这里面大部分指令跟 docker run 相关参数的含义都是类似的。
默认的模板文件名称为 docker-compose.yml,格式为 YAML 格式。