docker介绍与安装

docker介绍与安装

docker简介

容器技术

​ 容器:顾名思义,像杯子、集装箱都是容器,类比水杯,无论外面或里面怎么变,都不会影响到里面或外面,即起到隔离的作用,避免了相同影响

​ 在it领域,容器技术即为靠软件逻辑实现不同软件之间的隔离,包括资源隔离、运行环境隔离等,避免相互影响,变动只影响自己,避免牵一发而动全身,

​ 最早的容器是freebsd中出现的jail;linux内核也实现了容器为lxc(linux container)docker最早就是对lxc的进一步封装,使之更易用;后来docker采用runc替换了lxc

lxc官网:https://linuxcontainers.org/

docker是什么

docker维基页面

Docker is a set of platform as a service (PaaS) products that use OS-level virtualization to deliver software in packages called containers.[6] Containers are isolated from one another and bundle their own software, libraries and configuration files; they can communicate with each other through well-defined channels.[7] All containers are run by a single operating system kernel and therefore use fewer resources than virtual machines.[8]

​ 摘自wikipedia,docker是一种容器技术,将软件和其所依赖的所有库,配置文件等都打包在一起的时候,方便了软件在各个不同环境的迁移运行,避免了像无容器时还需要根据不同的运行环境做不同的调试的情况;从一定程度上说,降低了运维的复杂性

docker组成

https://docs.docker.com/get-started/overview/

  • docker host,物理机或虚拟机,运行docker后台进程和一个个的docker容器
  • docker server,docker的后台进程,管理和运行docker容器
  • docker client,docker命令行或通过docker api的调用
  • docker registry,保存镜像的参考
  • docker image,软件及其依赖的静态组成文件,类比/bin/ls程序文件
  • docker container,由镜像运行起来的进程实例,类比运行的ls程序

image-20201025172539093

docker依赖技术8项

​ docker实际上是对容器进行管理的服务,容器的底层实现依赖linux内核完成,即docker是对容器的管理工具;

  • cgroups,资源配额
  • chroot,切根
  • linux内核实现的6个namespaces
    • mnt、根文件系统
    • pid、进程树
    • net、网络
    • user、用户
    • ipc、进程间通信隔离
    • uts、主机名隔离

cgroup技术:

1、查看内核支持cgroup选项

[root@host2 ~]# uname -r
3.10.0-862.el7.x86_64

[root@host2 ~]# cat /boot/config-3.10.0-862.el7.x86_64 |grep -i cgroup
CONFIG_CGROUPS=y
# CONFIG_CGROUP_DEBUG is not set
CONFIG_CGROUP_FREEZER=y
CONFIG_CGROUP_PIDS=y
CONFIG_CGROUP_DEVICE=y
CONFIG_CGROUP_CPUACCT=y
CONFIG_CGROUP_HUGETLB=y
CONFIG_CGROUP_PERF=y
CONFIG_CGROUP_SCHED=y
CONFIG_BLK_CGROUP=y
# CONFIG_DEBUG_BLK_CGROUP is not set
CONFIG_NETFILTER_XT_MATCH_CGROUP=m
CONFIG_NET_CLS_CGROUP=y
CONFIG_NETPRIO_CGROUP=y

2、查看系统cgroups

[root@host2 ~]# ll /sys/fs/cgroup/
total 0
drwxr-xr-x 2 root root  0 Oct 25 14:59 blkio
lrwxrwxrwx 1 root root 11 Oct 25 14:59 cpu -> cpu,cpuacct
lrwxrwxrwx 1 root root 11 Oct 25 14:59 cpuacct -> cpu,cpuacct
drwxr-xr-x 2 root root  0 Oct 25 14:59 cpu,cpuacct
drwxr-xr-x 2 root root  0 Oct 25 14:59 cpuset
drwxr-xr-x 3 root root  0 Oct 25 15:01 devices
drwxr-xr-x 2 root root  0 Oct 25 14:59 freezer
drwxr-xr-x 2 root root  0 Oct 25 14:59 hugetlb
drwxr-xr-x 2 root root  0 Oct 25 14:59 memory
lrwxrwxrwx 1 root root 16 Oct 25 14:59 net_cls -> net_cls,net_prio
drwxr-xr-x 2 root root  0 Oct 25 14:59 net_cls,net_prio
lrwxrwxrwx 1 root root 16 Oct 25 14:59 net_prio -> net_cls,net_prio
drwxr-xr-x 2 root root  0 Oct 25 14:59 perf_event
drwxr-xr-x 2 root root  0 Oct 25 14:59 pids
drwxr-xr-x 4 root root  0 Oct 25 14:59 systemd

3、cgroup组成

blkio 块设备io限制
cpu cpu限制
cpuacct cpu资源使用报告
cpuset
devices
freezer
memory
net_cls
ns
perf_event

docker核心技术

容器规范

​ 由oci组织制定的容器规范,共2个,runtime运行时、image镜像规范,确保了基于同一规范研发的不同容器技术可以兼容;如docker、coreos的rkt、阿里的pouch;

容器运行时

​ 负责运行容器的支撑环境,常用的有:

  • linux内核的lxc,早期docker采用
  • runc,目前docker采用
  • rkt,coreos研发
  • 同一个oci规范,因此可兼容,可互操作;

容器管理工具

​ 对runtime的进一步封装,提供更易用的cli或gui接口给用户使用:如,docker engine就是runc的管理工具,docker engine包含docker daemon和docker cli两个部分;

​ rkt cli是rkt的管理工具;

容器定义工具

​ 定义容器的属性,内容和如何构建:

  • docker image:是docker容器的模块
  • dockerfile:文件文件,通过dockerfile的指令来构建docker image

