docker基础

容器

容器是一种基础工具;泛指任何可以用于容纳其他物品的工具,可以部分或完全封闭,被用于容纳、储存、运输物品;物体可以被放置在容器中,而容器则可以保护内容物;

容器分离开的资源:
  • UTS(主机名与域名)
  • Mount(文件系统挂载树)
  • IPC
  • PID进程树
  • User
  • Network(tcp/ip协议栈)

CGroup的功能

控制组(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)挂起、恢复和重启等操作

LXC常用操作

Linux Container容器是一种内核虚拟化技术,可以提供轻量级的虚拟化,以便隔离进程和资源。

lxc-version :用于显示系统LXC的版本号(可以通过此命令判断系统是否安装了lxc)

lxc-checkconfig :用于判断linux内核是否支持LXC

lxc-create:用于创建一个容器
语法:lxc-create -n name [-f config_file]
         -n 后面跟要创建的容器名字 例如:-n foo
         -f 后面跟容器配置文件的路径
注:1.采用lxc-create创建的容器,在停止运行后,不会被销毁,要采用lxc-destroy命令才能销毁
       2.容器命令空间是全局的,系统中不允许存在重名的容器,如果-n 后面跟一个已经存在的容器名,创建会失败

lxc-execute: 用于在一个容器执行应用程序
语法: lxc-execute -n name [-f config_file] [ -s KEY=VAL ]command

lxc-start :用于在容器中执行给定命令
语法:lxc-start  -n name [-f config_file] [-c console_file] [-d] [-s KEY=VAL]
          [command]
      -d 将容器当做守护进程执行
     -f  后面跟配置文件
     -c 指定一个文件作为容器console的输出,如果不指定,将输出到终端
    -s 指定配置

lxc-kill :发送信号给容器中的第一个用户进程(容器内部进程号为2的进程)

lxc-stop :用于停止容器中所有的进程

lxc-destroy: 用于销毁容器

lxc-cgroup :用于获取或调整与cgroup相关的参数
用法:lxc-cgroup -n name subsystem value

lxc-info :用户获取一个容器的状态

lxc-monitor: 监控一个容器状态的变换,当一个容器的状态变化时,此命令会在屏幕上打印出容器的状态

lxc-ls :列出当前系统所有的容器

lxc-ps :列出特定容器中运行的进程

lxc-snapshot:创建和恢复快照

退出容器方式:<Ctrl+a q>

安装lxc

