k8s系列-第三篇讲解docker原理,进而进阶到k8s原理。
1.docker概述
docker的出现,是为了解决容器的编排问题(容器本身没有价值,容器编排解决了开发生产环境不一致的问题,同时解决了大规模部署问题,也大大方便了我们开发,运维成本)。具体用途(1)标准化打包。(2)隔离。(3)标准化部署。
1.1 容器与虚拟机
虚拟机和容器的区别:
(1)共享宿主机资源还是模拟:
虚拟机采用模拟的方式,通过Hypervisor的软件即硬件虚拟化功能,模拟操作系统运行的必备硬件,比如CPU、内存、I/O设备等。
容器其实就是宿主机上的一个进程,所以本质上还是用的宿主机的硬件。
(2)隔离性
虚拟机是Hypervisor来实现强隔离机制。容器是软隔离,消耗资源也比较少。容器只能看到Namespace所限定的资源,网络,文件,状态,设备或者配置等。而完全看不到宿主机及其它不相关程序。
(3)启动数量
容器启动数量要远远多于虚拟机的启动数量。容器依赖的资源更少。
1.2容器核心技术
容器通过CGroups,Networking,Namespaces,Storage来实现隔离与限制。CGroups限制CPU,内存,设备的使用。Networking实现docker网络与容器,容器与容器之间的互联互通。Namespaces限定进程视线,只能看到指定的内容。
容器通过分层的组织方式。类似洋葱结构,若两个容器底层镜像相同,他们可以共用镜像层。
容器的四大组成部分。镜像 ( Image )、容器 ( Container )、网络 ( Network )、数据卷 ( Volume )。
(1)镜像: 虚拟环境运行最原始文件系统的内容。Docker 的镜像实质上是无法被修改的,因为所有对镜像的修改只会产生新的镜像,而不是更新原有的镜像。(2)容器:隔离虚拟环境的基础设施,镜像跑起来就是容器,一个镜像可以跑多个容器。(3)网络:docker容器内部网络可以进行配置,还可以在容器之间建立虚拟网络,甚至可以跨节点构建虚拟网络实现多台物理机上容器的互通互联。(4)数据卷:为了保证数据的安全性以及独立性,将容器中的关键数据挂载到宿主机的文件系统。
1.3 docker Engine:实现容器化的工具
docker engine最核心的组件就是 docker daemon 和 docker CLI 。Docker 所能提供的容器管理、应用编排、镜像分发等功能都集中在了daemon中。同时其向外暴露了restful api,通过docker cli与docker daemon进行交互。
1.4 docker容器运行示例图
(1)构建镜像发布到docker hub上。docker build。
(2)从镜像仓库拉去镜像。docker pull。当然若本地已经有了,之间用本地的。
(3)运行镜像。docker run。
(1)启动dockersystemctl start docker(2)查看启动状态systemctl status docker(3)重新启动dockersystemctl restart docker(4)停止dockersystemctl stop docker(5)开机启动dockersystemctl enable docker(6)基础命令docker create --name myNginx nginx:1.12 # Created 状态的 返回容器 IDdocker start myNginxdocker stop myNginxdocker run --name myNginx -d nginx:1.12 #docker create 和start的结合`-d` 后台启动docker exec -it myNginx bash #进入myNginx容器docker ps #查看所有的运行的容器docker ps -a #查查看所有容器docker info #可以查看镜像加速器是否生效docker images #查看所有镜像docker ps -f status=exited #查看停止的容器docker logs 容器id #查看容器的日志docker rmi 镜像iddocker rm 容器id
1.5 多容器运行部署
docker compose技术帮助我们实现多个容器的发布。把多容器的架构依赖关系,按照docker compose规范写在 docker-compose.yml 文件里。而且支持一键部署(docker-compose up)。
docker-compose updocker-compose downdocker-compose logs nginx-d 选项使其“后台”运行-f 来修改识别的 Docker Compose 配置文件-p 选项来定义项目名
二、实战
2.1 Springboot
2.2.1 简单的Dockerfile
FROM java:8-jdk-alpineCOPY ./target/cloud-userservice-1.0.0.jar /usr/app/WORKDIR /usr/appENTRYPOINT ["java", "-jar", "cloud-userservice-1.0.0.jar"]
2.2 Node以及vue/angular/react
2.2.1 angular简单的Dockerfile,其他类似
FROM node:alpine as builderWORKDIR '/build'COPY myangular ./myangularWORKDIR '/build/myangular'RUN npm installRUN npm run buildRUN ls /build/myangular/distFROM nginxEXPOSE 80COPY --from=builder /build/myangular/dist /usr/share/nginx/html#下面是openresty配置# build server#FROM openresty/openresty:1.15.8.1-1-centos#COPY --from=builder /build/myangular/dist /usr/local/openresty/nginx/html/#RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \ sed -i '/index index.html index.htm;/a\ try_files $uri $uri/ /index.html;' /etc/nginx/conf.d/default.conf#CMD ["/usr/local/openresty/bin/openresty", "-g", "daemon off;"]
三、参考资料
1.https://docs.docker.com/
2.https://time.geekbang.org/course/detail/204-108204
3.https://time.geekbang.org/column/intro/116