• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
悬溺
博客园    首页    新随笔    联系   管理    订阅  订阅
docker容器技术基础入门

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容器是镜像运行的实例。容器是在一个资源隔离的环境中运行应用程序和其依赖项的、轻量化的虚拟化技术。容器运行在独立的沙箱环境中,这保证了容器内的进程不会影响到容器外的任何进程。

容器的优点

  1. 敏捷环境:容器技术的最大优势是比创建VM(虚拟机)实例更快的速度。它们的轻量化在性能和占用空间方面的开销更小。
  2. 提高生产力:提高开发、部署以及升级效率;每个容器都可以被看作是一个不同的微服务,因此可以独立升级,而不需要考虑它们的同步。
  3. 版本控制:容器的每个镜像都可以进行版本控制,因此可以跟踪不同版本的容器,注意版本之间的差异。
  4. 计算环境可移植性:docker的镜像封装了程序运行所依赖的环境,所以只要安装docker程序,并下载镜像在任何环境都可以运行容器。
  5. 标准化:大多数容器基于开放标准,可以运行在所有主要的Linux发行版,微软等。
  6. 安全:容器将一个容器的进程与另一个容器以及底层基础架构隔离开来;因此一个容器中的任何升级或更改都不会影响其他容器。
posted on 2022-04-23 19:05  悬溺·  阅读(161)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3