docker network
虚拟出来一个网卡(docker0)关联到物理网卡上,并且将物理网卡的MAC地址剥夺过来,给这个虚拟网卡用。然后每一个虚拟机到都连到虚拟网卡上(类似于交换机)。虚拟的网卡网络叫桥。桥有四种类型,这里就不详细描述。
4种容器网络类型(从左至右):
1 close contanier(封闭式容器)。容器就是运行进程,而这个进程只是管理本机上的操作,没必要有网络。
2 bridge container(lsoate,host-only,phy bridge,NAT)
3 joined container(联盟式容器)。让两个容器共享同一个网络名称空间。只有当两个容器需要本地回环接口进行通信时,可使用此种方式。
联盟式容器彼此间存在端口冲突的可能性,因此,通常只会在多个容器上的程序需要程序loopback接口互相通信、或对某容器的网络属性进行监控时才使用此种械的网络模型
```shell
docker run --name b2 --net container:b1 busybox
```
4 open container(开放式容器)。使用宿主机的网络。直接把容器暴露在外部网络,并且可以直接修改宿主机网络。很危险。
多主机间容器间通信,使用ovarlay网络模型,tunnel。四层协议封装二层。会用专门的一张来写。
[root@centos7 ~]# docker network list
NETWORK ID NAME DRIVER SCOPE
5b3fcd0d69de bridge bridge local
7d9885b990ad busybox-net bridge local
bba79ff8e13a host host local
8070af41481e none null local
不连接网络的容器,就只有回环网络接口
**[root@centos7 ~]# docker run --name b1 --rm --net none busybox ifconfig**
**lo** Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
[root@centos7 ~]#
用host网络的容器,可以看到就是用的宿主机的网络。非常危险,不建议使用。
**[root@centos7 ~]# docker run --name b1 --rm --net host busybox ifconfig**
br-7d9885b990ad Link encap:Ethernet HWaddr 02:42:26:02:11:61
inet addr:172.18.0.1 Bcast:0.0.0.0 Mask:255.255.0.0
inet6 addr: fe80::42:26ff:fe02:1161/64 Scope:Link
UP BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:26 errors:0 dropped:0 overruns:0 frame:0
TX packets:15 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:1580 (1.5 KiB) TX bytes:1358 (1.3 KiB)
**docker0** Link encap:Ethernet HWaddr 02:42:BC:DF:66:EF
inet addr:172.17.0.1 Bcast:0.0.0.0 Mask:255.255.0.0
inet6 addr: fe80::42:bcff:fedf:66ef/64 Scope:Link
UP BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:54 errors:0 dropped:0 overruns:0 frame:0
TX packets:25 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:3186 (3.1 KiB) TX bytes:2454 (2.3 KiB)
**ens32** Link encap:Ethernet HWaddr 00:0C:29:AB:72:FE
inet addr:192.168.1.156 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:feab:72fe/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:152571 errors:0 dropped:0 overruns:0 frame:0
TX packets:22789 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:42509065 (40.5 MiB) TX bytes:2356330 (2.2 MiB)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:135953 errors:0 dropped:0 overruns:0 frame:0
TX packets:135953 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:30633797 (29.2 MiB) TX bytes:30633797 (29.2 MiB)
[root@centos7 ~]#
使用bridge的容器,默认使用bridge,分配了一个ip地址
**[root@localhost ~]# docker run --name b1 docker.io/busybox ifconfig**
eth0 Link encap:Ethernet HWaddr 02:42:AC:11:00:02
inet addr:**172.17.0.2** Bcast:0.0.0.0 Mask:255.255.0.0
inet6 addr: fe80::42:acff:fe11:2/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:5 errors:0 dropped:0 overruns:0 frame:0
TX packets:2 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:438 (438.0 B) TX bytes:180 (180.0 B)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
[root@localhost ~]#
docker network command
docker network create
Usage
docker network create [OPTIONS] NETWORK
Name,shorhand | Default | Description |
---|---|---|
--config-from | The network from which copying the configuration | |
--driver,-d | bridge | Driver to manage the Network |
--gateway | IPv4 or IPv6 Gateway for the master subnet | |
--ip-range | Allocate container ip from a sub-range | |
--subnet | Subnet in CIDR format that represents a network segment |
~]# docker network create
--driver=bridge
--subnet=10.10.0.0/16
--ip-range=10.10.1.0/24
--gateway=10.10.1.254
test
[root@localhost ~]# docker network list
NETWORK ID NAME DRIVER SCOPE
c372b82defdc bridge bridge local
ed02d84e3c87 host host local
ff97b1c27347 none null local
**a6f25cd5494f test bridge local**
网络已经创建出来了,接下来将容器添加至此虚拟网络上
**[root@localhost ~]# docker run --name b1 -it **--net=test** docker.io/busybox
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue 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
11: eth0@if12: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
link/ether 02:42:0a:0a:01:00 brd ff:ff:ff:ff:ff:ff
inet **10.10.1.0/16** scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::42:aff:fe0a:100/64 scope link tentative
valid_lft forever preferred_lft forever
/ # **
查看创建网络的详细信息
[root@localhost ~]# docker network inspect test
[
{
**"Name": "test",**
"Id": "a6f25cd5494f5428de680126d18b628a0122bc93641d895a0bb6f25f8b7b6a57",
"Created": "2018-03-19T06:28:38.565181889-04:00",
"Scope": "local",
**"Driver": "bridge",**
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
** "Subnet": "10.10.0.0/16",
"IPRange": "10.10.1.0/24",
"Gateway": "10.10.1.254"**
}
...
docker network connect
Usage
docker network connect [OPTIONS] NETWORK CONTAINER
Name,shorthand | Default | Description |
---|---|---|
--alias | Add network-scoped alias for the container | |
--ip | IPv4 address (e.g., 172.30.100.104) | |
--ip6 | IPv6 address (e.g., 2001:db8::33) | |
--link | Add link to another container |
[root@localhost ~]# docker run --name b4 -it docker.io/busybox
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue 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
19: eth0@if20: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.3/16 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::42:acff:fe11:3/64 scope link tentative
valid_lft forever preferred_lft forever
重新打开一个终端,输入命令指定你想分配到这个容器接口的ip地址
[root@localhost ~]# docker network connect --ip=10.10.1.253 test b4
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue 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
19: eth0@if20: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.3/16 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::42:acff:fe11:3/64 scope link
valid_lft forever preferred_lft forever
21: eth1@if22: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
link/ether 02:42:0a:0a:01:fd brd ff:ff:ff:ff:ff:ff
inet **10.10.1.253/16** scope global eth1
valid_lft forever preferred_lft forever
inet6 fe80::42:aff:fe0a:1fd/64 scope link
valid_lft forever preferred_lft forever
/ #
可以看到已经添加进来了
要验证这个容器是否已连接到网络,使用docker network inspect命令。使用docker network disconnect来从网络删除容器。
[root@localhost ~]# **docker network disconnect test b4**
[root@localhost ~]# **docker exec b4 ip a**
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue 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
19: eth0@if20: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.3/16 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::42:acff:fe11:3/64 scope link
valid_lft forever preferred_lft forever
已经删除了
docker network rm
删除网络,只有在此网络名称空间不用时,才可删除
大部容器的运行就是要让本容器的服务能够对外提供访问的。所以为了实现这种就必须把port expose出去。其实也就做NAT规则。
暴露端口命令:
docker run -p 宿主机ip:宿主机端口:容器端口 --name b1 docker.io/busybox:latest
如果此处-p参数后不指定宿主机的某个ip地址和端口,那么就会出现容器的端口会映射到宿主机的所有ip地址,并且宿主机上的端口是随机的。
~]# docker run --name b1 -p 192.168.1.157:80:80 -d --rm docker.io/xiaoniaoo/dm:v1.0 httpd -f -h /app/html
e0eb2edc180b8908393078b7ee9e881bcabcbbe6ed4657239bde4d4b7cac177a
~]# docker port b1
80/tcp -> 192.168.1.157:80
~]# curl 192.168.1.157
<h1>Hello dai!</h1>
~]# docker run --name b2 --rm -d -p :80 docker.io/xiaoniaoo/dm:v1.0 httpd -f -h /app/html/
ab56763063a2497b517c9fabf2aa131a77101b536428b6710a60bfbc9668640f
~]# docker port b2
80/tcp -> 0.0.0.0:32768
本次没有指定,就会使用宿主机的所有ip地址,并且随机端口
~]# curl 127.0.0.1:32768
<h1>Hello dai!</h1>
~]# curl 127.0.0.1:32768/login.html
<h1>Hello ming!</h1>