一、高级网络配置
1.1概述
当 Docker 启动时,会自动在主机上创建一个 `docker0` 虚拟网桥,实际上是 Linux 的一个 bridge,可以理解为一个软件交换机。它会在挂载到它的网口之间进行转发。
同时,Docker 随机分配一个本地未占用的私有网段(在 [RFC1918](https://tools.ietf.org/html/rfc1918) 中定义)中的一个地址给 `docker0` 接口。比如典型的 `172.17.42.1`,掩码为 `255.255.0.0`。此后启动的容器内的网口也会自动分配一个同一网段(`172.17.0.0/16`)的地址。
当创建一个 Docker 容器的时候,同时会创建了一对 `veth pair` 接口(当数据包发送到一个接口时,另外一个接口也可以收到相同的数据包)。这对接口一端在容器内,即 `eth0`;另一端在本地并被挂载到 `docker0` 网桥,名称以 `veth` 开头(例如 `vethAQI2QT`)。通过这种方式,主机可以跟容器通信,容器之间也可以相互通信。Docker 就创建了在主机和所有容器之间一个虚拟共享网络。
注意:一般在使用docker网桥(br1dge)实现容器与容器通信时,都是站在一个应用角度进行容器通信
1.2网络信息命令
查看网络信息
docker network ls
创建一个网桥
docker network create -d bridge 网桥名称
删除一个网桥
docker network rm 网桥名称
查看网桥详细
docker inspect els
1.3容器之前使用网络通信
查询当前网络配置
创建桥接网络
启动容器指定使用网桥
- docker run -d -p 8890:80 --name nginx001 --network info nginx
- docker run -d -p 8891:80 --name nginx002 --network info nginx
`注意:一旦指定网桥后--name指定名字就是主机名,多个容器指定在同一个网桥时,可以在任意一个容器中使用主机名与容器进行互通`
二、数据卷配置
2.1说明
数据卷` 是一个可供一个或多个容器使用的特殊目录,它绕过 UFS,可以提供很多有用的特性:
- `数据卷` 可以在容器之间共享和重用
- - 对 `数据卷` 的修改会立马生效
- - 对 `数据卷` 的更新,不会影响镜像
- - `数据卷` 默认会一直存在,即使容器被删除
> 注意:`数据卷` 的使用,类似于 Linux 下对目录或文件进行 mount,镜像中的被指定为挂载点的目录中的文件会复制到数据卷中(仅数据卷为空时会复制)。
2.2数据卷特性
Docker镜像由多个只读层叠加⽽成,容器启动时,Docker会加载只读镜像层并在镜像栈顶部添加⼀个读写层.
如果运⾏中的容器修改现有的⼀个已经存在的⽂件,那么该⽂件将会从读写层下面的只读层复制到读写层,该⽂件的只读版本依然存在,只是已经被读写层中该⽂件的副本所隐藏,这就是所谓的“写时复制”机制.
数据卷意义
关闭并重启容器,其数据不受影响; 但删除容器,则修改部分会全部丢失.
存在问题:
1 存在与联合⽂件系统(UFS)中,不易于宿主机访
问;
2 容器间数据共享不便;
3 删除容器其数据会丢失.
解决⽅案: “卷”
卷”是容器上的⼀个或多个“目录”,此类目录可
绕过联合⽂件系统,与宿主机某目录“绑定”
Volume可以在运⾏容器时即完成创建与绑定操作,前提是拥有声明。
Volume的初衷是数据持久化。
2.3在容器中使⽤Volumes
# 创建一个名为data的Docker容器,并使用Docker管理的卷进行挂载
docker run -d --name data -v <Mount-dir> tomcat
# 使用docker inspect命令查看data容器的挂载信息
docker inspect -f {{.Mounts}} data
# 创建一个名为data的Docker容器,并使用主机目录进行绑定挂载
docker run -d --name data -v <Host-dir>:<Volume-dir> tomcat
# 创建一个名为data的Docker容器,并使用联合卷进行挂载
docker run -d --name data --volume-from <Container> tomcat
举例
2.4数据卷命令
创建数据卷
docker volume create my-vol
查看数据卷
docker volume inspect my-vol
[
{
"CreatedAt": "2020-11-25T11:43:56+08:00",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/my-vol/_data",
"Name": "my-vol",
"Options": {},
"Scope": "local"
}
]
挂载数据卷
docker run -d -P --name web -v my-vol:/usr/share/nginx/html nginx
删除数据卷
docker volume rm my-vol
三、Docker网络通信
3.1概述
容器与容器之间
容器访问外部⽹络
iptables -t nat -A POSTROUTING -s
172.17.0.0/16 -o docker -j MASQUERADE
外部⽹络访问容器(DNAT)
docker run -p 80:80 apache
iptables -t nat -A PREROUTING -m
addrtype --dst-type LOCAL -j DOCKER
iptables -t nat -A DOCKER ! -i
docker0 -p tcp -m tcp --dprot 80 =j
DNAT --to-destination 172.17.0.2:80
3.2Namespace隔离
进⾏namespace API操作的四种⽅式
- clone()
- setns()
- unshare()
- /proc下的部分⽂件
clone()
查看/proc/[pid]/ns
ls -l /proc/$$/ns
setns()
unshare()
fork()
3.3Namespace
UTS
UNIX Time-sharing System
主机名和域名
IPC
创建⼀个信息队列
ipcmk -Q
查看已经开启的消息队列
ipcs -q
PID
echo $$
Mount
挂载
mount <src> <dest>
查看
mount
-> mtab
Network
`netstat -antlp`、`ifconfig`和`ip addr`都是用于显示和配置网络接口的命令,但它们各自有不同的特点和用途。具体如下:
1. **`netstat -antlp`**:
- `-a`:显示所有活动的网络连接以及监听的 socket。
- `-n`:以数字形式显示地址和端口号。
- `-t`:仅显示TCP连接。
- `-l`:仅显示监听套接字(服务器等待接入连接)。
- `-p`:显示与每个连接相关的进程/程序名称。2. **`ifconfig`**:
- 主要用于配置和显示当前网络接口的状态信息,如IP地址、子网掩码等。
- 可以对网络设备进行启用(up)或关闭(down)操作。
- 支持添加(add)和删除(del)网络设备的IP地址。3. **`ip addr`**:
- 是iproute2套件的一部分,提供更全面的网络配置功能。
- 支持配置IPv4和IPv6网络接口,而老版本的`ifconfig`只支持IPv4(新版本已扩展支持IPv6)。
- 显示详细的网络接口信息,包括IP地址、子网掩码、广播地址等。
User
- id -u
- id -g
3.4Docker网络模式修改
/etc/systemd/system/docker.service dockerd ...
-b, --bridge
指定Docker使⽤的⽹桥设备. 默认情况下,Docker会⾃
动创建和使⽤docker0⽹桥设备,通过此参数可以使⽤已
经存在的设备;
--bip
指定docker0的IP和掩码,使⽤CIDR格式进⾏定义,
如: 10.10.10.10/24;
--dns
配置容器的DNS,在启动Docker进⾏时添加,所有容器全
部⽣效.
docker run ...(只针对当前容器)
--dns
指定启动的容器的DNS;
--net
⽤于指定容器的⽹络通信⽅式,有以下四个值:
1.bridge: Docker默认⽅式,⽹桥模式;
2.none: 容器没有⽹络栈;
3.container: 使⽤其它容器的⽹络栈,Docker容器会加⼊其
它容器的network namespace;
4.host: 表示容器使⽤Host的⽹络,没有⾃⼰独⽴的⽹络栈。
容器可以完全访问Host⽹络,不安全.
端⼝映射
-p、-P选项的使⽤格式
/etc/docker/daemon.json
# 定义一个字典,存储网络配置信息
network_config = {
"bip": "192.168.1.5/24", # IP地址和子网掩码
"fixed-cidr": "10.20.0.0/16", # 固定CIDR网络范围
"fixed-cidr-v6": "2001:db8::/64", # 固定CIDR IPv6网络范围
"mtu": "1500", # 最大传输单元
"default-gateway": "10.20.1.1", # 默认网关IP地址
"default-gateway-v6": "2001:db8:abcd::89", # 默认网关IPv6地址
"dns": ["10.20.1.2", "10.20.1.3"] # DNS服务器列表
}
3.5常⻅隔离⽅式
3.6容器的跨主机通信
宿主机配置
- IP转发
- 配置iptables
IP转发
查看
cat /proc/sys/net/ipv4/ip_forward
0: 关闭;
1: 开启.
配置⽂件/etc/sysctl.conf net.ipv4.ip_forward = 1
⽣效配置
sysctl -p /etc/sysctl.conf
重启⽹络
配置iptables
# 设置iptables的FORWARD链的策略为ACCEPT,允许所有转发的数据包通过
iptables -P FORWARD ACCEPT
# 清空并删除所有非内置的iptables链和规则
iptables -F && iptables -X
# 清空并删除所有非内置的nat表中的链和规则
iptables -F -t nat && iptables -X -t nat
# 执行一次性的systemd命令,用于重新加载配置文件
one shot systemd
# 将/etc/profile.d目录添加到系统环境变量中,以便在系统启动时自动执行其中的脚本
/etc/profile.d
3.7容器⽹络⽅案
- pipework
- weave
- openvswitch
- flannel
- calico
pipework
创建⽹桥
物理⽹卡实现的⽹桥
赋予容器⼀个真实内⽹IP
NAT
Host-only
优点
配置简单,不依赖第三⽅软件;
缺点
与主机在同⼀⽹段,IP规划问题;
需要有⽹段控制权,在⽣产环境中不易实现;
不容易管理;
兼容性不佳.
Weave
创建⼀个虚拟的⽹络,⽤于将运⾏在不同宿主机的Docker容器进⾏通信.
https://github.com/weaveworks/weave
优点
配置简单;
缺点
与主机在同⼀⽹段,IP规划问题;
容器的IP需要⼿动⼆次操作.
Open vSwitch
⾼质量的多层虚拟交换机;
主要由C实现;
⼤规模⽹络⾃动化可以通过编程进⾏扩展;
简称: ovs.
安装⽹桥管理⼯具
bridge-utils