当你安装Docker时,它会自动创建三个网络。你可以使用以下docker network ls命令列出这些网络:

[root@localhost ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
57bd5f150d9a bridge bridge local
012889c9eb3c host host local
a549e6efeedc none null local

我们在使用docker run创建Docker容器时,可以用 --net 选项指定容器的网络模式,Docker可以有以下4种网络模式:
host模式:使用 --net=host 指定。
none模式:使用 --net=none 指定。
bridge模式:使用 --net=bridge 指定,默认设置。
container模式:使用 --net=container:NAME_or_ID 指定。

host模式:

启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。但是,容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的。

[root@localhost ~]# docker run -itd --net=host --name net1 centos7 bash
4ad38fca08fe5fa989b89420571a299f7b6721bb6dc483a2039fb1ea546a85da
[root@localhost ~]# docker exec net1 bash -c 'ifconfig'
docker0: flags=<UP,BROADCAST,MULTICAST> mtu
inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255
inet6 fe80:::e6ff:fe40:ac8e prefixlen scopeid 0x20<link>
ether ::e6::ac:8e txqueuelen (Ethernet)
RX packets bytes (136.8 KiB)
RX errors dropped overruns frame
TX packets bytes (12.7 MiB)
TX errors dropped overruns carrier collisions ens33: flags=<UP,BROADCAST,RUNNING,MULTICAST> mtu
inet 192.168.0.191 netmask 255.255.255.0 broadcast 192.168.0.255
inet6 fe80::f7c9:a526:bc5d:3cc2 prefixlen scopeid 0x20<link>
ether :0c::c0:ec: txqueuelen (Ethernet)
RX packets bytes (724.2 MiB)
RX errors dropped overruns frame
TX packets bytes (11.1 MiB)
TX errors dropped overruns carrier collisions lo: flags=<UP,LOOPBACK,RUNNING> mtu
inet 127.0.0.1 netmask 255.0.0.0
inet6 :: prefixlen scopeid 0x10<host>
loop txqueuelen (Local Loopback)
RX packets bytes (404.0 B)
RX errors dropped overruns frame
TX packets bytes (404.0 B)
TX errors dropped overruns carrier collisions

container模式:

Container模式指定新创建的容器和已存在的容器共享一个Network Namespace,而不是和宿主机共享。

即新创建的容器不会创建自己的网卡,配置自己的ip,而是和指定的容器共享IP,端口范围等,同样两个容器除了网络方面相同之外,其他如文件系统、进程列表等还是隔离的。

#创建net2容器,查看ip为172.17.02
[root@localhost ~]# docker run -itd --name net2 centos7 bash
340ece9d752d2ce00993a91383c8bae6d53d5fe5602d1d596701f8aec1fb267f
[root@localhost ~]# docker exec net2 bash -c 'ifconfig'
eth0: flags=<UP,BROADCAST,RUNNING,MULTICAST> mtu
inet 172.17.0.2 netmask 255.255.0.0 broadcast 172.17.255.255
ether ::ac::: txqueuelen (Ethernet)
RX packets bytes (648.0 B)
RX errors dropped overruns frame
TX packets bytes (0.0 B)
TX errors dropped overruns carrier collisions lo: flags=<UP,LOOPBACK,RUNNING> mtu
inet 127.0.0.1 netmask 255.0.0.0
loop txqueuelen (Local Loopback)
RX packets bytes (0.0 B)
RX errors dropped overruns frame
TX packets bytes (0.0 B)
TX errors dropped overruns carrier collisions 创建net3容器,并指定container网络模式,查看ip和net2容器的ip相同
[root@localhost ~]# docker run -itd --net=container:net2 --name net3 centos7 bash
9a7b90d8f328e58f301285300949b515d59ddaad747b9750b5bd5a0c700c4964
[root@localhost ~]# docker exec net3 bash -c 'ifconfig'
eth0: flags=<UP,BROADCAST,RUNNING,MULTICAST> mtu
inet 172.17.0.2 netmask 255.255.0.0 broadcast 172.17.255.255
ether ::ac::: txqueuelen (Ethernet)
RX packets bytes (648.0 B)
RX errors dropped overruns frame
TX packets bytes (0.0 B)
TX errors dropped overruns carrier collisions lo: flags=<UP,LOOPBACK,RUNNING> mtu
inet 127.0.0.1 netmask 255.0.0.0
loop txqueuelen (Local Loopback)
RX packets bytes (0.0 B)
RX errors dropped overruns frame
TX packets bytes (0.0 B)
TX errors dropped overruns carrier collisions

None模式:

如果处于None模式,docker容器拥有自己的network namespace,但是并不为docker容器进行任何网络配置,也就是说docker容器没有网卡、ip、路由等信息,需要手工为容器添加网卡配置等,典型pipework工具为docker容器指定ip等信息。

[root@localhost ~]# docker run -itd --net=none --name net4 centos7 bash
7c5e3e04e701837e6907e95ce8139d9f756cf40d1fb1eb34aaf635e8968b34b9
[root@localhost ~]# docker exec net4 bash -c 'ifconfig'
lo: flags=<UP,LOOPBACK,RUNNING> mtu
inet 127.0.0.1 netmask 255.0.0.0
loop txqueuelen (Local Loopback)
RX packets bytes (0.0 B)
RX errors dropped overruns frame
TX packets bytes (0.0 B)
TX errors dropped overruns carrier collisions

bridge桥接模式:

bridge模式是docker默认的网络模式,不写--net参数,默认就是bridge模式,该模式会为每个容器分配network namespace、设置ip、路由等配置,默认会将docker容器连接到一个虚拟网桥docker0上。

docker bridge创建过程:
、首先在宿主机创建一对虚拟网卡veth pair设备,组成了一个数据的通道,数据从一个设备进入,就会从另一个设备出来,veth设备常用来连接两个网络设备。
、docker将veth pair设备的一端放在新建的容器中并命名为eth0,然后另一端放在宿主机中,以vethXXX这样类似的名字命名,并将这个网络设备加入到docker0网桥中,可以通过brctl show命令查看。
、从docker0子网中分配一个ip给容器使用,并设置docker0的ip地址为容器的默认网关。
、此时容器ip与宿主机能够通信,宿主机也可以访问容器中的ip地址,在bridge模式下,连在同一个网桥上的容器之间可以相互通信,同时容器也可以访问外网,但是外网不能访问docker容器ip,需要通过nat将容器ip的port映射到宿主机的ip和port。
[root@localhost ~]# docker run -itd --name net5 --net=bridge centos7 bash
5ba8509815efe90db673bec55047198877ad1986ca478a70dee7d648ee854d44
[root@localhost ~]# docker exec net5 bash -c 'ifconfig eth0'
eth0: flags=<UP,BROADCAST,RUNNING,MULTICAST> mtu
inet 172.17.0.2 netmask 255.255.0.0 broadcast 172.17.255.255
ether ::ac::: txqueuelen (Ethernet)
RX packets bytes (648.0 B)
RX errors dropped overruns frame
TX packets bytes (0.0 B)
TX errors dropped overruns carrier collisions [root@localhost ~]# docker exec net5 bash -c 'ping www.baidu.com'  #通过容器访问外网
PING www.a.shifen.com (180.97.33.107) () bytes of data.
bytes from 180.97.33.107 (180.97.33.107): icmp_seq= ttl= time=18.3 ms
bytes from 180.97.33.107 (180.97.33.107): icmp_seq= ttl= time=19.1 ms
[root@localhost ~]# docker exec net5 bash -c 'route -n'  #查看容器的网关为宿主机docker0网桥
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 172.17.0.1 0.0.0.0 UG eth0
172.17.0.0 0.0.0.0 255.255.0.0 U eth0

当容器中运行一些网络应用,要让外部访问这些应用时,可以通过-p或-P参数来指定端口映射。

[root@localhost ~]# docker run -itd -p : --name web nginx
46323ac3a1989d41613064dd9539ec014e500b92b51bd68de17c438cb5fa9fda
[root@localhost ~]# curl -I 127.0.0.1:
HTTP/1.1 OK
Server: nginx/1.15.
Date: Wed, Nov :: GMT
Content-Type: text/html
Content-Length:
Last-Modified: Tue, Nov :: GMT
Connection: keep-alive
ETag: "5be197d9-264"
Accept-Ranges: bytes [root@localhost ~]# docker port web
/tcp -> 0.0.0.0:

自定义docker网络:

我们可通过bridge驱动创建类似前面默认的bridge网络

[root@localhost ~]# docker network create --driver bridge --subnet 192.168.100.0/24 --gateway 192.168.100.1 my_net
1ae5f1b58076113dfac6c53b1174a56dabdbc51676bda85bf2d52cd76bc343da
[root@localhost ~]# docker network inspect my_net
[
{
"Name": "my_net",
"Id": "1ae5f1b58076113dfac6c53b1174a56dabdbc51676bda85bf2d52cd76bc343da",
"Created": "2018-11-21T13:33:36.526223383+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "192.168.100.0/24",
"Gateway": "192.168.100.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {},
"Options": {},
"Labels": {}
}
]

查看自定义网桥

[root@localhost ~]# brctl show
bridge name bridge id STP enabled interfaces
br-1ae5f1b58076 .0242d4fadd5f no
docker0 .0242e640ac8e no vetha201371
vethd99013e
[root@localhost ~]# ifconfig br-1ae5f1b58076
br-1ae5f1b58076: flags=<UP,BROADCAST,MULTICAST> mtu
inet 192.168.100.1 netmask 255.255.255.0 broadcast 192.168.100.255
ether ::d4:fa:dd:5f txqueuelen (Ethernet)
RX packets bytes (0.0 B)
RX errors dropped overruns frame
TX packets bytes (0.0 B)
TX errors dropped overruns carrier collisions

启动容器通过--network制定使用自定义的网络

[root@localhost ~]# docker run -itd --name test1 --network=my_net centos7 bash
b16e32bc80decffa54593e66ccd3f57796e5f4f11960403851e722c0e462194d
[root@localhost ~]# docker exec test1 bash -c 'ifconfig eth0'
eth0: flags=<UP,BROADCAST,RUNNING,MULTICAST> mtu
inet 192.168.100.2 netmask 255.255.255.0 broadcast 192.168.100.255
ether ::c0:a8:: txqueuelen (Ethernet)
RX packets bytes (648.0 B)
RX errors dropped overruns frame
TX packets bytes (0.0 B)
TX errors dropped overruns carrier collisions

只有使用--subnet创建的网络才能指定静态ip

[root@localhost ~]# docker run -itd --name test2 --network=my_net --ip 192.168.100.254 centos7 bash
0398f3a337c50111139871569809e922c27073c2011e0f36d6eda50af4d84454
[root@localhost ~]# docker exec test2 bash -c 'ifconfig eth0'
eth0: flags=<UP,BROADCAST,RUNNING,MULTICAST> mtu
inet 192.168.100.254 netmask 255.255.255.0 broadcast 192.168.100.255
ether ::c0:a8::fe txqueuelen (Ethernet)
RX packets bytes (578.0 B)
RX errors dropped overruns frame
TX packets bytes (0.0 B)
TX errors dropped overruns carrier collisions

容器使用自定义网络可以通过容器名进行通信

[root@localhost ~]# docker run -itd --name bs1 --network=my_net --ip 192.168.100.10 busybox
56a1be29e29d3c258608abd4f16203270b648d7c25dd448aa089f1950236a4d1
[root@localhost ~]# docker run -itd --name bs2 --network=my_net --ip 192.168.100.20 busybox
7e5278889c346ab7ea4832a673d728c31fd3624bff722b98857afd7ce148852b
[root@localhost ~]# docker exec bs1 ping bs2
PING bs2 (192.168.100.20): data bytes
bytes from 192.168.100.20: seq= ttl= time=0.119 ms
bytes from 192.168.100.20: seq= ttl= time=0.047 ms

docker使用pipework配置容器与宿主机同一网段:

docker默认提供了一个隔离的内网环境,启动时会建立一个docker0的虚拟网卡,每个容器都是连接到docker0网卡上的。而docker0的ip段为172.17.0.0,若想让容器与宿主机同一网段的其他机器访问,所以为了让容器与宿主机同一个网段,我们需要建立自己的桥接网络。我们只要将Docker容器和宿主机的网卡桥接起来,再给Docker容器配上IP就可以了。

创建桥接网卡br0

[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-br0

TYPE=Bridge
BOOTPROTO=static
NAME=br0
DEVICE=br0
ONBOOT=yes
IPADDR=192.168.0.191
NETMASK=255.255.255.0
GATEWAY=192.168.0.1

修改宿主机网卡配置

[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33

TYPE=Ethernet
BOOTPROTO=none
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_PEERDNS=yes
IPV6_PEERROUTES=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=a284e06a-34b8-4e84-8f18-446c18ccf44f
DEVICE=ens33
ONBOOT=yes
#IPADDR=192.168.0.191
#NETMASK=255.255.255.0
#GATEWAY=192.168.0.1
BRIDGE=br0

重启网络,查看br0的ip地址

[root@localhost ~]# systemctl restart network

[root@localhost ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master br0 state UP group default qlen 1000
link/ether 00:0c:29:c0:ec:44 brd ff:ff:ff:ff:ff:ff
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
link/ether 02:42:57:0c:b1:67 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
inet6 fe80::42:57ff:fe0c:b167/64 scope link
valid_lft forever preferred_lft forever
21: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 00:0c:29:c0:ec:44 brd ff:ff:ff:ff:ff:ff
inet 192.168.0.191/24 brd 192.168.0.255 scope global br0
valid_lft forever preferred_lft forever
inet6 fe80::746c:4cff:fe34:f740/64 scope link
valid_lft forever preferred_lft forever

安装pipework

[root@localhost ~]# git clone https://github.com/jpetazzo/pipework.git
Cloning into 'pipework'...
remote: Enumerating objects: , done.
remote: Total (delta ), reused (delta ), pack-reused
Receiving objects: % (/), 172.97 KiB | 90.00 KiB/s, done.
Resolving deltas: % (/), done.
[root@localhost ~]# cp pipework/pipework /usr/local/bin/

使用pipework给容器配置ip,并测试连通性

[root@localhost ~]# docker run -itd --net=none --name=test5 busybox
7c4e568ad87b31bc0d20e652c6cbf2a1e9a92d8ec9cfa9f8bdf7ef1ebc6d55e6
[root@localhost ~]# pipework br0 test5 192.168.0.195/@192.168.0.1
[root@localhost ~]# docker exec test5 ip a
: lo: <LOOPBACK,UP,LOWER_UP> mtu qdisc noqueue qlen
link/loopback ::::: brd :::::
inet 127.0.0.1/ scope host lo
valid_lft forever preferred_lft forever
: eth1@if23: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu qdisc noqueue qlen
link/ether ea::6e::5e:a7 brd ff:ff:ff:ff:ff:ff
inet 192.168.0.195/ brd 192.168.0.255 scope global eth1
valid_lft forever preferred_lft forever
[root@localhost ~]# docker exec test5 ping www.baidu.com
PING www.baidu.com (103.235.46.39): data bytes
bytes from 103.235.46.39: seq= ttl= time=220.568 ms
bytes from 103.235.46.39: seq= ttl= time=223.242 ms

docker单主机网络的更多相关文章

  1. Docker 单主机网络

    PS:欢迎大家关注我的公众号:aCloudDeveloper,专注技术分享,努力打造干货分享平台,二维码在文末可以扫,谢谢大家. 当容器逐步向容器集群,容器云技术演进的时候,一个不得不面对的问题就是各 ...

  2. Docker跨主机网络——overlay

    前言 在Docker网络--单host网络一文中,我为大家总结了Docker的单机网络相关知识和操作,单机网络比较容易.本文我为大家总结Docker跨主机通信相关知识.同样本文大部分内容以CloudM ...

  3. Docker 多主机网络总结(非常全)

    PS:文章首发公众号,欢迎大家关注我的公众号:aCloudDeveloper,专注技术分享,努力打造干货分享平台,二维码在文末可以扫,谢谢大家. 上篇文章介绍了容器网络的单主机网络,本文将进一步介绍多 ...

  4. Docker 跨主机网络方案分析

    PS:文章首发公众号,欢迎大家关注我的公众号:aCloudDeveloper,专注技术分享,努力打造干货分享平台,二维码在文末可以扫,谢谢大家. 上篇文章介绍了容器网络的单主机网络,本文将进一步介绍多 ...

  5. docker多主机网络方案

    本文探讨Docker多主机网络的性能. 在过去的博文里,我测试过 Docker的网络 . MySQL服务器团队 提供了他们自己的结果,和我的观察是一致的. 本文里一系列的测试,想更多关注使用多主机的D ...

  6. Docker多主机网络 OpenvSwitch

    一.Open vSwitch    Open vSwitch(以下简称为OVS),英文全称:OpenVirtual Switch,顾名思义,Open vSwitch就是开放虚拟交换.我们可以把他理解成 ...

  7. Docker入门篇(二)之docker的单主机网络

    Docker 安装时会自动在host上创建三个网络,我们可用 docker network ls命令查看: [root@localhost ~]# docker network ls NETWORK ...

  8. Docker跨主机网络实践

    Docker使用中网络管理是最麻烦的,在项目初始化前期就需要进行合理的规划,如果在比较理想的单主机的网络通信是比较简单的,但如果涉及到跨主机的网络就需要使用docker自带的overlay netwo ...

  9. Docker多主机网络

    网络术语概念 二层交换技术:工作在OSI七层网络模型的第二层,通过MAC地址进行帧转发 三层交换技术:也称为IP交换技术,工作在OSI七层网络模型的第三层,通过IP地址进行包转发.它解决了局域网中网段 ...

随机推荐

  1. 在Packstack环境手动安装OVN

    安装OpenStack(allinone)环境 ### 参考"Packstack使用"章节安装,但是不要配置外网网络 安装OVN组件 ### 控制节点 # yum install ...

  2. vector详解

    /*vector向量容器*/ //用数组方式访问vector元素 #include<iostream> #include<vector> #include<cstdio& ...

  3. [Xcode 实际操作]七、文件与数据-(5 )复制、移动、删除文件和删除文件夹

    目录:[Swift]Xcode实际操作 本文将演示如何复制.移动和删除文件. 在项目导航区,打开视图控制器的代码文件[ViewController.swift] import UIKit class ...

  4. IT兄弟连 JavaWeb教程 AJAX中参数传递问题

    使用Ajax发送GET请求并需要传递参数时,直接在URL地址后拼接参数,格式如下: xhr.open('get','请求路径?参数名1=参数值1&参数名2=参数值2...',true); 使用 ...

  5. 四、python中表示组的概念与定义

    现实世界中总是存在一组一组的事物,如俄罗斯方块.游戏中的技能.世界杯总决赛(8个小组,每组4个队) 一.python中如何表示“组”的概念 1.列表 1)定义 [1,2,3,4,5] type[1,2 ...

  6. 如何在VMware workstation上创建Linux虚拟机

    由于需要使用Linux虚拟机部署Hadoop集群,故在win10系统上安装了VMware workstation 14,现将介绍如何在VMware workstation上创建Linux虚拟机.下面以 ...

  7. Docker安装nginx以及负载均衡

    首先在linux系统中新建一个data文件夹进行nginx容器的创建--即为:mkdir data. 一:第一次 1 第一步: 使用 docker pull nginx将nginx的镜像从仓库下载下来 ...

  8. Linux常用命令(补充)--其他

    其他1)记录命令历史(1)!! (连续两个”!”),表示执行上一条指令:(2)!n(这里的n是数字),表示执行命令历史中第n条指令,例如”!100”表示执行命令历史中第100个命令:(3)!字符串(字 ...

  9. SP14932 LCA - Lowest Common Ancestor

    Description: 一棵树是一个简单无向图,图中任意两个节点仅被一条边连接,所有连通无环无向图都是一棵树.\(-Wikipedia\) 最近公共祖先(\(LCA\))是--(此处省去对\(LCA ...

  10. Net Core -- 配置Kestrel端口

    Net Core -- 配置Kestrel端口 Kestrel介绍 在Asp.Net Core中,我们的web application 其实是运行在Kestrel服务上,它是一个基于libuv开源的跨 ...