一、Docker 網路實現原理
Docker使用Linux橋接,在宿主機虛擬一個Docker容器網橋(docker0),Docker啟動一個容器時會根據Docker網橋的網段分配給容器一個IP地址,稱為Container-IP,同時Docker網橋是每個容器的預設閘道器。
在同一宿主機內的容器都接入同一個網橋,這樣容器之間就能夠透過容器的 Container-IP 直接通訊。
Docker網橋是宿主機虛擬出來的,並不是真實存在的網路裝置,外部網路是無法定址到的,這也意味著外部網路無法直接透過 Container-IP 訪問到容器。
如果容器希望外部訪問能夠訪問到,可以透過對映容器埠到宿主主機(埠對映),即 docker run 建立容器時候透過 -p 或 -P 引數來啟用,訪問容器的時候就透過[宿主機IP]:[容器埠]訪問容器。
#檢視預設的網路模式
docker network list
1.host模式
容器和宿主機共享網路名稱空間,即容器和宿主機使用同一個IP、埠範圍(容器與宿主機/同模式的容器不可以相同的埠號)、路由、iptables規則等
docker run --network=host
2.container模式
和指定且已存在的容器共享網路名稱空間,即兩個使用同一個IP、埠範圍(容器與宿主機/同模式的容器不可以相同的埠號)、路由、iptables規則等
docker run --network=container:指定的容器ID|容器名
3.none模式
每個容器都有獨立的網路名稱空間,但是容器沒有eth0網路卡、IP、埠等,只有lo網路卡。
docker run --network=none
4.bridge模式
docker的預設網路模式。
此模式的每個容器都要獨立的網路名稱空間,即每個容器都有獨立的IP、埠範圍(每個容器可以相同的埠號)、路由、iptables規則等。
docker run [--network=bridge]
5.自定義網路
可以自定義建立一個網段、網橋、網路模式,從而可自定義容器IP來建立容器
docker network create --subnet 新網段 --opt "com.docker.network.bridge.name"="新網橋名" 新網路模式名 docker run --network 新網路模式名 --ip 自定義IP
三、Docker網路通訊
1.埠對映
在啟動容器的時候,如果不指定對應的埠,在容器外是無法透過網路來訪問容器內的服務。
埠對映機制將容器內的服務提供給外部網路訪問,實質上就是將宿主機的埠對映到容器中,使得外部網路訪問宿主機的埠便可訪問容器內的服務。
docker run -d -P #使用從32768開始的隨機埠對映容器
docker run -p 宿主機埠:容器端點 #指定宿主機埠對映容器
docker run -d --name test1 -P nginx #隨機對映埠(從32768開始) docker run -d --name test2 -p 43000:80 nginx #指定對映埠 docker ps -a
2.容器互聯
容器互聯是透過容器的名稱在容器間建立一條專門的網路通訊隧道。
簡單點說,就是會在源容器和接收容器之間建立一條隧道,接收容器可以看到源容器指定的資訊。
#建立並執行源容器取名web1 docker run -itd -P --name web1 centos:7 /bin/bash #建立並執行接收容器取名web2,使用--link選項指定連線容器以實現容器互聯 docker run -itd -P --name web2 --link web1:web1 centos:7 /bin/bash #--link 容器名:連線的別名
# --link web1:web1
web1是指定的目標容器的名稱或別名。
web1是目標容器中可以使用的別名,在web2容器中可以透過這個別名訪問web1容器。
#進web2 容器, ping web1 docker exec -it web2 bash ping web1