Docker的基础
①、k8s是Docker的分布式管理的基础设施
②、 Docker-Compose是单节点的Docker容器管理的组件或者是基础设施
③、 当然也可以用手工的方式进行Docker的容器的管理。
上面的三种不管是哪种都要掌握Docker容器的底层原理
docker相关的命令:
docker -v:查看docker版本的相关的命令
systemctl start docker:启动docker容器
systemctl status docker:查看docker容器的状态
docker ps:验证docker是否可以使用
容器相关的命令:
docker run centos:创建容器
docker ps -a:查看容器的状态
docker stop id:停止容器
docker rm id:删除容器
docker top 容器名称:可以查看容器中正在运行的进程
docker ps --format "{{.Names}}":查找容器名称
镜像相关的命令
docker image ls:docker镜像查看
常用的几种进入Docker容器的方法
①、使用docker attach
使用该命令有一个问题:当多个窗口同时使用该命令进入该容器时,所有的窗口都会同步显示。如果有一个窗口阻塞了,那么其他的窗口也无法再进行操作,因为这个原因,所以dockerattach命令不太适合于生产环境,平时自己开发应用时可以使用该命令。
②、使用SSH
在生产环境中排除了使用docker attach命令进入容器之后,相信大家第一个想到的就是ssh。在镜像(或容器)中安装了ssh Server,这样就能保证多人进入。容器相互之间不受干扰了,相信大家在当前的生产环境中(没有使用Docker的情况)也是这样做的。但是使用了Docker容器之后不建议使用ssh进入到Docker容器内。
③、使用nsenter
1、什么是nsenter:
nsenter命令是一个可以在指定进程的命令空间下运行指定程序的命令。它位于util-linux包中。util-linux是一个开放源码的软件包,是一个对任何Linux系统的基本面工具套件,含有一些标准Unix工具,如Login。util-linux软件包包含许多工具,其中比较重要的是加载,卸载,格式化,分区和管理硬盘驱动器,打开tty端口和得到内核消息。
2、nsenter用途:
进入容器的网络命令空间,相当多的容器为了轻量级,是不包含较为基础的命令的,比如说ip address,ping,telnet,ss,tcpdump等等命令,这就给调试容器网络带来相当大的困扰。只能通过docker inspect ContainerID命令获取到容器IP,以及无法测试和其他网络的连通性。这时就可以使用nsenter命令仅进入该容器的网络命名空间,使用宿主机的命令调试容器网络。
3、nsenter的使用:
nsenter可以访问另一个进程的名称空间。所以为了连接到某个容器我们还需要获取该容器的第一个进程PID。可以使用docker inspect命令来拿到该进程的PID。
inspect命令可以分层级显示一个镜像或容器的信息。比如我们当前有一个正在运行的容器。可以使用docker inspect来查看该容器的详细信息
由于该信息非常多,此处只截取了其中一部分进行展示,如果要显示该容器的第一个进行的PID可以使用如下方式:
nsenter -target 上面查到的进程id --mount --uts --ipc --net --pid
解释下nsenter指令中进程id之后的参数的含义如下:
-mount:参数是进入到mount namsespace中(文件系统)
-uts:参数是进入到uts namespace中(主机名与域名)
-ipc:参数是进入到 System V IPC namespace中(信号量,消息队列和共享内容)
-net:参数是进入到network namespace中(网络设备,网络线,端口)
-pid:参数是进入到pid namespace中(进程编号)
例如进入容器的network namespace中:这时看到ip变化了
nsenter查看docker的连接
由于使用Docker的时候,established连接不会出现在netstat中,在运行中的docker容器中列出打开的套接字的方法:
sudo docker inspect -f {{.State.Pid}}
查看连接:
④、使用exec
docker exec -it 容器id /bin/bash
在公司的实际开发当中。因为我们公司的网路是隔离的,所以进行镜像的导入和导出打Tag的操作。
Docker本地镜像载入与载出
两种办法:
①、保存镜像(保存镜像载入后获得跟原镜像id相同的镜像)
②、保存容器(保存容器载入后获得跟原镜像id不同的镜像)
拉取镜像
通过命令可以从镜像仓库中拉取镜像,默认从Docker Hub获取。
命令格式:docker image pull:
保存镜像:
docker save 镜像id -o /home/rancher-agent.tar
载入镜像:
docker load -i /home/rancher-agent.tar
打个tag
Docker,containerd,containerd-shim和runc之间的关系
①、在上面的图里面都是进程:容器管理进程Docker Engine,和容器的进程runc
简单的理解每启动一个容器:会对应一组容器进程;
②、容器进程是由管理容器进程Docker Engine和containerd来管理的:为了不同
的容器厂商能够进行互操作,进行了剥离:把后台进程一分为二
Docker Engine负责接收客户端的命令解析客户端的命令;
③、containerd负责真正的容器管理进程:新的守护进程,符合标准的容器管理
OCI。dockerd和containerd两个后台进程通过标准化的协议grpc来进行通讯的,其
他的守护进程也可以使用,grpc和容器管理进程containerd进行通讯。可以做到不
同厂商的复用。
④、每个容器进程有两个进程:守护进程,很多时候我们的容器是在后端进行的,
所以有守护进程守护进程叫做:containerd-shim进程:为什么还要解耦出个进程,
因为要遵守OCI标准规范
⑤、runc:容器的启动进程,这个进程可以替换的,是完全遵守OCI的,而且在启动
的时候,这个代码是完全可以替换的。相当于containerd-shim是docker官方的,私
人的。容器启动进程和私有的通过shim做一个包装或者叫做隔离实现容器启动的兼
容性和替换性。
⑥、这两个进程负责容器的生命周期管理;runc这个进程创建完了容器之后,启动
完成之后就结束了所以看容器进程的时候是看不到runc,只能看到containerd-shim
进程。
⑦、容器的后台进程每个容器都有一个:容器进程树的父根,父进程;containerd-
shim
总体的架构:
docker-ctl:客户端命令 ->dockerd:后台守护进程解析 >containerd:容器的管理
--------exec ---->docker-shim ----exec----->runc:标准化的容器启动进程。