docker详解介绍+基础操作 (二)

1 docker相关信息和优化配置

1)查看docker版本详解

root@zz:~# docker version
Client: Docker Engine - Community
 Version:           27.3.1
 API version:       1.47
 Go version:        go1.22.7
 Git commit:        ce12230
 Built:             Fri Sep 20 11:40:59 2024
 OS/Arch:           linux/amd64
 Context:           default

Server: Docker Engine - Community
 Engine:
  Version:          27.3.1
  API version:      1.47 (minimum version 1.24)
  Go version:       go1.22.7
  Git commit:       41ca978
  Built:            Fri Sep 20 11:40:59 2024
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.7.22
  GitCommit:        7f7fdf5fed64eb6a7caf99b3e12efcf9d60e311c
 runc:
  Version:          1.1.14
  GitCommit:        v1.1.14-0-g2c9f560
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

2)docker 信息详解

root@zz:~# docker info
Client: Docker Engine - Community
 Version:    27.3.1
 Context:    default
 Debug Mode: false     #client 端是否开启debug
 Plugins:
  buildx: Docker Buildx (Docker Inc.)
    Version:  v0.17.1
    Path:     /usr/libexec/docker/cli-plugins/docker-buildx
  compose: Docker Compose (Docker Inc.)
    Version:  v2.29.7
    Path:     /usr/libexec/docker/cli-plugins/docker-compose

Server:
 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_type
  Using metacopy: false       #是否使用 metacopy
  Native Overlay Diff: true   #是否支持差异数据存储
  userxattr: false            #是否试用 userxattr
 Logging 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  #宿主机 ID
 Docker Root Dir: /var/lib/docker#宿主机docker数据的保存目录建议使用独立ssd磁盘保证性能和空间
 Debug Mode: false             # server 端 debug是否开启
 Experimental: false           #测试新功能和收集社区反馈,一般测试版会开启
 Insecure Registries:          #非安全的镜像仓库
  127.0.0.0/8
 Live 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-proxy
    image: k8s.gcr.io/kube-proxy:v1.21.0
    command:
      - /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.com

WARNING: 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=1

update-grub
reboot

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值