为什么要使用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扩展类型,预留给其他外部实现的方案