Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
Docker 是 PaaS 提供商 dotCloud 开源的一个基于 LXC 的高级容器引擎,源代码托管在 Github 上, 基于go语言并遵从Apache2.0协议开源。
Docker容器是一个完整的文件系统,这个文件系统中包含了你的软件运行所需要的全部环境,如:软件的源码、运行环境、所需的软件等。
2011年 — Warden:由CloudFoundry公司于2011年所建立,其利用LXC 作为初始阶段,随后又将其替换为自家实现方案。与LXC不同,Warden并不会与Linux紧密耦合。相反,其能够运行在任意能够提供多种隔离环境方式的操作系统之上
2013年 — LMCTFY:“Let Me Contain That For You(帮你实现容器化)”。它其实属于谷歌容器技术堆栈的开源版本,负责提供Linux应用程序容器,Kubernetes目前所使用的cAdvisor工具最初就来源于lmctfy项目
2013年 — Docker:起步阶段使用LXC,而后利用自己的libcontainer库将其替换下来。与其它容器平台不同,Docker引入了一整套与容器管理相关的生态系统。其中包括一套高效的分层式容器镜像模型、一套全局及本地容器注册表、一个精简化REST API以及一套命令行界面等等。在后期发展阶段,Docker公司还构建起一套名为Docker Swarm的容器集群管理解决方案
2014年 — Rocket:解决部分Docker当中存在的缺陷,开发目标是在安全性与生产要求满足能力上超越Docker,其基于App Container规范并使其成为一项更为开放的标准
2015年—Docker进行大家视线,开源社区得到前所未有的发展
2016年 — Windows容器发布,docker新技术架构升级
2017年—Docker:正式进行商业化运作,docker与moby分家
2018年-Docker在企业中快速落地
容器为应用程序提供了隔离的运行空间:每个容器内都包含一个独享的完整用户环境空间,并且一个容器内的变动不会影响其他容器的运行环境。容器技术使用了namespaces来进行空间隔离,通过文件系统的挂载点来决定容器可以访问哪些文件,通过cgroups来确定每个容器可以利用多少资源。此外容器之间共享同一个系统内核,这样当同一个库被多个容器使用时,内存的使用效率会得到提升。
对于系统虚拟化技术来说,虚拟层为用户提供了一个完整的虚拟机:包括内核在内的一个完整的系统镜像。CPU虚拟化技术可以为每个用户提供一个独享且和其他用户隔离的系统环境,虚拟层可以为每个用户分配虚拟化后的CPU、内存和IO设备资源
基于docker容器虚拟化与传统虚拟化对比
Docker是开发人员和系统管理员使用容器开发、部署和运行应用程序的平台。使用Linux容器来部署应用程序称为集装箱化
集装箱化的优点
灵活:即使是复杂的应用程序也可封装。
轻量级:容器利用并共享主机内核。
便携式:您可以在本地构建,部署到云上并在任何地方运行。
可扩展性:您可以增加和自动分发容器副本。
可堆叠:您可以垂直堆叠服务并及时并及时堆叠服务。
软件包->打包带上环境(镜像)->Docker仓库:商店->下载发布的镜像->直接运行可用
docker的机制很好的解决了这些问题
docker源于集装箱的思想,自带隔离机制,容器与容器之间互不干扰
一次构建,随处运行。docker可以将写好镜像文件进行打包到任何docker服务中去运行,这个源于docker的容器格式:Docker引擎将名称空间、控制组和联合文件系统打包到一起所使用的就是容器格式。默认的容器格式是Libcontaine
docker的控制组和联合文件系统,可以设置进程的cpu内存等使用限额,而联合文件系统可以建立联合挂载点,共享存储。
LXC(LinuX Containers)Linux容器,一种操作系统层虚拟化技术,为Linux内核容器功能的一个用户空间接口。它将应用软件系统打包成一个软件容器(Container),内含应用软件本身的代码,以及所需要的操作系统核心和库。透过统一的名字空间和共享API来分配不同软件容器的可用硬件资源,创造出应用程序的独立沙箱运行环境,使得Linux用户可以容易的创建和管理系统或应用容器。
在Linux内核中,提供了cgroups功能,来达成资源的隔离。它同时也提供了名称空间隔离的功能,使应用程序看到的操作系统环境被区隔成独立区间,包括进程树,网络,用户id,以及挂载的文件系统。但是cgroups并不一定需要启动任何虚拟机。
LXC利用cgroups与名称空间的功能,提供应用软件一个独立的操作系统环境。LXC不需要Hypervisor这个软件层,软件容器(Container)本身极为轻量化,提升了创建虚拟机的速度。
而Docker本质来说不是容器,而是容器的管理工具,最初的Docker也是基于LXC实现的。
LXC关键技术点:
chroot,根切换,从容器内的角度来看,仿佛真的有自己的根树
namespaces:名称空间,负责将资源隔离,比如pid,网络,mnt,user,uts等
CGroups:控制组,负责控制资源的分配
环境说明:
系统版本 | ip地址 |
---|---|
centos7 | 192.168.71.136 |
//安装epel源
[root@localhost ~]# yum -y install epel-release
安装LXC以及其依赖包
[root@localhost ~]# yum -y install lxc lxc-templates bridge-utils lxc-libs libcgroup libvirt perl debootstrap
lxc-templat //LXC的配置模板
bridge-utils //这个是网桥管理的工具包
lxc-libs //LXC所需要的库文件
libcgroup //cgroup是为linux内核提供任务聚集和划分的机制,通过一组参数集合将一些任务组织成一个或多个子系统。
libvirt //管理linux虚拟化功能所需要的服务器端的守护程序。需要针对特定驱动程序的管理程序。
[root@localhost ~]# systemctl start lxc
[root@localhost ~]# systemctl start libvirtd
[root@localhost ~]# lxc-checkconfig //检查配置
Kernel configuration not found at /proc/config.gz; searching...
Kernel configuration found at /boot/config-3.10.0-862.el7.x86_64
--- Namespaces ---
Namespaces: enabled
Utsname namespace: enabled
Ipc namespace: enabled
Pid namespace: enabled
User namespace: enabled
newuidmap is not installed
newgidmap is not installed
Network namespace: enabled
Multiple /dev/pts instances: enabled
--- Control groups ---
Cgroup: enabled
Cgroup clone_children flag: enabled
Cgroup device: enabled
Cgroup sched: enabled
Cgroup cpu account: enabled
Cgroup memory controller: enabled
Cgroup cpuset: enabled
--- Misc ---
Veth pair device: enabled
Macvlan: enabled
Vlan: enabled
Bridges: enabled
Advanced netfilter: enabled
CONFIG_NF_NAT_IPV4: enabled
CONFIG_NF_NAT_IPV6: enabled
CONFIG_IP_NF_TARGET_MASQUERADE: enabled
CONFIG_IP6_NF_TARGET_MASQUERADE: enabled
CONFIG_NETFILTER_XT_TARGET_CHECKSUM: enabled
--- Checkpoint/Restore ---
checkpoint restore: enabled
CONFIG_FHANDLE: enabled
CONFIG_EVENTFD: enabled
CONFIG_EPOLL: enabled
CONFIG_UNIX_DIAG: enabled
CONFIG_INET_DIAG: enabled
CONFIG_PACKET_DIAG: enabled
CONFIG_NETLINK_DIAG: enabled
File capabilities: enabled
Note : Before booting a new kernel, you can check its configuration
usage : CONFIG=/path/to/config /usr/bin/lxc-checkconfig
// 查看当前系统中可用的LXC模板容器
[root@localhost ~]# ls /usr/share/lxc/templates/
lxc-alpine lxc-archlinux lxc-centos lxc-debian lxc-fedora lxc-openmandriva lxc-oracle lxc-sshd lxc-ubuntu-cloud
lxc-altlinux lxc-busybox lxc-cirros lxc-download lxc-gentoo lxc-opensuse lxc-plamo lxc-ubuntu
[root@localhost ~]# lxc-create -t centos -n myhost1 //创建LXC主机,-t 指定模板容器,-n 指定要创建的主机名
Copying rootfs to /var/lib/lxc/myhost1/rootfs ... #生成虚拟系统的根,文件默认路径在/var/lib/lxc/myhsot1下
/var/lib/lxc/myhost1/tmp_root_pass' #这个文件保存了主机的初始root密码
chroot /var/lib/lxc/myhost1/rootfs passwd #可以使用这个命令修改初始root密码
//lxc主机所生成的文件默认路径在/var/lib/lxc/主机名/目录下
[root@localhost myhost1]# pwd
/var/lib/lxc/myhost1
[root@localhost myhost1]# ls
config rootfs tmp_root_pass
// config为配置文件
// rootfs为根目录
// tmp_root_pass root密码存放位置
[root@localhost myhost1]# chroot /var/lib/lxc/myhost1/rootfs/ passwd //修改初始密码
更改用户 root 的密码 。
新的 密码:
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。
[root@localhost myhost1]# lxc-start -n myhost1
systemd 219 running in system mode. (+PAM +AUDIT +SELINUX +IMA -APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ +LZ4 -SECCOMP +BLKID +ELFUTILS +KMOD +IDN)
Detected virtualization lxc.
Detected architecture x86-64.
Welcome to CentOS Linux 7 (Core)!
Running in a container, ignoring fstab device entry for /dev/root.
Cannot add dependency job for unit display-manager.service, ignoring: Unit not found.
[ OK ] Reached target Remote File Systems.
此处省略N行
myhost1 login: root #使用root用户登陆
Password: #输入设置的root密码
[root@myhost1 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/centos-root 50G 2.3G 48G 5% /
devtmpfs 1.4G 0 1.4G 0% /dev
tmpfs 1.4G 0 1.4G 0% /dev/shm
tmpfs 1.4G 17M 1.4G 2% /run
tmpfs 1.4G 0 1.4G 0% /sys/fs/cgroup
tmpfs 280M 0 280M 0% /run/user/0
[root@myhost1 ~]# ip a //查看网卡的信息
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
5: eth0@if6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether fe:9f:2e:9a:ff:b5 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 192.168.122.118/24 brd 192.168.122.255 scope global dynamic eth0
valid_lft 3403sec preferred_lft 3403sec
inet6 fe80::fc9f:2eff:fe9a:ffb5/64 scope link
valid_lft forever preferred_lft forever
lxc-start -n myhost1 -d #在启动时添加-d选项可以把主机防止后台有运行
lxc-console -n myhost1 #使用lxc-console 进行连接
71[root@localhost ~]# ssh root@192.168.122.118
root@192.168.122.118's password: //可以使用ssh进行连接
[root@localhost myhost1]# lxc-info -n myhost1
Name: myhost1
State: RUNNING
PID: 1741
IP: 192.168.122.118
CPU use: 0.17 seconds
BlkIO use: 15.54 MiB
Memory use: 8.04 MiB
KMem use: 0 bytes
Link: veth55YWH2
TX bytes: 1.42 KiB
RX bytes: 6.19 KiB
Total bytes: 7.61 KiB
//停止lxc主机
[root@localhost myhost1]# lxc-stop -n myhost1
//克隆主机
[root@localhost myhost1]# lxc-clone -o myhost1 -n myhost2 //把myhost1克隆为名字为myhost2
Created container myhost2 as copy of myhost1
//删除主机
[root@localhost myhost1]# lxc-destroy -n myhost1
[root@localhost ~]# lxc-start -n myhost2
systemd 219 running in system mode. (+PAM +AUDIT +SELINUX +IMA -APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ +LZ4 -SECCOMP +BLKID +ELFUTILS +KMOD +IDN)
Detected virtualization lxc.
Detected architecture x86-64.
Welcome to CentOS Linux 7 (Core)!
此处省略N行
myhost2 login: root
Password: //密码与myhost1相同