1 Docker网络通讯

  • 在通常情况下,Docker使用网桥(Bridge)和NAT的通信模式。

Docker的网络通讯.png

  • 简而言之,Docker需要解决的就是容器和容器之间的通讯、容器访问外部网络、外部网络访问容器的问题。
  • Docker网络管理 - 图2容器和容器之间的通讯:
    • Docker是通过docker0网卡来通信的,docker0网卡有点类似于交换器。

Docker使用docker0网卡进行通信.png

  • 每启动一个Docker,会在容器内部生成一个虚拟网卡。

在容器内部产生一个虚拟网卡.png

  • 在主机,会产生一个与之对应的vethx,即namespace(命名空间,命名空间之间是隔断的,每产生一个Docker容器,会在主机产生一个与之对应的vethx)。

在主机,会产生一个与之对应的vethx.png

  • Docker网络管理 - 图6容器访问外部网络:就是借助了SNAT(源地址转换)。SNAT:源地址转换是内网地址向外访问时,发起访问的内网ip地址转换为指定的ip地址(可指定具体的服务以及相应的端口或端口范围),这可以使内网中使用保留ip地址的主机访问外部网络,即内网的多部主机可以通过一个有效的公网ip地址访问外部网络。A公司拥有多个公网IP(60.191.82.105-107),A公司希望内部用户(IP为192.168.1.50)使用某个特定的IP(60.191.82.107)访问互联网,则需在出口路由设备上需要配置源地址转换。
  1. iptables -t nat -A POSTROUTING -s 172.17.0.0/16 -o docker0 -j MASQUERADE
  • Docker网络管理 - 图7外部网络访问容器:就是借助了DNAT(向internel发布内网服务器)。DNAT:内网web服务器,或是ftp服务器,为了用户在公网也可以访问,有不想买公网ip地址,采用DNAT方案。
  1. 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 网络隔离

  • 查看当前可用的网络类型:
  1. docker network ls

查看当前可用的网络类型.png

  • 创建网络空间:
  1. docker network create -d 类型 网络空间名称
  2. # 类型分为overlay和bridge

创建网络空间名称.png

新生成的网络空间对应的网卡.png

  • 启动2个MySQL服务器,使用刚才新建的网络名称:
  1. 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
  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

启动2个MySQL服务器,使用刚才新建的网络名称.png
查看MySQL服务器是否在docker0那个网段内.png