Docker学习笔记三——Docker网络访问

1.Docker容器默认通信模式

Dokcer默认通过使用 Linux 桥接提供容器之间的通信,docker0 桥接接口的目的就是方便 Docker 管理。当 Docker daemon 启动时需要做以下操作:

  • creates the docker0 bridge if not present

    • # 如果 docker0 不存在则创建

  • searches for an IP address range which doesn’t overlap with an existing route

    • # 搜索一个与当前路由不冲突的 ip 段

  • picks an IP in the selected range

    • # 在确定的范围中选择 ip

  • assigns this IP to the docker0 bridge

    • # 绑定 ip 到 docker0

[root@linux-node1 ~]# ifconfig docker0       #docker0 ip 
docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
       inet 172.17.0.1  netmask 255.255.0.0  broadcast 0.0.0.0
       inet6 fe80::42:20ff:fe6f:7787  prefixlen 64  scopeid 0x20<link>
       ether 02:42:20:6f:77:87  txqueuelen 0  (Ethernet)
       RX packets 53  bytes 3584 (3.5 KiB)
       RX errors 0  dropped 0  overruns 0  frame 0
       TX packets 5  bytes 418 (418.0 B)
       TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

[root@linux-node1 ~]# brctl show             #桥接通信
bridge name bridge id STP enabled interfaces
docker0 8000.0242206f7787 no veth965f0ac
virbr0 8000.52540032b418 yes virbr0-nic

Docker学习笔记三——Docker网络访问






2.Docker容器四种网络模式

docker run 创建 Docker 容器时,可以用 --net 选项指定容器的网络模式,Docker 有以下 4 种网络模式:

  1. host 模式,使用 --net=host 指定。

  2. container 模式,使用 --net=container:NAME_or_ID 指定。

  3. none 模式,使用 --net=none 指定。

  4. bridge 模式,使用 --net=bridge 指定,默认设置。


  •  host模式容器和宿主机共享Network namespace

如果启动容器的时候使用 host 模式,那么这个容器将不会获得一个独立的 Network Namespace,而是和宿主机共用一个 Network Namespace。容器将不会虚拟出自己的网卡,配置自己的 IP等,而是使用宿主机的 IP 和端口。
例如,我们在 10.10.101.105/24 的机器上用 host 模式启动一个含有 web 应用的 Docker 容器,监听 tcp 80 端口。当我们在容器中执行任何类似 ifconfig 命令查看网络环境时,看到的都是宿主机上的信息。而外界访问容器中的应用,则直接使用 10.10.101.105:80 即可,不用任何 NAT 转换,就如直接跑在宿主机中一样。但是,容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的。

  • container模式容器和另外一个容器共享Network namespace,kubernetes中的pod就是多个容器共享一个Network namespace

这个模式指定新创建的容器和已经存在的一个容器共享一个 Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的 IP,而是和一个指定的容器共享 IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过 lo 网卡设备通信。
  • none模式容器有独立的Network namespace,但并没有对其进行任何网络设置,如分配veth pair 和网桥连接,配置IP等

这个模式和前两个不同。在这种模式下,Docker 容器拥有自己的 Network Namespace,但是,并不为 Docker容器进行任何网络配置。也就是说,这个 Docker 容器没有网卡、IP、路由等信息。需要我们自己为 Docker 容器添加网卡、配置 IP 等。
  • bridge模式Bridge模式是Docker的默认模式

Docker学习笔记三——Docker网络访问

bridge 模式是 Docker 默认的网络设置,此模式会为每一个容器分配 Network Namespace、设置 IP 等,并将一个主机上的 Docker 容器连接到一个虚拟网桥上。当 Docker server 启动时,会在主机上创建一个名为 docker0 的虚拟网桥,此主机上启动的 Docker 容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。接下来就要为容器分配 IP 了,Docker 会从 RFC1918 所定义的私有 IP 网段中,选择一个和宿主机不同的IP地址和子网分配给 docker0,连接到 docker0 的容器就从这个子网中选择一个未占用的 IP 使用。如一般 Docker 会使用 172.17.0.0/16 这个网段,并将 172.17.42.1/16 分配给 docker0 网桥(在主机上使用 ifconfig 命令是可以看到 docker0 的,可以认为它是网桥的管理接口,在宿主机上作为一块虚拟网卡使用)



