Docker出现
环境配置麻烦
docker是基于go语言开发的
传统的虚拟机技术虚拟了一套硬件,运行完整的操作系统,再运行软件
而容器化技术没有内核,容器内的应用直接运行在宿主机内核上。容器间相互隔离
DevOps(开发、运维)
快速交付和部署
Docker安装 Docker概念 将应用和环境打包成一个镜像
镜像
可以理解为一个模板,通过这个模板来创建容器服务,一个镜像可以创建多个容器,
容器
Docker利用容器化技术,创建一个或多个应用,
Docker的工作原理 Docker是一个client-server,后台守护进程
docker为什么比vm快
docker有比vm更少的抽象层
docker利用宿主机的内核,不需要像vm那样用guest os
Docker命令 1 2 3 4 5 docker info #显示docker系统信息 docker 命令 --help #docker帮助命令 # 卸载docker xxx remove docker-ce docker-ce-cli containerd.io xxx rm -rf /var/lib/docker #docker默认工作路径
Docker镜像 1 2 3 4 5 6 7 8 9 docker images #docker查看全部镜像 # 可选项 -a, --all #全部镜像 -q, --quiet #只显示id docker search 镜像名 #搜索 docker pull mysql:5.7 #拉镜像到本地,不写tag默认是latest。分层下载,联合文件系统 docker rmi -f 容器id 容器id #删除一个或多个镜像 docker rmi -f $(docker images -aq) #删除全部镜像
Docker容器 1 2 3 4 5 6 7 8 docker run 可选参数 image # 参数 --name #容器命名 -d #后台运行 -it #使用交互模式运行,可进入容器查看,退出用exit命令 -p #指定容器端口,格式:主机端口:容器端口 docker run -it --rm image #官方的写法,容器用完即删除,ps -a查不到,一般用于测试
1 2 3 4 5 docker ps #列出正在运行的容器, # 参数 -a #所有运行过的容器 -n=? #显示最近创建的容器 -q #只显示容器id
1 2 3 # 退出容器 exit #停止并退出容器 Ctrl+P+Q #不停止退出容器
1 2 3 4 # 删除容器 docker rm 容器id #删除指定容器,不能删除正在运行的容器,除非用rm -f强制删除 docker rm -f $(docker ps -aq) #删除全部容器 docker ps -a -q |xargs docker rm #删除全部容器
1 2 3 # 启动和重启一个命令 docker start/restart/stop 容器id #启动/重启/停止容器 docker kill 容器id #强制停止容器
Docker常用其他命令 后台运行容器
1 2 # 使用docker -d 启动一个容器后台运行时,使用docker ps查看发现没有运行,原因:docker容器使用后台运行,必须要有一个前台进程,如果docker发现没有应用,就会自动停止 docker -d 容器
查看日志
1 2 3 docker logs 容器 #查看容器日志 -tf #格式化输出 --tail number #显示日志条数
查看容器内进程
查看镜像元数据
进入容器执行命令
1 2 docker exec -it 容器id [shell] docker attach 容器id
从容器拷贝内容到主机
1 2 3 4 5 6 7 docker cp 容器id 容器文件路径 主机路径 [node1] (local ) root@192.168.0.8 ~ $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES fb6175283327 centos "/bin/bash" 5 minutes ago Up 55 seconds focused_mcclintock [node1] (local ) root@192.168.0.8 ~ $ docker cp fb6175283327:/root/test.txt ./ [node1] (local ) root@192.168.0.8 ~ $ ls test.txt
小结
Docker镜像加载原理
UnionFS联合文件系统
docker的镜像实际由一层一层的文件系统组成,这种层级的文件系统叫unionFS。
bootfs主要包含bootloader和kernel,BootLoader主要是引导加载kernel,Linux刚启动时会加载bootfs,在docker镜像的最底层是bootfs,这和Linux/unix是一样的,当boot加载完成后,整个内核就都存在于内存中了,此时内存的使用权会交给kernel,系统会卸载bootfs
rootfs在bootfs之上,包含典型Linux系统中的/dev, /bin等标准目录文件,rootfs就是不同的操作系统发行版,如centos,Ubuntu。
所有的docker镜像都始于一个基础镜像层。docker的镜像都是只读的,当容器启动时,一个新的可写层被加入到镜像顶部,这一层就是常说的容器层,所有的操作都是基于容器层的,
commit镜像 1 docker commit -m="描述信息" -a="作者" 容器id 目标镜像名:[tag]
容器数据卷 什么是容器数据卷 数据可以持久化保存,容器之间有一个数据共享的技术,docker容器产生的数据,同步到本地。将容器内的目录挂载到系统目录上。容器之间也可数据共享
使用数据卷
方式1:直接使用命令挂载
1 2 3 4 docker run -it -v 主机目录:容器目录 容器 docker run -it -v /home/test:/home # 挂载后主机目录下的文件和容器内的文件会同步 docker inspect id 可查看
Dockerfile Docker网络 Docker compose Kubernetes k8s
使用minikube模拟k8s集群 安装和配置集群环境 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 brew install minikube minikube start > 😄 Darwin 12.6.5 上的 minikube v1.32.0 ✨ 自动选择 docker 驱动 📌 使用具有 root 权限的 Docker Desktop 驱动程序 👍 正在集群 minikube 中启动控制平面节点 minikube 🚜 正在拉取基础镜像 ... 💾 正在下载 Kubernetes v1.28.3 的预加载文件... > preloaded-images-k8s-v18-v1...: 403.35 MiB / 403.35 MiB 100.00% 742.36 > gcr.io/k8s-minikube/kicbase...: 453.90 MiB / 453.90 MiB 100.00% 519.29 🔥 Creating docker container (CPUs=2, Memory=4000MB) ... 🐳 正在 Docker 24.0.7 中准备 Kubernetes v1.28.3… ▪ 正在生成证书和密钥... ▪ 正在启动控制平面... ▪ 配置 RBAC 规则 ... 🔗 配置 bridge CNI (Container Networking Interface) ... 🔎 正在验证 Kubernetes 组件... ▪ 正在使用镜像 gcr.io/k8s-minikube/storage-provisioner:v5 🌟 启用插件: storage-provisioner, default-storageclass 🏄 完成!kubectl 现在已配置,默认使用"minikube" 集群和"default" 命名空间
minikube安装完成后,可使用kubectl命令管理集群,kubectl 语法:
1 kubectl [command ] [type ] [name] [flags]
namespace namespace 的作用是实现多套环境的资源隔离或多租户的资源隔离,两个被划分到不同namespace 的pod将不能互相访问。kubernetes在集群启动后会默认创建几个namespace
查看命名空间
1 2 3 4 5 6 7 8 (base) lilonghui@lilonghuideMacBook-Pro ~/Desktop> kubectl get namespace NAME STATUS AGE default Active 13d kube-node-lease Active 13d kube-public Active 13d kube-system Active 13d
1 2 3 4 5 6 7 8 9 10 11 12 kubectl create ns dev kubectl delete ns dev kubectl create|delete -f ns-dev.yaml apiVersion: v1 kind: Namespace metadata: name: dev
pod pod是k8s管理的最小单元,程序部署在容器中,而容器存在于pod中。一个pod可以存在一个或多个容器。
1 2 3 4 5 6 7 8 9 10 (base) lilonghui@lilonghuideMacBook-Pro ~/Desktop> kubectl get pod -n kube-system NAME READY STATUS RESTARTS AGE coredns-5dd5756b68-zqlv6 1/1 Running 1 (18m ago) 13d etcd-minikube 1/1 Running 1 (18m ago) 13d kube-apiserver-minikube 1/1 Running 1 (18m ago) 13d kube-controller-manager-minikube 1/1 Running 1 (18m ago) 13d kube-proxy-2hfq4 1/1 Running 1 (18m ago) 13d kube-scheduler-minikube 1/1 Running 1 (18m ago) 13d storage-provisioner 1/1 Running 26 (17m ago) 13d
参考资料 前端运维k8s基础