Docker的网络管理
1 Docker网络通讯
- 在通常情况下,Docker使用网桥(Bridge)和NAT的通信模式。
-
简而言之,Docker需要解决的就是容器和容器之间的通讯、容器访问外部网络、外部网络访问容器的问题。
-
1️⃣容器和容器之间的通讯:
- Docker是通过docker0网卡来通信的,docker0网卡有点类似于交换器。
- 每启动一个Docker,会在容器内部生成一个虚拟网卡。
- 在主机,会产生一个与之对应的vethx,即namespace(命名空间,命名空间之间是隔断的,每产生一个Docker容器,会在主机产生一个与之对应的vethx)。
-
2️⃣容器访问外部网络:就是借助了SNAT(源地址转换)。SNAT:源地址转换是内网地址向外访问时,发起访问的内网ip地址转换为指定的ip地址(可指定具体的服务以及相应的端口或端口范围),这可以使内网中使用保留ip地址的主机访问外部网络,即内网的多部主机可以通过一个有效的公网ip地址访问外部网络。A公司拥有多个公网IP(60.191.82.105-107),A公司希望内部用户(IP为192.168.1.50)使用某个特定的IP(60.191.82.107)访问互联网,则需在出口路由设备上需要配置源地址转换。
iptables -t nat -A POSTROUTING -s 172.17.0.0/16 -o docker0 -j MASQUERADE
- 3️⃣外部网络访问容器:就是借助了DNAT(向internel发布内网服务器)。DNAT:内网web服务器,或是ftp服务器,为了用户在公网也可以访问,有不想买公网ip地址,采用DNAT方案。
docker run -d -p 80:80 apache
2 Docker网络模式修改
2.1 Docker进程网络修改(不常用)
- -b,--bridge="":指定Docker使用的网桥设备,默认情况下Docker会自动创建和使用docker0网桥设备,通过此参数可以使用已经存在的网桥设备。
- --bip:指定docker0的IP和掩码,使用标准的CIDR形式,如:10.10.10.10/24。
- --dns:配置容器的DNS,在启动Docker进程是添加,所有容器全部生效。
2.2 Docker容器网络修改
- --dns:用于指定启动的容器的DNS。
- --net:用于指定容器的网络通讯方式,有如下四种值:
- bridge:Docker的默认方式,网桥模式。
- none:容器没有网络栈。
- container:使用其他容器的网络栈,Docker容器会加入其他容器的network namespace。
- host:表示容器使用Host的网络,没有自己独立的网络栈。容器可以完全访问HOST的网络,不安全。
2.3 -p/P选项的使用格式
-p :容器端口
:将指定的容器端口映射到主机所有地址的一个动态端口。-p 主机端口:容器端口
:映射到指定的主机端口。-p IP地址::容器端口
:映射到指定的主机的IP的动态端口。-p IP地址::主机端口:容器端口
:映射到指定的主机IP的主机端口。-P :
:暴露所需要的所有端口。
docker port 容器id:可以查看当前容器的映射关系。
3 网络隔离
- 查看当前可用的网络类型:
docker network ls
- 创建网络空间:
docker network create -d 类型 网络空间名称
# 类型分为overlay和bridge
- 启动2个MySQL服务器,使用刚才新建的网络名称:
docker run -id -p 3306:3306 --name lampmysql5.7 --network lamp -v /var/lampmysql5.7/conf:/etc/mysql/conf.d -v /var/lampmysql5.7/logs:/logs -v /var/lampmysql5.7/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7 --lower_case_table_names=1
docker run -id -p 3307:3306 --name lnmpmysql5.7 --network lnmp -v /var/lnmpmysql5.7/conf:/etc/mysql/conf.d -v /var/lnmpmysql5.7/logs:/logs -v /var/lnmpmysql5.7/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7 --lower_case_table_names=1