Docker初学乍练之单主机网络

1、Docker bridge network

Docker 桥接网络使用软件桥接, 该软件桥接容许链接到同一桥网的容器进行通讯, 同时提供与未链接到该桥网络的容器的隔离。Docker 桥接驱动程序会自动在主机中安装规则, 以便不一样桥接网络上的容器不能直接相互通讯。桥接网络适用于在同一 Docker 守护进程主机上运行的容器。Docker 默认网络类型为桥接,对于桥接网络用户可使用docker默认的,也能够自定义桥接网络,自定义的桥接网络优先级高于默认的。html

一、Docker default bridge

1.一、基于docker默认桥接网络的桥接容器

桥接式容器,通常拥有两个接口:一个环回接口和一个链接至物理机docker0网卡上的以太网接口;物理机docker0网卡实际上是NAT桥,所以桥接式容器可经过此接口访问外部网络,但防火墙规则阻止了一切从外部网络访问桥接式容器的请求node

[root@node ~]# docker container run --name br-net1 -it --rm busybox:latest
/ # ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue 
    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
22: eth0@if23: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue 
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever

桥接网络中,容器网卡与物理机网卡各占docker虚拟网卡的一半,网关默认为物理机网卡172.17.0.1,为容器自动分配0.2到0.254的地址web

1.二、基于docker默认桥接网络的开放式容器

开放容器内服务到桥接式网络宿主机外部去docker

1.2.一、“-P“选项或”--publish-all“将容器的全部计划要开放端口所有映射至主机端口,计划要开放的端口使用--expose选项指定

docker container run --name myweb --rm -it -P --expose 2000 --expose 2001 busybox

查看映射结果网络

[root@node ~]# docker port myweb 
2000/tcp -> 0.0.0.0:32770
2001/tcp -> 0.0.0.0:32769

1.2.二、“-p”选项

使用格式:
-p <containerPort> :将指定的容器端口映射至主机全部地址的一个动态端口curl

示例:
    docker container run --name myweb --rm -p 80 busybox

-p <hostPort>:<containerPort>:将容器端口<containerPort>映射至指定的主机端口<hostPort>tcp

示例:
    docker container run --name myweb --rm -p 8080:80 busybox
-p <ip>::<containerPort>:将指定的容器端口<containerPort>映射至主机指定<ip>的动态端口
示例:
    docker container run --name myweb --rm -p 192.168.143.130::80 busybox
-p <ip>:<hostPort>:<containerPort>:将指定的容器端口<containerPort>映射至主机指定<ip>的端口<hostPort>
示例:
    docker container run --name myweb --rm -p 192.168.143.130:8080:80 busybox

Ps:”动态端口“指随机端口,具体的映射结果可以使用docker port命令查看ide

1.三、基于docker默认桥接网路的联盟式容器

联盟式容器,是指使用某个已存在容器的网络接口的容器,容器间的Network、IPC、UTS是共享的,共用的网络与进程间通讯协议栈让容器间可经过环回口通讯
联盟式容器彼此间存在端口冲突的可能性,所以,一般只会在多个容器上的程序须要程序loopback接口互相通讯、或对某已存在的容器的网络属性进行监控时才使用此种模式的网络类型
示例:
建立容器b1oop

[root@node ~]# docker container run -it --rm --name b1 busybox:latest 
/ # ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue 
    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
34: eth0@if35: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue 
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever

建立容器b2,加入容器b1的网络,url

[root@node ~]# docker container run --name b2 --network container:b1 -it --rm busybox:latest 
/ # ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue 
    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
34: eth0@if35: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue 
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever

1.四、默认桥接网络的配置

建立或运行容器时,经过--network参数指明网络类型
Docker-daemon配置文件中关于桥接网络的配置

{
  "bip": "10.0.0.1/24",
  "fixed-cidr": "10.0.0.1/25",
  "fixed-cidr-v6": "2001:db8::/64",
  "mtu": 1500,
  "default-gateway": "10.0.0.1",
  "default-gateway-v6": "2001:db8:abcd::89",
  "dns": ["10.0.0.1","10.0.20.1"]
}

二、自定义桥接网络

经过network命令集实现网络的自定义

2.一、建立与删除自定义桥接网络

docker network create my-net
docker network rm my-net

2.二、查看自定义桥接网络信息

docker inspect my-net

[
    {
        "Name": "my-net",
        "Id": "eaeb9efaf1fe290ec90b6f8e79b1ae76f14bb8048f03511ff28946eb1aa666e7",
        "Created": "2019-04-24T09:21:04.123600659-07:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "172.18.0.0/16",
                    "Gateway": "172.18.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {},
        "Options": {},
        "Labels": {}
    }
]

2.三、建立容器时链接容器到自定义桥接网络,经过--network参数指定

[root@node1 docker-img]# docker container run --name myweb --network my-net -it --rm busybox:latest
/ # ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue 
    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
200: eth0@if201: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue 
    link/ether 02:42:ac:12:00:02 brd ff:ff:ff:ff:ff:ff
    inet 172.18.0.2/16 brd 172.18.255.255 scope global eth0
       valid_lft forever preferred_lft forever

2.四、容器运行是加入自定义桥接网络

docker container run --name myweb -it --rm busybox:latest
docker network connect my-net myweb 

myweb上查看是否链接自定义桥接网络
/ # ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue 
    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
202: eth0@if203: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue 
    link/ether 02:42:0a:00:00:02 brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.2/24 brd 10.0.0.255 scope global eth0
       valid_lft forever preferred_lft forever
204: eth1@if205: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue 
    link/ether 02:42:ac:12:00:02 brd ff:ff:ff:ff:ff:ff
    inet 172.18.0.2/16 brd 172.18.255.255 scope global eth1
       valid_lft forever preferred_lft forever

2.五、断开自定义桥接网络

docker network disconnect my-net myweb

三、自定义桥接网络与默认桥接网络的区别

• 用户定义的桥接网络提供自动DNS解析,默认桥接网络只能经过IP地址通讯

• 容器能够动态链接并与用户定义的网络分离,在容器的生存期内, 您能够动态地将其与用户定义的网络链接或断开。若要从默认桥接网络中删除容器, 须要中止该容器, 而后使用不一样的网络选项从新建立它。

• 用户自定义的桥接网络可根据容器的功能分别配置用户自定义的桥接网络能够选择启用或停用IPv6,而默认桥接网络在docker支持配置IPv6的状况下,默认桥接网络会自动为 IPv6 配置,而不能禁用。

Ps:由于默认的桥接网络在功能上不如自定义桥接网络完善,且存在设计缺陷,Docker 官方不建议在生产环境使用此种网络

2、Docker host network

Docker 容器使用主机网络,则该容器的网络堆栈不会与 Docker 主机隔离。例如, 若是运行绑定到端口80的容器并使用主机网络, 则该容器的应用程序将在主机 ip 地址上的端口80上可用。主机网络仅适用于Linux主机。
容器加入主机网络

[root@node ~]# docker container run --name b2 --network host -it --rm busybox:latest 
/ # echo "hello docker" > /tmp/index.html
/ # httpd -h /tmp/

宿主机访问
[root@node ~]# curl 127.0.0.1
hello docker

3、Docker none network

不参与网络通讯,运行于此类容器中的进程仅能访问本地环回接口,仅适用于进程无须网络通讯的场景中,例如备份、进程诊断及各类离线任务等
建立封闭式容器

[root@node ~]# docker container run --name br-net1 -it --network none --rm busybox:latest
/ # ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue 
    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

参考文章:
docker docs:https://docs.docker.com/network/

相关文章
相关标签/搜索