docker容器技术基础入门
LXC简单介绍与使用
简介
LXC(LinuX Containers)Linux容器,一种操作系统层虚拟化技术,为Linux内核容器功能的一个用户空间接口。它将应用软件系统打包成一个软件容器(Container),内含应用软件本身的代码,以及所需要的操作系统核心和库。透过统一的名字空间和共享API来分配不同软件容器的可用硬件资源,创造出应用程序的独立沙箱运行环境,使得Linux用户可以容易的创建和管理系统或应用容器。
在Linux内核中,提供了cgroups功能,来达成资源的隔离。它同时也提供了名称空间隔离的功能,使应用程序看到的操作系统环境被区隔成独立区间,包括进程树,网络,用户id,以及挂载的文件系统。但是cgroups并不一定需要启动任何虚拟机。
LXC利用cgroups与名称空间的功能,提供应用软件一个独立的操作系统环境。LXC不需要Hypervisor这个软件层,软件容器(Container)本身极为轻量化,提升了创建虚拟机的速度。
而Docker本质来说不是容器,而是容器的管理工具,最初的Docker也是基于LXC实现的。
LXC 的应用
在一台服务器上通过LXC 可以提供多个相互隔离的server contains 同时运行;LXC 通过chroot 提供独立的进程或者网络环境,用namespace 来实现多个容器环境的隔离,用cgroups 实现对每个容器资源的分配和限制。
LXC 的三个核心的技术
linux contains 的技术是linux 内核的代码,并非Docker 开发出来的,Docker或者其他的虚拟化容器都是基于LXC 的技术,在基础的lxc上包了一层代码,让LXC 更简单、更友好,更加好推广。
下面是LXC 的三个核心技术:
- chroot: 创建一个虚拟的根目录文件系统(实质还是调用底层的文件系统),不过是建立一个虚拟的,可以跟其他容器的虚拟文件系统相互隔离,但共享底层的文件系统。
- namespace : 命名空间可以提供一个进程相互隔离的独立网络空间,不同的容器间进程pid可以相同,进程并不冲突影响,但可以共享底层的计算和存储(cpu + mem)。
- cgroups: 实现了对容器的资源分配和限制,比如给容器1分配10core 30G 内存,那这个容器最多用这么大的资源;如果内存超过30G,会启动swap,效率降低,也可能会被调度系统给kill掉。
安装配置LXC
系统准备
系统环境准备
[root@docker ~]# cat /etc/redhat-release
CentOS Linux release 7.2.1511 (Core)
[root@docker ~]# uname -r
3.10.0-327.el7.x86_64
[root@docker ~]# hostname -I
172.16.1.20 10.0.0.20
配置主机桥接网卡
[root@docker ~]# cp /etc/sysconfig/network-scripts/ifcfg-{eth0,br0}
[root@docker ~]# cat > /etc/sysconfig/network-scripts/ifcfg-eth0 < EOF
TYPE=Ethernet
BOOTPROTO=none
NAME=eth0
DEVICE=eth0
ONBOOT=yes
BRIDGE=br0
EOF
[root@docker ~]# cat > /etc/sysconfig/network-scripts/ifcfg-br0 < EOF
TYPE=Bridge
BOOTPROTO=none
NAME=br0
DEVICE=br0
ONBOOT=yes
DNS1=223.5.5.5
IPADDR=10.0.0.20
PREFIX=24
GATEWAY=10.0.0.254
EOF
安装LXC
安装epel源
[root@docker ~]# curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
安装依赖程序
[root@docker ~]# yum install -y libcgroup* bridge-utiles wget
安装lxc
[root@docker ~]# yum install -y lxc*
[root@docker ~]# rpm -qa | grep lxc
lxc-devel-1.0.11-1.el7.x86_64
python34-lxc-1.0.11-1.el7.x86_64
lua-lxc-1.0.11-1.el7.x86_64
lxc-1.0.11-1.el7.x86_64
lxc-templates-1.0.11-1.el7.x86_64
lxc-doc-1.0.11-1.el7.noarch
lxc-libs-1.0.11-1.el7.x86_64
lxc-extra-1.0.11-1.el7.x86_64
配置LXC使用桥接网卡
[root@docker ~]# vim /etc/lxc/default.conf
lxc.network.type = veth
lxc.network.link = br0
lxc.network.flags = up
//启动LXC
[root@docker ~]# systemctl enable cgconfig.service
[root@docker ~]# systemctl start cgconfig.service
CGroups
控制组(CGroups)是Linux内核的一个特性,用来对共享资源进行隔离、限制、审计等。只有能控制分配到容器的资源,Docker才能避免多个容器同时运行时的系统资源竞争。
控制组可以提供对容器的内存、CPU、磁盘IO等资源进行限制。
CGroups能够限制的资源有:
- blkio:块设备IO
- cpu:CPU
- cpuacct:CPU资源使用报告
- cpuset:多处理器平台上的CPU集合
- devices:设备访问
- freezer:挂起或恢复任务
- memory:内存用量及报告
- perf_event:对cgroup中的任务进行统一性能测试
- net_cls:cgroup中的任务创建的数据报文的类别标识符
具体来看,控制组提供如下功能:
- 资源限制(Resource Limitting)组可以设置为不超过设定的内存限制。比如:内存子系统可以为进行组设定一个内存使用上限,一旦进程组使用的内存达到限额再申请内存,就会发出Out of Memory警告
- 优先级(Prioritization)通过优先级让一些组优先得到更多的CPU等资源
- 资源审计(Accounting)用来统计系统实际上把多少资源用到合适的目的上,可以使用cpuacct子系统记录某个进程组使用的CPU时间
- 隔离(Isolation)为组隔离命名空间,这样一个组不会看到另一个组的进程、网络连接和文件系统
- 控制(Control)挂起、恢复和重启等操作
安装Docker后,用户可以在/sys/fs/cgroup/memory/docker/目录下看到对Docker组应用的各种限制项,包括
[root@localhost ~]# cd /sys/fs/cgroup/memory/
[root@localhost memory]# ls
cgroup.clone_children memory.kmem.slabinfo memory.memsw.limit_in_bytes memory.swappiness
cgroup.event_control memory.kmem.tcp.failcnt memory.memsw.max_usage_in_bytes memory.usage_in_bytes
cgroup.procs memory.kmem.tcp.limit_in_bytes memory.memsw.usage_in_bytes memory.use_hierarchy
cgroup.sane_behavior memory.kmem.tcp.max_usage_in_bytes memory.move_charge_at_immigrate notify_on_release
memory.failcnt memory.kmem.tcp.usage_in_bytes memory.numa_stat release_agent
memory.force_empty memory.kmem.usage_in_bytes memory.oom_control system.slice
memory.kmem.failcnt memory.limit_in_bytes memory.pressure_level tasks
memory.kmem.limit_in_bytes memory.max_usage_in_bytes memory.soft_limit_in_bytes user.slice
memory.kmem.max_usage_in_bytes memory.memsw.failcnt memory.stat
docker工作方式
为了使容器的使用更加易于管理,docker采取一个用户空间只跑一个业务进程的方式,在一个容器内只运行一个进程,比如我们要在一台主机上安装一个nginx和一个tomcat,那么nginx就运行在nginx的容器中,tomcat运行在tomcat的容器中,二者用容器间的通信逻辑来进行通信。
LXC是把一个容器当一个用户空间使用,当虚拟机一样使用,里面可以运行N个进程,这就使得我们在容器内去管理时极为不便,而docker用这种限制性的方式,在一个容器中只运行一个进程的方式,使得容器的管理更加方便。
容器查看命令
docker ps //查看容器运行状态
选项:
-a //显示所有的容器,包括未运行的
-q //只显示容器id
-l //显示最近创建的容器。
-f "筛选条件" //根据条件过滤显示的内容
示例:
[root@docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b2573716a20d hello-world "/hello" 9 minutes ago Exited (0) 9 minutes ago focused_perlman
CONTAINER ID //容器 ID
IMAGE //使用的镜像
COMMAND //启动容器时运行的命令
CREATED //容器的创建时间
STATUS //容器状态
状态有7种:
created(已创建)
restarting(重启中)
running(运行中)
removing(迁移中)
paused(暂停)
exited(停止)
dead(死亡)
PORTS //容器的端口信息和使用的连接类型(tcp\udp)。
NAMES //容器名称
docker inspect 容器名 //查看容器详细信息
示例:
[root@docker ~]# docker inspect test
......略........
docker基本概念
Docker的三个基本概念
Docker中包括三个基本的概念:
- Image(镜像)
- Container(容器)
- Repository(仓库)
1、镜像是Docker运行容器的前提,仓库是存放镜像的场所,可见镜像是Docker的核心。
那么镜像到底是什么呢?
Docker镜像可以看作是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数。镜像不包含任何动态数据,其内容在构建之后也不会被改变。
2、Container (容器)
容器的定义和镜像几乎一模一样,也是一堆层的统一视角,唯一区别在于容器的最上面那一层是可读可写的。
由于容器的定义并没有提及是否要运行容器,所以实际上,容器 = 镜像 + 读写层。
3、Repository(仓库)
Docker仓库是集中存放镜像文件的场所,镜像构建完成后,可以很容易在当前宿主上运行,但是,如果需要在其他服务器上使用这个镜像,我们需要一个集中的存储、分发镜像的服务,Docker Registry(仓库注册服务器)就是这样的服务。 有时候会把仓库(Repository)和仓库注册服务器(Registry)混为一谈,并不严格区分。 实际上,一个Docker Registry中可以包含多个仓库(Repository),每个仓库可以包含多个标签 ,每个标签对应着一个镜像。所以说,镜像仓库是Docker用来集中存放镜像文件的地方类似于我们之前常用的代码仓库。
仓库又可以分为两种形式:
(1)public(共有仓库)
Docker Registry公有仓库是开放给用户使用、允许用户管理镜像的 Registry 服务。一般这类公开服务允许用户免费上传、下载公开的镜像,并可能提供收费服务供用户管理私有镜像。
(2)private(私有仓库)
Docker官方提供了Docker Registry镜像,可以直接使用做为私有Registry服务。当用户创建了自己的镜像之后就可以使用push命令将它上传到公有或者私有仓库,这样下次在另外一台机器上使用这个镜像时候,只需要从仓库上 pull下来就可以了。
Docker容器是镜像运行的实例。容器是在一个资源隔离的环境中运行应用程序和其依赖项的、轻量化的虚拟化技术。容器运行在独立的沙箱环境中,这保证了容器内的进程不会影响到容器外的任何进程。
容器的优点
- 敏捷环境:容器技术的最大优势是比创建VM(虚拟机)实例更快的速度。它们的轻量化在性能和占用空间方面的开销更小。
- 提高生产力:提高开发、部署以及升级效率;每个容器都可以被看作是一个不同的微服务,因此可以独立升级,而不需要考虑它们的同步。
- 版本控制:容器的每个镜像都可以进行版本控制,因此可以跟踪不同版本的容器,注意版本之间的差异。
- 计算环境可移植性:docker的镜像封装了程序运行所依赖的环境,所以只要安装docker程序,并下载镜像在任何环境都可以运行容器。
- 标准化:大多数容器基于开放标准,可以运行在所有主要的Linux发行版,微软等。
- 安全:容器将一个容器的进程与另一个容器以及底层基础架构隔离开来;因此一个容器中的任何升级或更改都不会影响其他容器。
浙公网安备 33010602011771号