文章目录
一、docker概述
- 官网:www.docker.com
- docker官方镜像仓库:hub.docker.com
- Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows操作系统的机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口
1.为什么会有docker出现?
-
以linux而言,linux操作系统会有一个主进程pid=1,派生出其他进程来控制不同服务
例如:pid=2—python
pid=3—java
pid=4—php
三个服务可能会相互影响 -
使用者期望讲这三个不同的服务,跑在不同的运行时环境中实现相互不影响,同时不会增加服务器成本,一次延伸出 能否将这三种服务分别封装起来,所以就有了kvm虚拟化技术,实现了一个操作系统模拟多个操作系统/不同的运行时环境,而随着技术发展,虚拟化技术开销较大(例如:只要运行一个py脚本,想要使用虚拟化方式实现,还需要安装一个操作系统,并不方便/合理)由此,延伸出了容器技术
2.docker是啥
- docker是基于容器技术的轻量级虚拟化解决方案;
- docker是容器技术,把linux的cgroup、namespaces等容器底层技术进行完美的封装、并抽象为用户提供创建和管理容器的便捷界面(命令行cli、api等)c/s
3.使用docker有什么意义
- 实现了三个统一
- docker引擎统一了基础设施环境-docker环境―—》image —》封装一个简易的操作系统
- docker引擎统一了程序打包(装箱/封装-类比于集装箱)方式-docker镜像—》images
- docker引擎统一了程序部署(运行)方式-docker容器——》基于镜像-》运行为容器(可运行的环境)
- 实现了一次构建、多次、多处使用
- 需要内核在3.8以上
4.docker与VM区别
不同点 | container | VM |
---|---|---|
启动速度 | 分钟级 | 耖级 |
运行性能 | 接近原生(共享内核资源) | 50%左右损失 |
磁盘占用 | MB | GB |
数量 | 成百上千 | 一般几十台 |
隔离性 | 进程级别 | 系统级别(更彻底) |
操作系统 | 主要支持Linux | 几乎所有 |
- docker解决了vm的一个环境孤岛的问题
- docker可以自定义传参(创建-创建镜像/容器、启动(基于镜像启动)之前)
二、docker的使用场景
- K8s image镜像+ container容器的方式
- war iar —》aithub aitlab 私有仓库(代码仓库)—》jenkins(测试)
- (应用程序封装/构建镜像)—》运维下载,使用容器技术进行运行/发布
- 打包应用程序简单部署
- 可脱离底层硬件任意迁移(实现了应用的隔离,将应用拆分并进行解耦),例如:服务器从腾讯云迁移到阿里云
- 持续集成和持续交付(CI/CD) :开发到测试发布
- 部署微服务
- 提供PAAS产品(平台即服务){OpenStack的云主机类似于阿里云的Ecs,属于IAAS、Docker (K8s) 属于PAAS}
1.docker三要素
镜像:
Docker的镜像是创建容器的基础,类似虚拟机的快照,可以理解为一个面向 Docker 容器引擎的只读模板
通过镜像启动一个容器,一个镜像是一个可执行的包,其中包括运行应用程序所需要的所有内容包含代码,运行时间,库、环境变量、和配置文件
容器:
Docker的容器是从镜像创建的运行实例,它可以被启动、停止和删除。所创建的每一个容器都是相互隔离、互不可见,以保证平台的安全性
可以把容器看做是要给简易版的linux环境(包括root用户权限、镜像空间、用户空间和网络空间等)和运行在其中的应用程序。
仓库:
Docker仓库是用来集中保存镜像的地方,当创建了自己的镜像之后,可以使用push命令将它上传到公有仓库(Public)或者私有仓库(Private)。当下次要在另外一台机器上使用这个镜像时,只需从仓库获取
Docker 的镜像、容器、日志等内容全部都默认存储在 /var/lib/docker 目录下。
三、Docker引擎(Docker Engine)
- Docker Engine是具有以下主要组件的c/s客户端-服务器应用程序:
- server端:服务器是一种长期运行的程序,称为守护程序进程( dockerd命令)
- CLIENT端:REST API,它指定程序可以用来与守护程序进行通信并指示其操作的接口
- 命令行界面(CLI)客户端( docker命令)。
四、docker的架构
- Docker使用客户端-服务器架构。Docker 客户端与Docker守护进程进行对话,该守护进程完成了构建,运行和分发nocker容器的繁重工作。
- Docker区别于传统的虚拟化,不需要虚拟硬件资源,直接使用容器引擎,所以速度快
- Docker Cclient: 客户端/提供一个与用户交互,展示的平台+管理、控制docker服务端(功能)的工具 docker
- Docker客户端(docker)是许多Docker用户与Docker交互的主要方式。当您使用诸如之类的命令时docker run,客户端会将这些命令发送到dockerd,以执行这些命令。该docker命令使用pocker APT。Docker客户端可以与多个守护程序通信。
- Docker daemon:守护进程
- Docker守护程序( dockerd)侦听Docker
- API请求并管理Docker对象,例如图像,容器,网络和卷。守护程序还可以与其他守护程序通信以管理pocker服务。
- Docker images:镜像
- cgroups namespace
- 容器可以被打包成镜像
- Docker container:容器
- Docker registry:镜像仓库(yum仓库)
小结
docker三大组件
- 镜像:一组资源集合,包含了应用程序软件包、应用程序相关的依赖包、运行应用程序所需要的基础环境(泛指操作系统环境),可以理解为容器的模板
- 容器:基于镜像的一种运行时状态
- 仓库:存放image镜像,仓库大类:1、公共仓库—》docker hub
2、私有仓库registry harbor
五、名称空间
- Docker使用一种称为namespaces提供容器的隔离工作区的技术。运行容器时,Docker会为该容器创建一组名称空间。
- 这些名称空间提供了一层隔离。容器的每个方面都在单独的名称空间中运行,并且其访问仅限于该名称空间。
- Docker Engine在Linux上使用以下名称空间:
名称空间 | 描述 |
---|---|
mount | 资源控制与namespaces结合控制管理了6个名称空间资源(以下) |
user | 文件系统,挂载点—》》一个文件系统内,不能重复挂载一个指定目录,例如:/mnt |
pid | 进程编号 |
uts | 主机名和主机域 |
ipc | 信号量、消息队列,共享内存(理解,不同的应用调用内存资源的时候应该使用不同的内存空间) |
net | 网络设备、网络协议栈、端口等 |
- 该pid命名空间:进程隔离(PID:进程ID) 。
- 该net命名空间:管理网络接口(NET:网络)。
- 该ipc命名空间:管理访问IPc资源( IPC:进程间通信)。
- 该mnt命名空间:管理文件系统挂载点(MNT::mount ) 。
- 该uts命名空间:隔离内核和版本标识符。(UTS:Unix时间共享系统)。
六、控制组
- Linux上的Docker引擎还依赖于另一种称为控制组(cgroups)的技术。cgroup将应用程序限制为一组特定的资源。控制组允许Docker Engine将可用的硬件资源共享给容器,并有选择地实施限制和约束。例如,您可以限制特定容器可用的内存。
七、安装docker
1.安装需要的依赖
yum install -y yum-utils device-mapper-persistent-data lvm2
2. 配置阿里docker镜像源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
3.本地索引缓存
yum makecache fast
4.安装docker
yum install docker-ce -y
#启动docker
systemctl start docker
#查看是否安装成功
docker version
5.阿里云镜像加速
5.1 登陆阿里云找到容器服务,找到镜像加速器
5.2 找到镜像加速地址
5.3 配置使用
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://g39835el.mirror.aliyuncs.com"]
}
EOF
systemctl daemon-reload
systemctl restart docker
- 生产经验
#docker-server端配置文件daemon . json
{
"graph" : " / data/docker" , #数据目录/var/ lib/docker
"storage-driver" : "overlay2" , #存储引擎,早期的时候存储引擎使用的是aufs,现在是overlay2
"insecure-registries": [ "registry.access.redhat.com" , "quary.io"] #私有仓库
"registry-mirrors" :[ "https :/lq"] #镜像加速
"bip": "172.7.5.1/24", #docker网络
"exec-opts" : [ "native.cgroupdriver=systemd" ], #启动时候的额外参数(驱动,k8s使用)
" live-restore" : true #当docker容器引擎挂掉的时候,使用docker跑起来的容器还能运行(分离)
}
以上是建议的配置项
docker容器网络生产经验
docker 的网络建议和宿主机的工P"对照”
比如宿主机 10.2.5.6容器的地址就可以修改为172.5.6.1,这样方便在故障发生时,更容易定位故障节点位置
6.网络优化
vim /etc/sysctl.conf
net.ipv4.ip_forward=1
sysctl -p
systemctl restart network
systemctl restart docker
7.测试docker
docker run hello-world
- 运行成功
- docker images可以看到刚才下载的hello-world
8.run的运行流程图
总结
- docker底层原理
由cgroup和namespaces两者构成了docker底层原理
cgroup资源控制与namespaces结合,控制管理的6个名称空间资源
名称空间 | 描述 |
---|---|
mount | 资源控制与namespaces结合控制管理了6个名称空间资源(以下) |
user | 文件系统,挂载点—》》一个文件系统内,不能重复挂载一个指定目录,例如:/mnt |
pid | 进程编号 |
uts | 主机名和主机域 |
ipc | 信号量、消息队列,共享内存(理解,不同的应用调用内存资源的时候应该使用不同的内存空间) |
net | 网络设备、网络协议栈、端口等 |
docker三要素
- 镜像:模板
- 容器:基于镜像,运行状态/运行时状态
- 仓库:存放镜像模板