文章目录
Docker基础与安装
一、Docker概述
Docker是什么?
Docker 是一个开源的应用容器引擎,基于GO 语言并遵从 Apache2.0 协议开源。
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
Docker 从 17.03 版本之后分为 CE(Community Edition: 社区版) 和 EE(Enterprise Edition: 企业版),我们用社区版就可以了
沙箱机制
Sandboxie(又叫沙箱、沙盘)即是一个虚拟系统程序,允许你在沙盘环境中运行浏览器或其他程序,因此运行所产生的变化可以随后删除。它创造了一个类似沙盒的独立作业环境,在其内部运行的程序并不能对硬盘产生永久性的影响。 在网络安全中,沙箱指在隔离环境中,用以测试不受信任的文件或应用程序等行为的工具。
二、Docker的使用场景
K8S(更方便管理集群性质容器的软件) image镜像+container容器的方式
工作流程:
war,jar包—》GitHub(公共仓库)gitlib(私有仓库)—》Jenkins(测试)—》应用程序封装/构建镜像—》运维下载,使用容器技术进行运行发布。
打包应用程序简单部署
可脱离底层硬件任意迁移(实现了应用隔离,将应用拆分并进行解耦)
持续集成和持续交付(CI/CD):开发到测试
部署微服务
提供PASS{OpenStack的云主机类似于阿里云的ecs属于IAAS,docker(K8S)属于PASS}
IAAS:基础设施即服务
SAAS:应用即服务
PASS:平台即服务
docker的三要素
镜像(docker image):模板
容器(docker container):基于镜像,运行时状态
仓库:存放镜像模板。① 公共仓库(docker hub)②私有仓库(registry harbor)
使用docker的意义
docker是一种标准化的封装和运行平台(docker引擎),统一的封装方式是镜像,统一的运行方式是容器方式。
三个统一:
docker引擎统一了基础设施环境(docker环境用镜像封装一个简易的操作系统)
docker引擎统一了程序打包方式(docker镜像images)
docker引擎统一了程序部署(运行)方式:docker容器基于镜像运行为容器
实现了一次构建,多次多处使用
三、docker引擎和架构
1.docker引擎(docker engine)
docker引擎是具有以下主要组件的C/S(客户端/服务器)应用程序
server端:服务器是一种长期运行的程序,称为守护程序进程(dockerd)
client端:rest api接口,它指定程序可以用来与守护程序进行通信并指示其操作
客户端与守护进程通过rest api接口互动
命令行界面(CLI)与客户端(docker)的交互:
由外到内,最里面的是内核,server端运行着守护进程,来执行docker的具体指令
server通过rest api去和client来进行交互
client最主要有两个作用
使用命令导入的方式与rest api进行交互,例如:docker images,查看当前的镜像有哪些。server就会有相对应的返回值
查看docker-server返回的结果
是为用户提供命令的输入,以及显示接收到的输出结果
2.docker架构(docker architecture)
请求镜像步骤
- 先由客户端进行创建操作步骤(查看、读取等)
- 这些操作步骤到达Docker中的守护进程,由守护进程进行处理请求
- 如果请求的镜像,本地仓库有的话,就直接引导到本地仓库进行找到镜像
- 如果该请求本地仓库没有镜像,就指引到公共仓库去下载镜像,镜像下载之后,将镜像解析成容器
docker使用C/S架构,docker客户端与docker守护进程进行对话,该守护进程完成构建,运行和发布docker容器的繁重工作。
docker区别于传统的虚拟化,不需要虚拟化硬件资源直接使用容器引擎,所以速度较快。
docker client:
①客户端提供提供一个与用户交互展示的平台
②管理控制docker服务端功能的的工具
docker客户端是许多docker用户与docker交互的主要方式。当使用命令时,如(docker run)客户端会将这些命令发送到dockerd,以执行这些命令。该docker命令使用docker API接口。docker客户端可以与多个守护进程通信
docker daemon(守护进程):
docker守护程序dockerd监听docker API请求并管理docker对象(例如:图像,网络,容器和卷)。docker守护程序还可以与其他守护程序通信以便管理docker服务。
3.docker与VM的区别
不同点 | container | VM |
---|---|---|
启动速度 | 秒级 | 分钟级 |
运行性能 | 接近原生(直接在内核中运行) | 50%左右损失 |
磁盘占用 | MB | GB |
运行数量 | 成百上千 | 一般几十台 |
隔离性 | 进程级别 | 系统级别(更彻底) |
操作系统 | 主要支持Linux | 几乎所有 |
封装程度 | 只打包项目代码和依赖关系,共享宿主机内核 | 完整的操作系统,与宿主机隔离 |
四、docker原理
Docker核心解决的问题是利用LX容器来实现类似VM的功能,从而利用更加节省的硬件资源提供给用户更多的计算资源。同VM的方式不同, LX容器 其并不是一套硬件虚拟化方法,无法归属到全虚拟化、部分虚拟化和半虚拟化中的任意一个,而是一个操作系统级虚拟化方法, 理解起来可能并不像VM那样直观。所以我们从虚拟化到docker要解决的问题出发,看看他是怎么满足用户虚拟化需求的。
用户需要考虑虚拟化方法,尤其是硬件虚拟化方法,需要借助其解决的主要是以下4个问题:
- 隔离性 - 每个用户实例之间相互隔离, 互不影响。 硬件虚拟化方法给出的方法是VM, LX容器给出的方法是container,更细一点是kernel namespace
- 可配额/可度量 - 每个用户实例可以按需提供其计算资源,所使用的资源可以被计量。硬件虚拟化方法因为虚拟了CPU, memory可以方便实现, LX容器则主要是利用cgroups来控制资源
- 移动性 - 用户的实例可以很方便地复制、移动和重建。硬件虚拟化方法提供snapshot和image来实现,docker(主要)利用AUFS实现
- 安全性 - 这个话题比较大,这里强调是host主机的角度尽量保护container。硬件虚拟化的方法因为虚拟化的水平比较高,用户进程都是在KVM等虚拟机容器中翻译运行的, 然而对于LXC, 用户的进程是lxc-start进程的子进程, 只是在Kernel的namespace中隔离的, 因此需要一些kernel的patch来保证用户的运行环境不会受到来自host主机的恶意入侵, dotcloud(主要是)利用kernel grsec patch解决的.
cgroup和namespace两者构成了docker的底层原理
1.名称空间(Namespaces)
LX容器所实现的隔离性主要是来自内核的namespace, 其中pid, net, ipc, mnt, uts 等namespace将container的进程, 网络, 消息, 文件系统和hostname 隔离开。
容器隔离了6个名称空间
名称 | 作用 |
---|---|
mount | 文件系统,挂载点 |
user | 操作进程的用户和用户组 |
pid | 进程编号 |
UTS | 主机名或主机域 |
ipc | 信号量,消息队列,共享内存 |
net | 网络设备,网络协议栈,端口等 |
linux内核版本3.8才完善了6个命名空间,因此linux内核版本3.8+才可以运行docker
2.控制组(control groups)
cgoups是linux内核态中的资源管理模块,linux上的docker引擎还依赖与另一种称为控制组(cgroups)的技术。cgroups将应用程序限制为一组特定的资源,控制组允许docker engine将可用的硬件资源共享给容器,并有选择的实施限制和约束。例如可以限制特定容器可用的内存。
五、docker部署
环境配置
关闭防火墙
[root@node1 ~]# systemctl stop firewalld
[root@node1 ~]# setenforce 0
更改主机名
[root@node1 ~]# hostnamectl set-hostname docker
[root@node1 ~]# su -
安装docker依赖环境
[root@docker ~]# yum install -y yum-utils device-mapper-persistent-data lvm2
设置阿里云镜像资源
[root@docker ~]# cd /etc/yum.repos.d
[root@docker ~]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
安装Docker-CE并设置为开机自启
[root@docker ~]# yum install -y docker-ce
[root@docker ~]# systemctl start docker.service #启动
[root@docker ~]# systemctl enable docker.service #开机自启
如果安装出错则输入
yum install --setopt=obsoletes=0 \
docker-ce-17.03.2.ce-1.el7.centos.x86_64 \
docker-ce-selinux-17.03.2.ce-1.el7.centos.noarch # on a new system with yum repo defined, forcing older version and ignoring obsoletes introduced by 17.06.0
镜像加速器:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
cd /etc/docker #需先启动docker,才会有该目录
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://..."]
}
EOF
systemctl daemon-reload
#修改了docker服务配置文件,可以使用重载使配置文件生效
systemctl restart docker
#网络优化
vim /etc/sysctl.conf
net.ipv4.ip_forward=1 #ipv4转发功能
sysctl -p #刷新
总结
1.docker的三要素:镜像、容器、仓库
2.使用容器的意义,docker引擎的三个统一:基础设施环境,程序打包方式,程序运行方式
3.C/S架构交互
4.docker与VM的区别
5.docker底层原理