3.Docker网络映射

3.1 随机映射docker run -P): Docker服务自动分配随机端口映射

[root@linux-node1 ~]# ./docker_in.sh mynginx
root@63ed68ac35a3:/# ip ad li
26: eth0@if27: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.2/16 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:acff:fe11:2/64 scope link 
       valid_lft forever preferred_lft forever
[root@linux-node1 ~]# iptables -t nat -nvL       
#从这里我们可以看到容器通过-P命令后随机分配端口然后通过nat映射来提供网络访问
Chain POSTROUTING (policy ACCEPT 10 packets, 584 bytes)
    0     0 MASQUERADE  tcp  --  *      *     172.17.0.2       172.17.0.2     tcp dpt:443
    0     0 MASQUERADE  tcp  --  *      *     172.17.0.2       172.17.0.2     tcp dpt:80

[root@63ed68ac35a3:/# exit
logout
[root@linux-node1 ~]# docker logs mynginx    #查看容器访问日志
192.168.56.1 - - [07/Oct/2016:09:48:34 +0000] "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36" "-"
192.168.56.1 - - [07/Oct/2016:09:48:34 +0000] "GET /favicon.ico HTTP/1.1" 404 571 "http://192.168.56.11:10001/" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36" "-"
2016/10/07 09:48:34 [error] 6#6: *1 open() "/usr/share/nginx/html/favicon.ico" failed (2: No such file or directory), client: 192.168.56.1, server: localhost, request: "GET /favicon.ico HTTP/1.1", host: "192.168.56.11:10001", referrer: "http://192.168.56.11:10001/"

访问本地192.168.56.11:10001查看(可以使用docker port 命令查看容器端口映射),随机映射生产中很少用,测试环境好用,IP不会冲突。

Docker学习笔记三——Docker网络访问


3.1 指定映射docker run -p):指定映射端口(或IP地址+端口)来映射

● 主要有以下五种方式(最常用为前两种)

  • -p hostPort:containPort    :指定端口映射

  • -p ip:hostPort:containerPort    :指定IP+端口映射

  • -p ip::containerPort    :指定IP不指定端口映射,端口随机分配

  • -p hostPort:containerPort:udp    :指定协议映射(默认为TCP协议)

  • -p 443:443 -p 82:80    :指定多个端口映射


[root@linux-node1 ~]# docker run -d -p 192.168.56.11:81:80 --name mynginx1 nginx
0b7ad717a6f7d15fa57fb266f89435144f58a013d521635f2743c2186c27f85b
[root@linux-node1 ~]# docker port mynginx1
80/tcp -> 192.168.56.11:81

IP地址+端口映射到本地80端口,访问本地192.168.56.11:81查看

Docker学习笔记三——Docker网络访问


指定多个端口映射

[root@linux-node1 ~]# docker run -d -p 443:443 -p 82:80 --name mynginx2 nginx
e1cfab8fe686a57ba5ec8b461bfee83229f64d4fca3b36717e09cad5fb195252
[root@linux-node1 ~]# docker port mynginx2    #指定多个端口映射
443/tcp -> 0.0.0.0:443
80/tcp -> 0.0.0.0:82

◎参考:

https://opskumu.gitbooks.io/docker/content/chapter6.html

http://dockone.io/article/402

http://www.infoq.com/cn/articles/docker-network-and-pipework-open-source-explanation-practice

http://www.alauda.cn/2016/01/18/docker-1-9-network/

anzhihe 安志合个人博客,版权所有 丨 如未注明,均为原创 丨 转载请注明转自:https://chegva.com/1305.html | ☆★★每天进步一点点,加油!★★☆ | 

您可能还感兴趣的文章!

发表评论

电子邮件地址不会被公开。 必填项已用*标注