Docker与虚拟化技术浅析第一弹之docker与Kubernetes
提供轻量简单的建模方式;
职责的逻辑分离;
快速高效的开发生命周期;
鼓励使用面向服务的架构,即单个容器运行单个应用。
Docker本质上是运行在宿主机上的进程,它通过namespace实现了资源隔离,并通过cgroups实现了资源限制,同时通过写时复制(copy-on-write)实现了高效的文件操作。
cgroups是Linux内核提供的一种机制,这种机制可以根据需求把一系列系统任务及其子任务整合(或分隔)到按资源划分等级的不同组内,从而为系统资源管理提供一个统一的框架。也就是说,cgroups可以限制、记录任务组所使用的物理资源(包括CPU、memory、IO等),为容器实现虚拟化提供了基本保证,是构建Docker等一系列虚拟化管理工具的基石。
资源限制:cgroups可以对任务使用的资源总额进行限制。
优先级分配:通过分配的CPU时间片数量以及磁盘IO带宽大小,实际上就相当于控制了任务运行的优先级。
资源统计:cgroups可以统计系统的资源使用量,如CPU使用时长等。
任务控制:cgroups可以对任务执行挂起、恢复等操作。
Docker守护进程可以直接与主操作系统进行通信,为各个Docker容器分配资源;它还可以将容器与主操作系统隔离,并将各个容器互相隔离。虚拟机启动需要数分钟,而Docker容器可以在数毫秒内启动。由于没有臃肿的从操作系统,Docker可以节省大量的磁盘空间以及其他系统资源。
说了这么多Docker的优势,大家也没有必要完全否定虚拟机技术,因为两者有不同的使用场景。虚拟机更擅长于彻底隔离整个运行环境。例如,云服务提供商通常采用虚拟机技术隔离不同的用户。而Docker通常用于隔离不同的应用,例如前端,后端以及数据库,类似一个“沙箱”。
3.1 Docker三大概念和两句口号
镜像(Image)
容器(Container)
仓库(Repository)
Build, Ship and Run
Build once,Run anywhere
3.2 认识Dockerfile
from tomcat
MAINTAINER yangjianmin@jd.com
RUN rm -rf /usr/local/tomcat/webapps/*
COPY jhjkhkj.zip /usr/local/tomcat/webapps
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
3.3 镜像与分层
% docker image inspect nginx:latest
[
{
: ,
: [
],
略过一些内容。。。
"RootFS": {
"Type": "layers",
"Layers": [
"sha256:2edcec3590a4ec7f40.....41ef9727da6c851f",
"sha256:e379e8aedd4d72bb4c.....80179e8f02421ad8",
"sha256:b8d6e692a25e11b0d3.....e68cbd7fda7f70221",
"sha256:f1db227348d0a5e0b9.....cbc31f05e4ef8df8c",
"sha256:32ce5f6a5106cc637d.....75dd47cbf19a4f866da",
"sha256:d874fd2bc83bb3322b.....625908d68e7ed6040a6"
]
},
"Metadata": {
"LastTagTime": "0001-01-01T00:00:00Z"
}
可以看到,我从远端拉下来的最新的nginx镜像是由六层结构组成的,当我们拉取镜像时也可以看到分层拉取的记录,为了尽量减少镜像层数,在写Dockerfile时应尽量整合RUN命令,因为每运行一次RUN命令,层数就会加1。
3.4 镜像运行
docker run -d -p 91:80 nginx:运行nginx镜像,-d表示相关启动日志后台展示,-p是将本机操作系统的端口和容器内部端口做映射,起到将docker容器指定端口对外暴露的作用。我们便可以通过访问91端口请求到刚刚启动的nginx。
docker ps:可以查看已经运行的容器的情况。
有关docker的操作命令不在本文展开介绍,感兴趣的小伙伴可以自行学习。
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mytest latest 26d746eb2c68 26 hours ago 680MB
nginx latest 605c77e624dd 13 days ago 141MB
tomcat latest fb5657adc892 2 weeks ago 680MB
latest 26d80cd96d69 5 weeks ago 28.5MB
~ % docker run -d -p 91:80 nginx
dcf193ebf5dd1b3267eddff37158535036918451938c4c90f98d2b12edf6c608
~ % docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
dcf193ebf5dd nginx "/docker-entrypoint.…" 10 seconds ago Up 9 seconds 0.0.0.0:91->80/tcp nifty_stonebraker
Docker-Compose项目由Python编写,调用Docker服务提供的API来对容器进行管理。因此,只要所操作的平台支持Docker API,就可以在其上利用Compose来进行编排管理。
docker-compose.yml
mysql:
image: daocloud.io/yjmyzz/mysql-osx:latest
volumes:
./mysql/db:/var/lib/mysql
ports:
3306:3306
environment:
MYSQL_ROOT_PASSWORD=123456
service1:
image: java:latest
volumes:
./java:/opt/app
expose:
8080
#ports:
# - 9081:8080
links:
mysql:default
command: java -jar /opt/app/spring-boot-rest-framework-1.0.0.jar
service2:
image: java:latest
volumes:
./java:/opt/app
expose:
8080
#ports:
# - 9082:8080
links:
mysql:default
command: java -jar /opt/app/spring-boot-rest-framework-1.0.0.jar
nginx1:
image: nginx:latest
volumes:
./nginx/html:/usr/share/nginx/html:ro
./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
./nginx/conf.d:/etc/nginx/conf.d:ro
#expose:
# - 80
ports:
"80:80"
links:
service1:service1
service2:service2
4.1 docker-machine
6.1 K8S名字的由来
6.2 Kubernetes 特点
可移植: 支持公有云,私有云,混合云,多重云(multi-cloud)
可扩展: 模块化, 插件化, 可挂载, 可组合
自动化: 自动部署,自动重启,自动复制,自动伸缩/扩展
自动化容器部署和复制。
实时弹性收缩容器规模。
容器编排成组,并提供容器间的负载均衡。
6.3 K8S架构和组件
etcd:一个高可用的K/V键值对存储和服务发现系统。
flannel:实现跨主机的容器网络的通信。
kube- apiserver:提供Kubernetes集群的API调用。
kube- controller-manager:确保集群服务。
kube- scheduler:调度容器,分配到Node。
kubelet:在Node节点上按照配置文件中定义的容器规格启动容器。
kube-proxy:提供网络代理服务。
6.4 私有云架构
参考文章:
Docker 背后的内核知识——cgroups 资源限制:https://www.infoq.cn/article/docker-kernel-knowledge-cgroups-resource-isolation/
Docker背后的内核知识:https://www.cnblogs.com/beiluowuzheng/p/10004132.html
swarm与kubernetes对比:https://blog.csdn.net/weixin_41282397/article/details/80771237
K8S 超详细总结!:https://blog.csdn.net/weixin_38320674/article/details/114684086
K8S中文社:https://www.kubernetes.org.cn/k8s