为什么要使用docker?
1 docker 与虚拟机的比较
1.1 docker容器对系统资源需求较少,一台主机上可以同时运行数千个docker容器。虚拟机对系统资源要求高!
1.2 docker通过编辑Dockerfile支持自动化创建和部署。虚拟机无法实现!
1.3 docker 启停可以在秒级实现。虚拟机要数分钟
2 dock而在开发和运维中的优势
对开发和运维人员来说,最梦寐以求的效果是:一次创建或配置,之后可以在任意时间 任意地方让应用正常运行。
docker优势:
2.1 更新管理简单:使用Dockerfile进行配置修改,所有的修改都已增量的方式被分发和更新
2.2 资源利用率 高:docker是内核级的虚拟化,不需要额外的虚拟化管理程序(vm manage)
2.3 快速交付和部署: 利用镜像快速构建你的应用容器。版本迭代速度快,节约发开,测试,部署的时间。
2.4 轻松实现数据迁移和横向扩展: docker容器可以在任意平台运行。
基本架构
docker采用了标准的C/S架构,包括客户端和服务端两大核心组件。
1 服务端
docker服务端一般运行在宿主主机后台运行。
服务端包括三个组件:
dockerd:响应来自客户端的请求 默认监听本地的套接字:/run/containerd/containerd.sock
docker-proxy:当需要进行容器端口映射时,docker-proxy负责完成网络映射的配置
containerd-shim:负责为runC容器提供支持
什么是runC:
runC是Docker中最为核心的部分,容器的创建,运行,销毁等等操作最终都将通过调用runC完成.
[root@server01 ~]# ps aux|grep docker|grep -v grep root 2115 0.0 7.5 669068 75636 ? Ssl 3月07 2:48 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock root 34765 0.0 0.3 216928 3144 ? Sl 07:56 0:00 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 80 -container-ip 172.17.0.3 -container-port 80 root 34771 0.0 0.3 109092 3728 ? Sl 07:56 0:03 containerd-shim -namespace moby -workdir /var/lib/containerd/io.containerd.runtime.v1.linux/moby/767df9d67d99567f65dcc6d5a53373c54bc05652e38785642dc0926a19945275 -address /run/containerd/containerd.sock -containerd-binary /usr/bin/containerd -runtime-root /var/run/docker/runtime-runc
2 客户端
用户使用的docker可执行命令即为客户端程序
镜像
Docker 镜像,是用于创建 Docker 容器的模板。
这里要强调一下镜像的两个特征:
1.镜像是分层(Layer)的:即一个镜像可以多个中间层组成,多个镜像可以共享同一中间层,我们也可以通过在镜像添加多一层来生成一个新的镜像。
2.镜像是只读的(read-only):镜像在构建完成之后,便不可以再修改。
容器
容器是独立运行的一个或一组应用,是镜像运行时的实体。
容器与镜像的关系类似于面向对象编程中的对象与类
容器运行时会在镜像上面增加一个可写层
仓库
Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库
镜像,容器,仓库三者关系图

