zoukankan      html  css  js  c++  java
  • Docker的网络管理

    1 Docker网络通讯

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

    Docker的网络通讯

    • 简而言之,Docker需要解决的就是容器和容器之间的通讯、容器访问外部网络、外部网络访问容器的问题。

    • 1️⃣容器和容器之间的通讯:

      • Docker是通过docker0网卡来通信的,docker0网卡有点类似于交换器。

      Docker使用docker0网卡进行通信

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

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

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

      在主机,会产生一个与之对应的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
    

    启动2个MySQL服务器,使用刚才新建的网络名称

    查看MySQL服务器是否在docker0那个网段内

  • 相关阅读:
    Android Studio 字体和字号调整
    【IDEA】项目中引入Spring MVC
    【Double】double精度问题和int、long除不尽取舍问题
    【进制转换】原码反码和补码的理解以及进制转换
    【工具】SwitchHost的使用
    【工具】谷歌浏览器使用技巧
    【Git和GitHub】学习笔记
    【IE兼容性】代码中多语言样式+IE不兼容解决
    【Trello】使用指南
    【实操】进制转换:除基倒取余法
  • 原文地址:https://www.cnblogs.com/xuweiweiwoaini/p/13675286.html
Copyright © 2011-2022 走看看