docker简介
容器技术
容器:顾名思义,像杯子、集装箱都是容器,类比水杯,无论外面或里面怎么变,都不会影响到里面或外面,即起到隔离的作用,避免了相同影响
在it领域,容器技术即为靠软件逻辑实现不同软件之间的隔离,包括资源隔离、运行环境隔离等,避免相互影响,变动只影响自己,避免牵一发而动全身,
最早的容器是freebsd中出现的jail;linux内核也实现了容器为lxc(linux container)docker最早就是对lxc的进一步封装,使之更易用;后来docker采用runc替换了lxc
lxc官网:https://linuxcontainers.org/
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程序
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三大理念
- build——构建
- ship——运输
- 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