Docker 有 4 种基本的网络模型:nginx
Docker daemon 在启动时会建立一个虚拟网桥 docker0 默认地址为 172.17.0.1/16 ,容器启动后会被桥接到 docker0 上,并自动分配到一个 IP 地址。docker
Docker 在启动容器时,默认采用的是 bridge 桥接模式,能够经过 -net 进行指定。json
如下是 Docker 网络初始化过程:vim
Bridge 桥接模式的实现逻辑以下:bash
Bridge 桥接模式的实现步骤主要以下:网络
优点:socket
保证宿主机的网络报文若发往 veth0,则当即会被 eth0 接收,实现宿主机到Docker Container 网络的联通性,同时,也保证 Docker Container 单独使用 eth0,实现容器网络环境的隔离性。tcp
劣势:oop
该模式下 Docker Container 不具备一个公有 IP,即和宿主机的 eth0 不处于同一个网段。致使的结果是宿主机之外的世界不能直接和容器进行通讯。虽然 NAT 模式通过中间处理实现了这一点,可是 NAT 模式仍然存在问题与不便,如:容器均须要在宿主机上竞争端口,容器内部服务的访问者须要使用服务发现获知服务的外部端口等。另外,NAT 模式因为是在三层网络上的实现手段,故确定会影响网络的传输效率。
spa
查看 docker0 网桥信息:
建立一个容器
再次查看 桥接设备
网络逻辑分析:
Host 网络模型实现逻辑以下:
优点:
host 模式是 bridge 桥接模式很好的补充。采用 host 模式的 docker container,能够直接使用宿主机的 IP 地址和外界通讯,若宿主机的 eth0 是一个公网IP ,那么容器也拥有这个公网 IP
同时容器内服务的端口也可使用宿主机的端口,无需额外进行 NAT 转换。
劣势:
使用 host 模式的 docker container 虽然可让容器内部的服务和传统状况无差异、无改造的使用,可是因为网络隔离性的弱化,该容器会与宿主机共享竞争网络栈的使用;
容器内部将再也不拥有全部的端口资源,缘由是部分端口资源已经被宿主机自己的服务占用,还有部分端口已经用以 bridge 网络模式容器的端口映射。
要建立 host 模式的容器,使用 --net host 指定:
能够看到,建立后的容器和宿主机共享网络资源。
Container 网络模型实现逻辑以下:
说白了,就是两个容器共享网络等资源。
优点:
能够用来更好的服务用于容器间通讯,能够经过 localhost 来访问其余容器,传输效率高。虽然多个容器共享网络环境,可是多个容器造成的总体依然与宿主机以及其余容器造成网络隔离。
劣势:
并无改善容器与宿主机之外世界通讯的状况。
要建立 Container 模式的容器,使用 --net container:mv1 指定:
在 Container 网络模式中,两个容器是共享网络资源。
None 网络模型实现逻辑以下:
网络环境为 none,即不为容器提供任何的网络环境。一旦容器采用了none 网络模式,那么容器内部就只能使用 loopback 网络设备,不会再有其余的网络资源。
要建立 none 模式的容器,使用 --net none 指定:
在 none 网络环境中,只有本地回环地址。
docker 守护进程默认以 socket 方式,/var/run/docker.sock, 也可开启 ip:port 方式。
Docker 版本信息
编辑 /etc/docker/daemon.json 文件添加:
[root@192.168.118.14 ~]#vim /etc/docker/daemon.json
{ "registry-mirrors": ["https://registry.docker-cn.com","http://hub-mirror.c.163.com"], "hosts": ["tcp://192.168.118.14:2375", "unix:///var/run/docker.sock"] # 添加监听端口和 sock 监听 } [root@192.168.118.14 ~]#systemctl restart docker [root@192.168.118.14 ~]#netstat -ntplu | egrep docker tcp 0 0 192.168.118.14:2375 0.0.0.0:* LISTEN 17309/dockerd
客户端经过 ip:port 方式访问:
在docker守护进程启动后,docker0的模式地址:172.17.0.1/16
能够经过在 /etc/docker/daemon.json 中修改默认地址:
[root@192.168.118.14 ~]#ip addr show docker0 3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default link/ether 02:42:df:37:b9:38 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:dfff:fe37:b938/64 scope link valid_lft forever preferred_lft forever [root@192.168.118.14 ~]#vim /etc/docker/daemon.json { "registry-mirrors": ["https://registry.docker-cn.com","http://hub-mirror.c.163.com"], "hosts": ["tcp://192.168.118.14:2375", "unix:///var/run/docker.sock"], "bip": "10.0.10.1/24" # 设置 docker0 网络ip } # 修改完毕重启 docker 服务生效 [root@192.168.118.14 ~]#systemctl restart docker [root@192.168.118.14 ~]#ip addr show docker0 3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default link/ether 02:42:df:37:b9:38 brd ff:ff:ff:ff:ff:ff inet 10.0.10.1/24 brd 10.0.10.255 scope global docker0 valid_lft forever preferred_lft forever inet6 fe80::42:dfff:fe37:b938/64 scope link valid_lft forever preferred_lft forever
docker run [-P|-p] -P: 将为容器暴露的全部端口进行映射:docker run -P nginx -p: 指定映射容器的端口:docker run -p 80 nginx
访问宿主机的映射端口:
docker run --name ngx_1 --rm -P -d nginx:alpine --> 宿主机的端口将是随机映射
docker run --name ngx_1 --rm -p 8080:80 -d nginx:alpine --> 11对应的映射,将容器的80端口映射到宿主机的 8080 端口 能够绑定IP地址: docker run --name ngx_1 --rm -p 192.168.118.14:8080:80 -d nginx:alpine