docker是什么?
docker容器技术,所谓的docker是一个应用程序,他是2013年出版的一个开源程序,我们知道虚拟机是基于物理层面的隔离,而我们的docker是基于app层面的隔离,这就使我们的docker耗费资源更少,占用空间更小,实现了轻量化,同时docker采用的是C/S架构,可以使用远程api来管理和创建Docker容器。docker采用了namespace和cgroup技术,其实docker是一种管理容器的工具,市面上还有像redhat自家的podman其实和docker类似,出现都是为了容器而服务的
从上面的图片可以知道docker和vmware的区别
使用doker资源利用率变得更高,一台物理机上可以同时运行几百个容器,但只能运行最多10几台的虚拟机,docker容器开销小,启动速度也很快
docker组成
官网:https://docs.docker.com/get-started/overview/
docker图标是一个小鲸鱼上面装着好多集装箱,很符合容器的概念。
主机
客户端
服务端
仓库 registry
容器 container
镜像 images
安装docker
安装docker-ce社区版
[root@docker-server ~]# rm -rf /etc/yum.repos.d/*
[root@docker-server ~]# wget -O /etc/yum.repos.d/Centos-7.repo http://mirrors.aliyun.com/repo/Centos-7.repo
[root@docker-server ~]# wget -O /etc/yum.repos.d/epel-7.repo http://mirrors.aliyun.com/repo/epel-7.repo
[root@docker-server ~]# wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
[root@docker-server ~]# yum install docker-ce -y
启动docker并设置开机自启
systemctl enable --now docker
一些基础命令
docker pull nginx:latest
#从docker仓库拉取nginx镜像,版本最新
docker images == docker image ls
#查看所有镜像
docker run -itd -p --name my_nginx -p 80:80 -v /root/nginx_file:/usr/share/nginx/html nginx
#运行容器
docker exec -it my_nginx bash
#进入容器
docker ps
#查看正在运行的容器
docker ps -a
#查看所有容器
docker rmi `docker images -qa`
#删除所有镜像
docker rm -f `docker ps -qa`
#删除所有容器
namespace技术
我们上面提到容器采用了namespace技术,现在我们就来讲讲什么是namespace,顾名思义,就是命名空间,通过设置部同的名字,把各个容器之间相互隔离开,容器之间互不影响,独立运行。
MNT namespace
启动三个容器
docker run -d --name nginx-1 -p 80:80 nginx
docker run -d --name nginx-2 -p 81:80 nginx
docker run -d --name nginx-3 -p 82:80 nginx
连接到nginx-1容器并创建一个文件
docker exec -it nginx-1 bash
echo "hello nginx-1" > test.txt
exit
[root@localhost ~]# docker exec -it nginx-1 bash
root@12b511f2f7b2:/# echo hello > test.sh
root@12b511f2f7b2:/# exit
exit
[root@localhost ~]# find / -name "test.sh"
/var/lib/docker/overlay2/2fb101d86d37d941cb97a076c4d10f4d9cdcd500b4315f6f515019ee6a906e38/diff/test.sh
/var/lib/docker/overlay2/2fb101d86d37d941cb97a076c4d10f4d9cdcd500b4315f6f515019ee6a906e38/merged/test.sh
[root@localhost ~]# cat /var/lib/docker/overlay2/2fb101d86d37d941cb97a076c4d10f4d9cdcd500b4315f6f515019ee6a906e38/diff/test.sh
hello
不难看出在我们容器内部创建的文件在我们存在我们本机的diff下面
IPC namespace
允许一个容器内部不同数据之间相互访问
PID namespace
虚拟机有一个pid为1的进程管理着其他的所有进程,同样容器内部也有一个pid为1的进程管理者容器内部的所有进程
NET namespace
容器和虚拟机一样也有一张自己的网卡,我们通过ip -a可以查看到,虚拟机多了一张docker0
user namespace
各个容器内部可能会存在同名的用户和组,利用这个技术,可以很好的把他们给隔离开,每个容器就是一个全新的空间
cgoup技术
linux control groups
就是在容器内部限制一个资源组能够使用的资源上限,不要让他一直申请资源,导致主机资源不足的情况
验证系统内核层默认已经开启cgroup
[root@docker-server ~]# cat /boot/config-3.10.0-957.el7.x86_64| grep cgroup -i
CONFIG_CGROUPS=y
# CONFIG_CGROUP_DEBUG is not set
CONFIG_CGROUP_FREEZER=y
CONFIG_CGROUP_PIDS=y
CONFIG_CGROUP_DEVICE=y
CONFIG_CGROUP_CPUACCT=y
CONFIG_CGROUP_HUGETLB=y
CONFIG_CGROUP_PERF=y
CONFIG_CGROUP_SCHED=y
CONFIG_BLK_CGROUP=y
# CONFIG_DEBUG_BLK_CGROUP is not set
CONFIG_NETFILTER_XT_MATCH_CGROUP=m
CONFIG_NET_CLS_CGROUP=y
CONFIG_NETPRIO_CGROUP=y
关于内存的模块
[root@docker-server ~]# cat /boot/config-3.10.0-957.el7.x86_64 | grep mem -i | grep cg -i
CONFIG_MEMCG=y
CONFIG_MEMCG_SWAP=y
CONFIG_MEMCG_SWAP_ENABLED=y
CONFIG_MEMCG_KMEM=y
CPU:使用调度程序为cgroup任务提供 CPU 的访问。
cpuacct:产生cgroup任务的 CPU 资源报告。
cpuset:如果是多核心的CPU,这个子系统会为cgroup任务分配单的CPU和内存。
devices:允许或拒绝cgroup任务对设备的访问。
freezer:暂停和恢复cgroup任务。
memory:设置每个cgroup 的内存限制以及产生内存资源报告。
net_cls:标记每个网络包以供 cgroup方便使用。
ns:命名空间子系统。
perf event:增加了对每个group的监测跟踪的能力,可以监测属于某个特定的group 的所有线程以及运行在特定CPU上的线程
https://blog.csdn.net/qyf158236/article/details/110475457
容器技术的规范化
容器技术不仅仅是docker一家,阿里的pouch,红帽的podman都是这样的,为了统一管理方便后期迁移,所以OSI发布了一系列的规范化体系
docker info
```bash
[root@docker-server ~]# docker info
Client:
Context: default
Debug Mode: false
Plugins:
app: Docker App (Docker Inc., v0.9.1-beta3)
buildx: Build with BuildKit (Docker Inc., v0.5.1-docker)
scan: Docker Scan (Docker Inc.)
Server:
Containers: 2 # 当前主机运行容器总数
Running: 1 # 有几个容器是正在运行的
Paused: 0 # 有几个容器是暂停的
Stopped: 1 # 有几个容器是停止的
Images: 1 # 当前服务器的镜像数
Server Version: 20.10.6 # 服务端版本
Storage Driver: overlay2 # 正在使用的存储引擎
Backing Filesystem: xfs # 后端文件系统,即服务器的磁盘文件系统
Supports d_type: true # 是否支持d_type
Native Overlay Diff: true # 是否支持差异数据存储
userxattr: false
Logging Driver: json-file # 日志文件类型
Cgroup Driver: cgroupfs # cgroups类型
Cgroup Version: 1
Plugins: # 插件
Volume: local # 卷
Network: bridge host ipvlan macvlan null overlay
Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
Swarm: inactive # 是否支持swarm
Runtimes: io.containerd.runc.v2 io.containerd.runtime.v1.linux runc
Default Runtime: runc # 默认的runtime
Init Binary: docker-init # 初始化容器的守护进程
containerd version: d71fcd7d8303cbf684402823e425e9dd2e99285d
runc version: b9ee9c6314599f1b4a7f497e1f1f856fe433d3b7
init version: de40ad0
Security Options: # 安全选项
seccomp
Profile: default
Kernel Version: 3.10.0-693.el7.x86_64 # 宿主机内核版本
Operating System: CentOS Linux 7 (Core) # 宿主机操作系统
OSType: linux # 宿主机操作系统类型
Architecture: x86_64 # 宿主机架构
CPUs: 1 # 宿主机cpu数量
Total Memory: 1.781GiB # 宿主机总内存
Name: docker-server # 宿主机主机名
ID: ARN5:ESPO:FEZ4:KDZ6:RWGG:WQ3X:SIXN:3FVG:ATXH:JAXA:ENGH:RAVE
Docker Root Dir: /var/lib/docker # 宿主机数据保存目录
Debug Mode: false
Registry: https://index.docker.io/v1/ # 镜像仓库
Labels:
Experimental: false # 是否是测试版
Insecure Registries:
127.0.0.0/8
Live Restore Enabled: false # 是否开启活动容器(重启不关闭容器)
```
Comments NOTHING