banner
NEWS LETTER

Docker笔记整理

Scroll down

Docker出现

  • 环境配置麻烦
  • docker是基于go语言开发的
  • 传统的虚拟机技术虚拟了一套硬件,运行完整的操作系统,再运行软件
  • 而容器化技术没有内核,容器内的应用直接运行在宿主机内核上。容器间相互隔离

DevOps(开发、运维)

快速交付和部署


Docker安装

Docker概念

将应用和环境打包成一个镜像

镜像

可以理解为一个模板,通过这个模板来创建容器服务,一个镜像可以创建多个容器,

容器

Docker利用容器化技术,创建一个或多个应用,

Docker的工作原理

Docker是一个client-server,后台守护进程

docker为什么比vm快

  1. docker有比vm更少的抽象层
  2. 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
docker top 容器id

查看镜像元数据

1
docker inspect 容器id

进入容器执行命令

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

kubernetes

使用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 的作用是实现多套环境的资源隔离或多租户的资源隔离,两个被划分到不同namespacepod将不能互相访问。
kubernetes在集群启动后会默认创建几个namespace

查看命名空间

1
2
3
4
5
6
7
8
(base) lilonghui@lilonghuideMacBook-Pro ~/Desktop> kubectl get namespace     
NAME STATUS AGE
default Active 13d # 分配所有为置顶namespace的对象
kube-node-lease Active 13d # 集群节点直接的心跳维护
kube-public Active 13d # 此namespace下的资源可以被所有人访问
kube-system Active 13d # k8s系统创建的资源处于这个控件

# status=active表示命名空间正在使用中,terminating表示正在删除命名空间
1
2
3
4
5
6
7
8
9
10
11
12
# 创建命名空间
kubectl create ns dev
# 删除命名空间
kubectl delete ns dev

# 按照yaml配置文件创建/删除命名空间
kubectl create|delete -f ns-dev.yaml
# 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
# 查看pod
(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
1
2
# 创建和运行pod,运行pod需要通过pod控制器

参考资料

前端运维k8s基础

其他文章