1 docker相关信息和优化配置
1)查看docker版本详解
root@zz:~# docker version
Client: Docker Engine - CommunityVersion: 27.3.1API version: 1.47Go version: go1.22.7Git commit: ce12230Built: Fri Sep 20 11:40:59 2024OS/Arch: linux/amd64Context: defaultServer: Docker Engine - CommunityEngine:Version: 27.3.1API version: 1.47 (minimum version 1.24)Go version: go1.22.7Git commit: 41ca978Built: Fri Sep 20 11:40:59 2024OS/Arch: linux/amd64Experimental: falsecontainerd:Version: 1.7.22GitCommit: 7f7fdf5fed64eb6a7caf99b3e12efcf9d60e311crunc:Version: 1.1.14GitCommit: v1.1.14-0-g2c9f560docker-init:Version: 0.19.0GitCommit: de40ad0
2)docker 信息详解
root@zz:~# docker info
Client: Docker Engine - CommunityVersion: 27.3.1Context: defaultDebug Mode: false #client 端是否开启debugPlugins:buildx: Docker Buildx (Docker Inc.)Version: v0.17.1Path: /usr/libexec/docker/cli-plugins/docker-buildxcompose: Docker Compose (Docker Inc.)Version: v2.29.7Path: /usr/libexec/docker/cli-plugins/docker-composeServer:Containers: 0 #当前主机运行的容器总数Running: 0 #有几个容器是正在运行的Paused: 0 #有几个容器是暂停的Stopped: 0 #有几个容器是停止的Images: 0 #当前服务器镜像数Server Version: 27.3.1 #服务端版本Storage Driver: overlay2 #正在使用的存储引擎Backing Filesystem: extfs #后端文件系统,即服务器的磁盘系统Supports d_type: true #是否支持 d_typeUsing metacopy: false #是否使用 metacopyNative Overlay Diff: true #是否支持差异数据存储userxattr: false #是否试用 userxattrLogging Driver: json-file #日志类型,每个容器的标准输出以日志存放Cgroup Driver: systemd #cgroup类型Cgroup Version: 2 #cgroup版本Plugins: #插件Volume: local #卷Network: bridge host ipvlan macvlan null overlay #overlay跨主机通信Log: awslogs fluentd gcplogs gelf journald json-file local splunk syslog #日志类型Swarm: inactive #是否支持swarm 没有开启 类似k8s的工具Runtimes: io.containerd.runc.v2 runc #已安装的容器运行时Default Runtime: runc #默认容器运行时Init Binary: docker-init #初始化容器的守护进程,即 pid 为1的进程containerd version: 7f7fdf5fed64eb6a7caf99b3e12efcf9d60e311c #版本runc version: v1.1.14-0-g2c9f560 #runc版本init version: de40ad0 #init版本Security Options: #安全选项apparmor #安全模块seccomp #安全计算模块Profile: builtin cgroupns #安全计算模块Kernel Version: 6.8.0-45-generic #宿主机内核版本Operating System: Ubuntu 24.04.1 LTS #宿主机os版本OSType: linux #宿主机os类型Architecture: x86_64 #宿主机cpu架构CPUs: 2 #宿主机cpu核数Total Memory: 1.638GiB #宿主机总内存Name: zz #宿主机主机名ID: d1c4671f-58d4-4832-90be-fe062f3c9b4e #宿主机 IDDocker Root Dir: /var/lib/docker#宿主机docker数据的保存目录建议使用独立ssd磁盘保证性能和空间Debug Mode: false # server 端 debug是否开启Experimental: false #测试新功能和收集社区反馈,一般测试版会开启Insecure Registries: #非安全的镜像仓库127.0.0.0/8Live Restore Enabled: false #是否开启活动重启(重启docker-daemo 不关闭容器)WARNING: bridge-nf-call-iptables is disabled #系统警告
WARNING: bridge-nf-call-ip6tables is disabled #系统警告
①metacopy使用场景
处理大量小文件:在处理大量小文件时,metacopy 可以显著减少文件系统的 I/O 操作,提高性能。
频繁的文件创建和删除:在需要频繁创建和删除文件的场景中,metacopy 可以减少文件系统的开销。
容器镜像构建:在构建容器镜像时,如果涉及到大量文件的复制和修改,metacopy 可以加速这一过程。
启用 metacopy
metacopy 特性默认是禁用的,需要在启动 Docker 守护进程时通过配置文件或命令行参数来启用
通过配置文件启用
编辑 Docker 的配置文件(通常是 /etc/docker/daemon.json):
{"storage-driver": "overlay2","storage-opts": ["overlay2.metacopy=on"]
}
重启 Docker 服务:
sudo systemctl restart docker
通过命令行启用
在启动 Docker 守护进程时,可以通过命令行参数启用 metacopy:
sudo dockerd --storage-driver overlay2 --storage-opt overlay2.metacopy=on
注意事项
兼容性:metacopy 特性依赖于底层文件系统(如 ext4、XFS)的支持。确保你的文件系统支持 metacopy。
性能影响:虽然 metacopy 在某些场景下可以提高性能,但在其他场景下可能会带来额外的开销。建议在实际环境中进行测试,以确定是否适合启用该特性。
数据一致性:在某些情况下,metacopy 可能会影响文件系统的数据一致性。确保在启用该特性前了解其潜在的风险。
②d_type
文件系统支持 d_type 的常见情况
ext4:默认支持 d_type。
XFS:默认支持 d_type。
btrfs:默认支持 d_type。
tmpfs:默认支持 d_type。
检查 Docker 是否使用 d_type
你可以通过查看 Docker 的日志来确认是否启用了 d_type 支持:
sudo journalctl -u docker | grep d_type
d_type 支持是 Docker 中 overlay2 存储驱动的一个重要特性,可以显著提高文件系统操作的性能和可靠性。确保你的文件系统支持 d_type,并在启动 Docker 时启用该特性,可以进一步优化 Docker 的性能。如果你的文件系统不支持 d_type,Docker 会自动回退到不使用 d_type 的模式,但性能可能会受到影响。
③ userxattr 选项的作用
启用 userxattr (userxattr: true):
允许在文件和目录上设置和读取用户扩展属性。
这对于某些应用程序和工具(如 SELinux、AppArmor 和其他安全相关工具)可能非常重要,因为它们依赖于这些扩展属性来实现细粒度的安全控制。
禁用 userxattr (userxattr: false):
禁止在文件和目录上设置和读取用户扩展属性。
这可以减少文件系统的开销,提高性能,特别是在不需要这些扩展属性的情况下。
配置 userxattr 选项
通过配置文件启用或禁用 userxattr
编辑 Docker 的配置文件(通常是 /etc/docker/daemon.json):
{"storage-driver": "overlay2","storage-opts": ["overlay2.userxattr=false"]
}
重启 Docker 服务:
sudo systemctl restart docker
通过命令行启用或禁用 userxattr
在启动 Docker 守护进程时,可以通过命令行参数启用或禁用 userxattr:
sudo dockerd --storage-driver overlay2 --storage-opt overlay2.userxattr=false
④cgroupfs vs systemd
cgroupfs:
描述: cgroupfs 是 Docker 的默认 cgroup 驱动程序。
优点: 简单易用,不需要额外的依赖。
缺点: 可能与系统的其他部分(如 systemd)存在冲突,特别是在较新的系统中。
systemd:
描述: systemd 是一个系统和服务管理器,广泛用于现代 Linux 发行版。systemd 也支持 cgroup 管理。
优点: 更好的系统集成,与 systemd 服务管理器无缝配合,提供更细粒度的资源管理和监控。
缺点: 配置稍微复杂一些,需要 systemd 支持。
如何将 Docker 配置为使用 systemd 作为 cgroup 驱动程序
编辑 Docker 配置文件:
打开 Docker 的配置文件(通常是 /etc/docker/daemon.json)。
添加或修改 cgroup-driver 配置项,将其设置为 systemd。
{"exec-opts": ["native.cgroupdriver=systemd"]
}
重启 Docker 服务:
保存配置文件后,重启 Docker 服务以使更改生效。
sudo systemctl restart docker
⑤AppArmor: 用于限制程序的文件访问、网络连接和其他系统调用。
Seccomp: 用于限制进程可以执行的系统调用,减少攻击面。
cgroupns: 用于将 cgroups 隔离到不同的命名空间中,提高容器之间的资源隔离性。
⑥常见警告及解决办法
WARNING: bridge-nf-call-iptables is disabled WARNING: bridge-nf-call-ip6tables is disabled
vim /etc/sysctl.conf 添加以下内容 net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1最后再执行
sysctl -p
sudo systemctl restart docker
若出现 sysctl: cannot stat /proc/sys/net/bridge/bridge-nf-call-iptables: No such file or directory sysctl: cannot stat /proc/sys/net/bridge/bridge-nf-call-ip6tables: No such file or directory
则执行 sudo modprobe br_netfilter
再执行
sysctl -p
sudo systemctl restart docker
即可
方法二 用ipvs代替
当看到 `WARNING: bridge-nf-call-iptables is disabled` 警告时,确实可以考虑使用 `ipvs` 作为替代方案,尤其是在需要高性能负载均衡和网络管理的场景中。`ipvs`(IP Virtual Server)是一个内核模块,用于实现高性能的负载均衡和网络地址转换(NAT)。
什么是 `ipvs`?
`ipvs` 是 Linux 内核的一个模块,用于实现第四层(传输层)的负载均衡。它可以在内核态处理大量的网络流量,提供比 `iptables` 更高效的负载均衡和转发能力。`ipvs` 通常用于高性能的负载均衡器,如 `HAProxy` 和 `Kubernetes` 的 `kube-proxy` 组件。
为什么使用 `ipvs`?
1. **高性能**: `ipvs` 在内核态处理网络流量,性能通常优于 `iptables`。
2. **可扩展性**: `ipvs` 支持多种负载均衡算法,可以更好地处理大规模的网络流量。
3. **灵活性**: `ipvs` 提供了丰富的配置选项,可以满足不同场景的需求。如何启用 `ipvs`?
1. 安装 `ipvs` 模块
首先,确保你的系统已经安装了 `ipvs` 模块。你可以使用以下命令来加载 `ipvs` 模块:
sudo modprobe ip_vs
sudo modprobe ip_vs_rr
sudo modprobe ip_vs_wrr
sudo modprobe ip_vs_sh
这些模块分别对应 `ipvs` 的核心功能和不同的负载均衡算法(轮询、加权轮询、最少连接数)。
2. 配置 `ipvs` 模块
你可以使用 `ipvsadm` 工具来配置 `ipvs`。首先,安装 `ipvsadm`:
sudo apt-get install ipvsadm # Debian/Ubuntu
sudo yum install ipvsadm # CentOS/RHEL
3. 配置 `ipvs` 规则
使用 `ipvsadm` 添加和管理 `ipvs` 规则。例如,创建一个虚拟服务器并将流量转发到两个真实服务器:
sudo ipvsadm -A -t 192.168.1.100:80 -s rr
sudo ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.101:80 -g
sudo ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.102:80 -g
```- `-A`:添加虚拟服务器
- `-t`:指定虚拟服务器的 IP 和端口
- `-s`:指定负载均衡算法(`rr` 表示轮询)
- `-a`:添加真实服务器
- `-r`:指定真实服务器的 IP 和端口
- `-g`:使用直接路由模式4. 验证配置
你可以使用以下命令查看 `ipvs` 的配置:
sudo ipvsadm -L -n
在 Docker 中使用 `ipvs`
如果你在使用 Docker 并希望使用 `ipvs`,可以考虑以下几点:
1. **Kubernetes**: 如果你在使用 Kubernetes,可以配置 `kube-proxy` 使用 `ipvs` 模式。编辑 `kube-proxy` 的配置文件(通常是 `/etc/kubernetes/manifests/kube-proxy.yaml`),添加或修改以下内容:
spec:containers:- name: kube-proxyimage: k8s.gcr.io/kube-proxy:v1.21.0command:- /usr/local/bin/kube-proxy- --config=/var/lib/kube-proxy/config.conf- --iptables-sync-period=30s- --ipvs-sync-period=30s- --feature-gates=SupportIPVSProxyMode=true- --proxy-mode=ipvs
2. **Docker Swarm**: Docker Swarm 本身没有直接支持 `ipvs` 的选项,但你可以通过自定义网络配置和使用 `ipvs` 负载均衡器来实现类似的效果。
总结
`WARNING: bridge-nf-call-iptables is disabled` 警告表示 Docker 的网桥无法调用 `iptables` 规则,这可能影响网络的安全性和功能。虽然你可以通过启用 `bridge-nf-call-iptables` 来解决这个问题,但如果你需要更高性能的负载均衡和网络管理,可以考虑使用 `ipvs` 作为替代方案。`ipvs` 提供了更高的性能和更丰富的配置选项,适用于高性能的负载均衡场景。
Docker之WARNING: IPv4 forwarding is disabled. Networking will not work
配置转发
vim /etc/sysctl.conf #配置转发 net.ipv4.ip_forward=1 #重启服务,让配置生效 systemctl restart network #查看是否成功,如果返回为“net.ipv4.ip_forward = 1”则表示成功 sysctl net.ipv4.ip_forward检查容器是否正常访问网络
#重启docker服务 service docker restart #查看运行过的容器 docker ps -a #启动gitlab 容器 docker start gitblab2 #进入gitlab容器 docker attach gitlab2 #获取百度信息 curl baidu.comWARNING: No swap limit support
系统警告信息 (没有开启 swap 资源限制 )
vim /etc/default/grub GRUB_DEFAULT=0 GRUB_TIMEOUT_STYLE=hidden GRUB_TIMEOUT=2 GRUB_DISTRIBUTOR=`lsb_ release -i -s 2> /dev/null || echo Debian` GRUB_CMDLINE_LINUX_DEFAULT="" GRUB_CMDLINE_LINUX="net.ifnames=0 swapaccount=1" #修改此行swapaccount=1update-grub reboot