从零开始学docker(三)

  1. 网络
    1. 容器网络
      1. Host主机
      2. bridge桥接

网络

网络驱动汇总 描述
none 无网络
bridge 桥接 多个容器之间通过桥接网络交互
Host 主机网络 容器应用使用主机的网络
overlay 叠加网络 应用在多台机器之间通过叠加网络交互
ipvlan 虚拟ip
macvlan Mac的虚拟ip网络
Third-party network plugins 三方网络插件

容器网络

2个容器之间共享同一个网络 ip 端口等,除去网络外其他的2个容器之间是相互隔离的 比如文件系统 主机名等

container.png

docker container run -d  --name mynginx1 -P nginx
95132de6a078
docker container run -d --network container:95132de6a078  --name myredis -P  redis

CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                                     NAMES
5eff2b7c0866   redis     "docker-entrypoint.s…"   14 seconds ago   Up 13 seconds                                             myredis
95132de6a078   nginx     "/docker-entrypoint.…"   22 minutes ago   Up 22 minutes   0.0.0.0:32768->80/tcp, :::32768->80/tcp   mynginx

docker inspect 5eff2b7c0866

[
    {
        "Id": "5eff2b7c0866749c28eeba80453fe163fdc9de6b3702084cd5b561346fdf606d",
        ...
        "HostConfig": {
             ...
            "NetworkMode": "container:95132de6a0783684dd208328247f96194609d7ebec58465271f7b36906f786d0",
            ...
        },
        ...
        "NetworkSettings": {
            "Bridge": "",
            "SandboxID": "",
            "HairpinMode": false,
            "LinkLocalIPv6Address": "",
            "LinkLocalIPv6PrefixLen": 0,
            "Ports": {},
            "SandboxKey": "",
            "SecondaryIPAddresses": null,
            "SecondaryIPv6Addresses": null,
            "EndpointID": "",
            "Gateway": "",
            "GlobalIPv6Address": "",
            "GlobalIPv6PrefixLen": 0,
            "IPAddress": "",
            "IPPrefixLen": 0,
            "IPv6Gateway": "",
            "MacAddress": "",
            "Networks": {}
        }
    }
]

*Note 容器模式下不允许指定端口等信息 这些全部由绑定的那个容器的网络决定,否则会错误 docker: Error response from daemon: conflicting options: port publishing and the container type network mode.


Host主机


容器启动共享主机网络,但其他仍然是隔离的,比如文件系统等. 使用主机网络时-p,–publish -P,–publish-all 这些参数会被忽略,容器使用的端口会占用主机端口

host.png

bridge桥接


docker规定允许容器连接到同一个桥接网络上,连接到不同桥接网络的不能进行交互,docker启动后会在宿主机上默认创建一个名为docker0的虚拟桥接网络(可以理解为交换机)默认情况下 多个启动的容器都是通过docker0连接 相互可以访问。运行一个容器时会在容器中和容器外虚拟出一对网卡 一端连接到容器中一段连接到虚拟网桥上。docker0会为容器分配ip 构成以docker0为网桥的二层网络

bridge.png


# 创建2个容器在同一个网桥上(未指定时默认docker0)容器之间可通过主机名相互访问
docker container run --name nginx2 --rm -d -p 9091:80 nginx
docker container run --name nginx1 --rm -d -p 9092:80 nginx
#不同网络之间相互访问 一个在docker0 桥 一个在docker1

docker container run --name nginx1 --rm -d -p 9091:80 --network docker0 nginx
docker container run --name nginx2 --rm -d -p 9092:80 --network docker1 nginx
docker network connect docker1 nginx1
docker network connect docker0 nginx2

通过daemon.json的配置可以修改默认docker0网桥的网络信息


{
    "bip" : "192.168.2.1/24",
    "fixed-cidr" : "10.20.0.0/16",
    "fixed-cidr-v6" : "2001:db8::/64",
    "mtu" : "1500",
    "default-getway" : "192.168.2.1",
    "default-getway-v6" : "2001:db8:abcd::89",
    "dns" : ["8.8.8.8","1.1.1.1"]
}