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