linux内核两个特性:
举个例子:bw-(wg学院|gf学院)
1 命名空间 namespace
为容器虚拟化的实现带来极大便利。
利用这一特性,每个容器都可以拥有自己单独的命名空间,运行在其中的应用就像是在独立的操作系统环境中一样。
命名空间机制保障了容器之间彼此互不影响(隔离)
2 控制组 cgroup
作用: 用来对共享资源(cpu,内存,磁盘IO)进行隔离,限制,审计等。避免多个容器同事运行对宿主机系统资源竞争
用户可以在/sys/fs/cgroup/memory/docker/ 目录下看到对docker应用的各种限制项
[root@server01 overlay2]# ll /sys/fs/cgroup/memory/docker/ 总用量 0 drwxr-xr-x. 2 root root 0 3月 7 16:21 767df9d67d99567f65dcc6d5a53373c54bc05652e38785642dc0926a19945275 -rw-r--r--. 1 root root 0 3月 5 21:41 cgroup.clone_children --w--w--w-. 1 root root 0 3月 5 21:41 cgroup.event_control -rw-r--r--. 1 root root 0 3月 5 21:41 cgroup.procs -rw-r--r--. 1 root root 0 3月 5 21:41 memory.failcnt --w-------. 1 root root 0 3月 5 21:41 memory.force_empty -rw-r--r--. 1 root root 0 3月 5 21:41 memory.kmem.failcnt -rw-r--r--. 1 root root 0 3月 5 21:41 memory.kmem.limit_in_bytes -rw-r--r--. 1 root root 0 3月 5 21:41 memory.kmem.max_usage_in_bytes -r--r--r--. 1 root root 0 3月 5 21:41 memory.kmem.slabinfo -rw-r--r--. 1 root root 0 3月 5 21:41 memory.kmem.tcp.failcnt -rw-r--r--. 1 root root 0 3月 5 21:41 memory.kmem.tcp.limit_in_bytes -rw-r--r--. 1 root root 0 3月 5 21:41 memory.kmem.tcp.max_usage_in_bytes -r--r--r--. 1 root root 0 3月 5 21:41 memory.kmem.tcp.usage_in_bytes -r--r--r--. 1 root root 0 3月 5 21:41 memory.kmem.usage_in_bytes -rw-r--r--. 1 root root 0 3月 5 21:41 memory.limit_in_bytes -rw-r--r--. 1 root root 0 3月 5 21:41 memory.max_usage_in_bytes -rw-r--r--. 1 root root 0 3月 5 21:41 memory.memsw.failcnt -rw-r--r--. 1 root root 0 3月 5 21:41 memory.memsw.limit_in_bytes -rw-r--r--. 1 root root 0 3月 5 21:41 memory.memsw.max_usage_in_bytes -r--r--r--. 1 root root 0 3月 5 21:41 memory.memsw.usage_in_bytes -rw-r--r--. 1 root root 0 3月 5 21:41 memory.move_charge_at_immigrate -r--r--r--. 1 root root 0 3月 5 21:41 memory.numa_stat -rw-r--r--. 1 root root 0 3月 5 21:41 memory.oom_control ----------. 1 root root 0 3月 5 21:41 memory.pressure_level -rw-r--r--. 1 root root 0 3月 5 21:41 memory.soft_limit_in_bytes -r--r--r--. 1 root root 0 3月 5 21:41 memory.stat -rw-r--r--. 1 root root 0 3月 5 21:41 memory.swappiness -r--r--r--. 1 root root 0 3月 5 21:41 memory.usage_in_bytes -rw-r--r--. 1 root root 0 3月 5 21:41 memory.use_hierarchy -rw-r--r--. 1 root root 0 3月 5 21:41 notify_on_release -rw-r--r--. 1 root root 0 3月 5 21:41 tasks
联合文件系统-overlay2(镜像存储部分)
联合文件系统(UnionFS)是一种轻量级的高性能分层文件系统。它支持将文件系统中的修改信息作为一次提交,并层层叠加。
docker镜像可以通过分层来进行继承。例如用具基于基础镜像(往往仅包含一个操作系统:如centos,alpine,busybox等)来制作各种不同的应用镜像(mysql,nginx等)
通过docker history查看一个镜像由哪些层组成,每层都执行了哪些命令
[root@server01 ~]# docker history nginx IMAGE CREATED CREATED BY SIZE COMMENT 6678c7c2e56c 4 days ago /bin/sh -c #(nop) CMD ["nginx" "-g" "daemon… 0B <missing> 4 days ago /bin/sh -c #(nop) STOPSIGNAL SIGTERM 0B <missing> 4 days ago /bin/sh -c #(nop) EXPOSE 80 0B <missing> 4 days ago /bin/sh -c ln -sf /dev/stdout /var/log/nginx… 22B <missing> 4 days ago /bin/sh -c set -x && addgroup --system -… 57.6MB <missing> 4 days ago /bin/sh -c #(nop) ENV PKG_RELEASE=1~buster 0B <missing> 4 days ago /bin/sh -c #(nop) ENV NJS_VERSION=0.3.9 0B <missing> 4 days ago /bin/sh -c #(nop) ENV NGINX_VERSION=1.17.9 0B <missing> 11 days ago /bin/sh -c #(nop) LABEL maintainer=NGINX Do… 0B <missing> 12 days ago /bin/sh -c #(nop) CMD ["bash"] 0B <missing> 12 days ago /bin/sh -c #(nop) ADD file:e5a364615e0f69616… 69.2MB
docker的存储结构:以centos7为例
[root@server01 ~]# cd /var/lib/docker
[root@server01 docker]# ll
总用量 8
drwx------. 2 root root 24 2月 9 17:47 builder
drwx--x--x. 4 root root 92 2月 9 17:47 buildkit
drwx------. 3 root root 20 2月 10 16:32 containerd
drwx------. 3 root root 78 3月 9 18:26 containers
drwx------. 3 root root 22 2月 9 17:47 image
drwxr-x---. 3 root root 19 2月 9 17:47 network
drwx------. 25 root root 4096 3月 9 18:26 overlay2
drwx------. 4 root root 32 2月 9 17:47 plugins
drwx------. 2 root root 6 3月 5 21:40 runtimes
drwx------. 2 root root 6 2月 9 17:47 swarm
drwx------. 2 root root 6 3月 7 12:30 tmp
drwx------. 2 root root 6 2月 9 17:47 trust
drwx------. 15 root root 4096 2月 10 15:59 volumes

docker 网络相关:
docker的4类网络模式:
docker run --net:指定
host模式:不为容器创建独立的网络命名空间,容器内看到的网络配置(网卡信息,路由表,iptales规则)均与主机上的保持一致。
container模式:新创建的容器共享指定的已存容器的网络命名空间,两个容器内的网络配置共享。
none模式:为容器创建独立的网络命名空间,但不进行网络配置,即容器内没有创建网卡,IP地址等
briage模式:默认配置。为容器创建独立的网络命令空间,分配网卡,IP地址等网络配置,并通过veth接口对将容器挂载到一个虚拟网桥(docker0)上
CNM(容器网络模型)支持的4类驱动类型:
docker network create -d xx
Null:不提供网络,容器启动无网络连接
Bridge:默认的,单机模式
overlay:是用vxlan隧道实现的跨主机容器网络
Remote:扩展类型,预留给其他外部实现的方案