[root@localhost ~]# curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--100  2495  100  2495    0     0  12412      0 --:--:-- --:--:-- --:--:-- 12412
[root@localhost ~]# sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo
[root@localhost ~]# yum install -y https://mirrors.aliyun.com/epel/epel-release-latest-8.noarch.rpm
[root@localhost ~]# sed -i 's|^#baseurl=https://download.example/pub|baseurl=https://mirrors.aliyun.com|' /etc/yum.repos.d/epel*
[root@localhost ~]# sed -i 's|^metalink|#metalink|' /etc/yum.repos.d/epel*
[root@localhost ~]# yum -y install lxc lxc-templates bridge-utils lxc-libs libcgroup libvirt perl debootstrap
[root@localhost ~]# systemctl start lxc libvirtd 
[root@localhost ~]# systemctl status lxc
● lxc.service - LXC Container Initialization and Autoboot Code
   Loaded: loaded (/usr/lib/systemd/system/lxc.service; disabled; vendo>
   Active: active (exited) since Sun 2022-04-24 00:08:33 CST; 7s ago
     Docs: man:lxc-autostart
           man:lxc
  Process: 26331 ExecStart=/usr/libexec/lxc/lxc-containers start (code=>
  Process: 26328 ExecStartPre=/usr/libexec/lxc/lxc-apparmor-load (code=>
 Main PID: 26331 (code=exited, status=0/SUCCESS)

424 00:08:33 localhost.localdomain systemd[1]: Starting LXC Containe>
424 00:08:33 localhost.localdomain systemd[1]: Started LXC Container>

查看容器是否安装成功

[root@localhost ~]# lxc-checkconfig
Kernel configuration not found at /proc/config.gz; searching...
Kernel configuration found at /boot/config-4.18.0-193.el8.x86_64
--- Namespaces ---
Namespaces: enabled
Utsname namespace: enabled
Ipc namespace: enabled
Pid namespace: enabled
User namespace: enabled
Warning: newuidmap is not setuid-root
Warning: newgidmap is not setuid-root
Network namespace: enabled

--- Control groups ---
Cgroups: enabled

Cgroup v1 mount points: 
/sys/fs/cgroup/systemd
/sys/fs/cgroup/hugetlb
/sys/fs/cgroup/rdma
/sys/fs/cgroup/cpuset
/sys/fs/cgroup/cpu,cpuacct
/sys/fs/cgroup/devices
/sys/fs/cgroup/memory
/sys/fs/cgroup/pids
/sys/fs/cgroup/net_cls,net_prio
/sys/fs/cgroup/blkio
/sys/fs/cgroup/perf_event
/sys/fs/cgroup/freezer

Cgroup v2 mount points: 


Cgroup v1 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, not loaded
Macvlan: enabled, not loaded
Vlan: enabled, not loaded
Bridges: enabled, loaded
Advanced netfilter: enabled, loaded
CONFIG_NF_NAT_IPV4: enabled, loaded
CONFIG_NF_NAT_IPV6: enabled, loaded
CONFIG_IP_NF_TARGET_MASQUERADE: enabled, not loaded
CONFIG_IP6_NF_TARGET_MASQUERADE: enabled, not loaded
CONFIG_NETFILTER_XT_TARGET_CHECKSUM: enabled, loaded
CONFIG_NETFILTER_XT_MATCH_COMMENT: enabled, not loaded
FUSE (for use with lxcfs): enabled, loaded

--- 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: 

Note : Before booting a new kernel, you can check its configuration
usage : CONFIG=/path/to/config /usr/bin/lxc-checkconfig

[root@localhost ~]# ls /usr/share/lxc/templates/
lxc-busybox  lxc-download  lxc-local  lxc-oci

dockers基本概念

docker是容器技术的一个前端工具,容器是内核的一项技术,docker只是把这一项技术的使用得以简化,使之普及而已。

Docker是以Docker容器为资源分割和调度的基本单位,封装整个软件运行时环境,为开发者和系统管理员设计,用于构建、发布和运行分布式应用的平台。它是一个跨平台、可移植且简单易用的容器解决方案。Docker的源代码托管在GitHub.上, 基于Go语言开发,并遵从Apache 2.0协议。Docker可在容器内部快速自动化地部署 应用,并通过操作系统内核技术(namespace、 CGroups等 )为容器提供资源隔离与安全保障。

Docker本身并不是容器,它是创建容器的工具,是应用容器引擎。

Docker技术的三大核心概念,分别是:
  • 镜像(Image)
  • 容器(Container)
  • 仓库(Repository)

从操作系统功能上看,docker底层依赖的核心技术主要包括Linux操作系统的命名空间、控制组、联合文件系统和Linux虚拟网络支持。

Docker的用途
  • 简化配置
  • 代码管理化管理
  • 开发人员的生产化
  • 隔离应用
  • 整合服务器
  • 调试能力
  • 多租户环境
  • 快速部署
使用docker的优劣:
  • 删除一个容器不会影响其他容器
  • 调试不便,占空间(每个容器中都必须自带调试工具,比如ps命令)
  • 分发容易,真正意义上一次编写到处运行,比java的跨平台更彻底
  • 部署容易,无论底层系统是什么,只要有docker,直接run就可以了
  • 分层构建,联合挂载

容器的工作方式

(1)通过namespace对不同的容器实现了隔离,namespace允许一个进程及 其子进程从 共享的宿主机内核资源(挂载点、进程列表等)中获得一个仅自 己可见的隔离区域,让同一个 namespace下的所有进程感知彼此变化,对外界进程一无所知, 仿佛运行在一个独占的操作 系统中- -样。

(2)通过Control Groups (CGroups) 隔离宿主机上的物理资源,如CPU、内存、磁盘I/O和网络带宽。使用CGroups还可以为资源设置权重、计算使用量、操控任务(进程或线程)启停等。

(3)使用镜像管理功能,利用Docker的镜像分层、写时复制、内容寻址、联合挂载技术实现了一套完整的容器文件系统及运行环境,结合镜像仓库,镜像可以快速下载和共享,以便在多环境中部署

为了使容器的使用更加易于管理,docker采取一个用户空间只跑一个业务进程的方式,在一个容器内只运行一个进程,比如我们要在一台主机上安装一个nginx和一个tomcat,那么nginx就运行在nginx的容器中,tomcat运行在tomcat的容器中,二者用容器间的通信逻辑来进行通信。

LXC是把一个容器当一个用户空间使用,当虚拟机一样使用,里面可以运行N个进程,这就使得我们在容器内去管理时极为不便,而docker用这种限制性的方式,在一个容器中只运行一个进程的方式,使得容器的管理更加方便。

在容器中有数据称作有状态,没有数据称作无状态。在容器的使用中,我们应以有状态为耻,以无状态为荣。数据不应该放在容器中,而应放置于外部存储中,通过挂载到容器中从而进行数据的存储。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值