容器简史

女生的网名这么多〃 提交于 2020-11-18 14:37:15

1979年 — UnixV7 Chroot
1979 AT&T的贝尔实验室发布了著名的Unix System Version7,为了解决不统一的ABI(应用二进制接口)软件的兼容问题,引入了chroot命令,他将Root目录及其它子目录变更至文件系统内的新位置,且只接受特定进程的访问,为每个进程提供一套隔离化磁盘空间。1982年 sun公司的创始人Bill Joy年将其添加至BSD,并在BSD中解决了chroot的安全漏洞,此后许多人基于chroot开发了基础的隔离程序.

2000年 — FreeBSD Jails
FreeBSD Jails与Chroot的定位类似,不过其中包含有进程沙箱机制以对文件系统、用户及网络等资源进行隔离。通过这种方式,它能够为每个Jail、定制化软件安装包乃至配置方案等提供一个对应的IP地址。Jails技术为FreeBSD系统提供了一种简单的安全隔离机制。它的不足在于这种简单性的隔离也同时会影响Jails中应用访问系统资源的灵活性。

2004年 — Solaris Zones
Solaris Zone技术为应用程序创建了虚拟的一层,让应用在隔离的Zone中运行,并实现有效的资源管理。每一个Zone 拥有自己的文件系统,进程空间,防火墙,网络配置等等。Solaris Zone技术真正的引入了容器资源管理的概念。在应用部署的时候为Zone配置一定的资源,在运行中可以根据Zone的负载动态修改这个资源限制并且是实时生效的,在其他Zone不需要资源的时候,资源会自动切换给需要的资源的Zone,这种切换是即时的不需要人工干预的,最大化资源的利用率,在必要的情况下,也可以为单个Zone隔离一定的资源。
2001-2007年 — LXC
2001年,通过 Jacques Gélinas 的 VServer 项目,隔离环境的实施进入了 Linux 领域.Google Paul Menage基于之前的容器基础,开发出cgroup技术,并于2007合入linux 2.6.24内核,从而衍生出LXC-Linux Containers,其功能通过Cgroups以及Linux Namespaces实现。也是第一套完整的Linux容器管理实现方案。在LXC出现之前, Linux上已经有了类似 Linux-Vserver、OpenVZ 和 FreeVPS。虽然这些技术都已经成熟,但是这些解决方案还没有将它们的容器支持集成到主流 Linux 内核。相较于其它容器技术,LXC能够在无需任何额外补丁的前提下运行在原版Linux内核之上。目前LXC项目由Canonical有限公司负责赞助及托管。LXC采用以下内核功能模块:


Kernel namespaces (ipc, uts, mount, pid, network and user)
Apparmor and SELinux profiles
Seccomp policies
Chroots (using pivot_root)
Kernel capabilities
CGroups (control groups)
2013年 — Docker
Docker项目最初是由一家名为DotCloud的平台即服务厂商所打造,其后该公司更名为Docker。Docker 在1.8以前直接使用Linux Containers (LXC),而后自己抽象出Libcontainer层,支持多种容器技术,默认采用LXC实现。与其它容器平台不同,Docker引入了一整套与容器管理相关的生态系统。其中包括一套高效的分层式容器镜像模型、一套全局及本地容器注册表、一个精简化REST API以及一套命令行界面等等。
扩展阅读:静态的文件叫image,docker run跑起来了叫容器1. docker常用命令







a. 准备Dockerfile [Docker之Dockerfile语法详解]
b. 构建镜像: docker build -t 镜像名称:版本 Dockerfile目录 如:
#Dockerfile在当前目录,所以最后用点号表示Dockerfile路径docker build -t base-jdk:8 .

c. 拉取镜像: docker pull 镜像名:版本
#不加版本后默认为latestdocker pull nginx

d. 运行镜像: docker run 镜像名:版本
#不加版本后默认为latestdocker run nginx#带自动重启 映射外网 端口 挂载主机目录的命令docker run --restart=always --privileged -p 9095:500/udp -v /etc/nginx/:/etc/nginx/conf -d nginx
e. 查看本机所有的所有容器: docker ps 返回的第一列为容器IDf. 查看容器日志: docker logs -f 容器ID(通过docker ps查看)g. 连接到容器执行命令: docker exec -ti 容器ID /bin/bash (如果是alpine,则为:/bin/sh)h. 查看容器的完整信息: docker inspect 容器IDi. 其他不常用命令: docker system prune(清空未使用的镜像、构建过程中产生的中间镜像层、已运行完的容器信息
j. 完整的docker run参数
-a: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项;
-d: 后台运行容器,并返回容器ID;
-i: 以交互模式运行容器,通常与 -t 同时使用;
-p: 端口映射,格式为:主机(宿主)端口:容器端口
-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
--name="nginx-lb": 为容器指定一个名称;
--dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致;
--dns-search Example Domain: 指定容器DNS搜索域名,默认和宿主一致;
-h "mars": 指定容器的hostname;
-e username="ritchie": 设置环境变量;
--env-file=[]: 从指定文件读入环境变量;
--cpuset="0-2" or --cpuset="0,1,2": 绑定容器到指定CPU运行;
-m :设置容器使用内存最大值;
--net="bridge": 指定容器网络连接类型,支持 bridge/host/none/container: 四种类型;
--link=[]: 添加链接到另一个容器;
--expose=[]: 开放一个端口或一组端口;


















易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!