registry

​ 存储docker image的地方为镜像仓库,多个镜像仓库组成了registry

docker hub:docker官方仓库,类比github,公共仓库

harbor:vmvare提供的私有仓库搭建方案

容器编排工具

​ 容器一多,人为手动管理即不现实,因此需要容器编排工具,来统一管理容器,包括容器的运行节点选择、自动扩缩容、创建删除、调度、服务发现、集群定义等一系列操作。

​ 常用的编排工具有:

  • kubernetes:事实上的容器编排工具标准!
  • docker swarm:docker官方提供,docker compose也算,但只能编排单机的docker容器
  • mesos+marathon

docker辅助技术

跨主机网络

​ docker默认只支持单机的网络,跨docker host的网络互联需要第三方网络插件实现,常用有:calico、flannel、canal

数据管理

​ docker默认只支持单机的存储卷管理,docker的动态迁移带来了数据的随之迁移的问题,跨docker host的网络存储管理需要借助kubernetes的pv和pvc实现,再借助分布式存储如ceph提供存储服务;

日志管理

​ docker log工具可以查看容器的运行日志,但跨主机的日志管理,往往需要借助elk工具专门收集、处理、展示

服务发现

​ docker容器的特点之一,为动态,因为ip会随之变化,需要引入自动的服务发现机制,如kubernetes的core-dns

容器监控

​ docker ps/top可查看单机的容器进程,跨主机集群级别,需要专门工具,如heapster、promethus

docker与虚拟机

​ docker属于应用进程级别的隔离,虚拟机是os内核级别的隔离

优势:

  • 启动更快
  • 资源利用率更高,(公用一个宿主机内核)

劣势:

  • 隔离性、安全性稍差

docker三大理念

  1. build——构建
  2. ship——运输
  3. run——运行

docker安装

​ docker分为docker-ce和docker-ee;ce为社区版,

​ 安装方式有,yum仓库安装、离线rpm包安装;

​ 参考网址:https://docs.docker.com/engine/install/centos/

rpm包安装

1、下载rpm包到linux主机
https://mirrors.aliyun.com/docker-ce/linux/centos/7/x86_64/stable/Packages/

2、直接yum安装本地rpm包
[root@host2 ~]# yum localinstall docker-ce-18.06.3.ce-3.el7.x86_64.rpm

yum源安装

1、安装yum-config工具
yum install -y yum-utils

2、配置docker-ce的源
yum-config-manager \
    --add-repo \
    https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 
    
3、列出所有提供的docker-ce版本
yum list docker-ce --showduplicates | sort -r

4、指定docker-ce版本安装
[root@host2 ~]# yum install docker-ce-18.03.1.ce-1.el7.centos docker-ce-cli-18.03.1.ce-1.el7.centos containerd.io
    
5、默认安装,是安装当前库中最新版本
yum install docker-ce docker-ce-cli containerd.io

6、查看版本
[root@host2 ~]# docker --version
Docker version 18.03.1-ce, build 9ee9f40

docker启动并验证

0、启动,查看网络信息

[root@host2 ~]# systemctl start docker
[root@host2 ~]# ifconfig -a
docker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255
        ether 02:42:d2:d3:24:b1  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
# 默认生成172.17.0.1的docker0网卡,本地docker网络也为172.17.0.0/16网段;

1、查看版本信息

[root@host2 ~]# docker version
Client:
 Version:      18.03.1-ce
 API version:  1.37
 Go version:   go1.9.5
 Git commit:   9ee9f40
 Built:        Thu Apr 26 07:20:16 2018
 OS/Arch:      linux/amd64
 Experimental: false
 Orchestrator: swarm

Server:
 Engine:
  Version:      18.03.1-ce
  API version:  1.37 (minimum version 1.12)
  Go version:   go1.9.5
  Git commit:   9ee9f40
  Built:        Thu Apr 26 07:23:58 2018
  OS/Arch:      linux/amd64
  Experimental: false

2、查看更详细信息

[root@host2 ~]# docker info
Containers: 0
 Running: 0
 Paused: 0
 Stopped: 0
Images: 0
Server Version: 18.03.1-ce
Storage Driver: overlay2
...
# 包括,支持的网络模型、运行时环境、底层文件系统等信息;

docker存储引擎

​ docker支持overlay2和devicemapper文件系统,用于存储镜像、支撑分层构建、联合挂载的特性;默认是overlay2,

​ 当docker的数据目录/var/lib/docker是一块单独的磁盘分区,格式是xfs时,格式化时需要加上-n ftype=1选项,否则启动容器会报错without d_type support

[root@host2 ~]# xfs_info /
meta-data=/dev/sda2              isize=512    agcount=4, agsize=2555840 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0 spinodes=0
data     =                       bsize=4096   blocks=10223360, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal               bsize=4096   blocks=4991, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
# 采用的/分区,未单独分区,且有ftype=1选项,因此可以正常使用;

docker镜像加速

​ 默认docker的镜像为docker官方,境外,所以速度较慢,一般需配置为国内镜像加速站点,如阿里,

​ 登陆阿里云官网,找到镜像加速器,会生成一个专用的加速器地址

​ https://cr.console.aliyun.com/

# 根据官方提示,将registry-mirrors替换为自己的地址即可;

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://xxxx.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

# 查看docker info中镜像信息,说明镜像生效;
[root@host2 ~]# docker info |grep -C 2 mirro
 127.0.0.0/8
Registry Mirrors:
 https://xxxxx.mirror.aliyuncs.com/
Live Restore Enabled: false
updatedupdated2020-10-292020-10-29
加载评论