docker學習——docker的bridge網路
目錄
bridge網路
docker的橋接網路使用虛擬網橋,bridge網路用於同一主機上的docker容器相互通訊,連線到同一個網橋的docker容器可以相互通訊,當我們啟動docke時,會自動建立一個預設bridge網路,除非我們進行另外的配置,新建立的容器都會自動連線到這個網路,我們也可以自定義自己的bridge網路,docker文件建議使用自定義bridge網路,預設的bridge網路具有一定的缺陷
連線到同一bridge網路的容器可以相互訪問彼此任意一個埠,如果不釋出埠,外界將無法訪問這些容器,在建立容器時,通過-p或是--publish指令釋出埠
自定義bridge網路與預設bridge網路對比:
- 預設橋接網路中的容器只能通過IP地址訪問其他容器(除非使用遺留的-link指令連線兩個容器),而自定義橋接網路提供DNS解析,可以通過容器的名字或是別名訪問其他容器
- 容器可以自由的進入或是退出自定義橋接網路,如果想要退出預設橋接網路,需要先停止容器的執行,然後重新建立該容器,並指定需要連線的其他網路
- 如果更改了預設橋接網路的網路配置,需要重新啟動docker,並且由於預設橋接網路只有一個,因此所有容器的網路配置都是一樣的,而使用者自定義網路可以在建立時指定網路配置(例如預設閘道器、MTU等),不需要重啟docker,靈活性更高
- 在預設橋接網路中,可以通過--link引數連線兩個容器來共享環境變數,使用者自定義網路中無法使用這種方式,但是docker提供了更好的方式: 1、多個容器可以使用docker volume(這是docker儲存資料的一種方式,以後會介紹)掛載到同一個檔案,在檔案中指明環境變數,從而實現所容器的環境變數共享 2、多個容器可以使用同一個docker-compose(與docker service有關)檔案啟動 ,可以在該檔案中定義共享環境變數 3、可以使用swarm services,並且通過
使用自定義網路
1、建立一個自定義網路:
$ docker network create my-net
可以指定子網、IP地址範圍、閘道器等網路配置,更多請檢視: docker network create ,移除自定義網路:
$ docker network rm my-net
移除自定義網路前先移除該網路上的所有容器
2、連線容器到自定義網路:
$ docker create --name my-nginx \ --network my-net \ --publish 8080:80 \ nginx:latest
上述命令依據nginx映象例項化一個容器,通過--network加入到使用者自定義網路my-net中,同時釋出了埠80到本地主機的8080埠,可以使用docker network connect指令將執行的容器加入到對應的網路:
$ docker network connect my-net my-nginx
3、離開使用者自定義網路:
使用docker network disconnect命令
$ docker network disconnect my-net my-nginx
使用IPv6
如果想要在容器中使用IPv6,首先要更改docker系統程序的配置,使其支援IPv6,請看這裡: enable the option
在建立自定義網路時,通過--ipv6引數指定開啟IPv6
啟用從Docker容器到外部世界的轉發
預設情況下,連線到預設橋接網路的容器的資料報不會被轉發到外部。要啟用轉發,需要更改兩個設定。這些不是Docker命令,它們會影響Docker主機的核心。
1、設定linux核心允許IP轉發:
$ sysctl net.ipv4.conf.all.forwarding=1
2、將iptables FORWARD 的值更從DROP更改為ACCEPT:
$ sudo iptables -P FORWARD ACCEPT
這幾個配置不會持久化,每次重啟都需要重新配置,所以需要將它們新增到start-up script
文件中並未介紹使用者自定義網路能否轉發資料報到外部,我覺得預設情況下也是不能的,也需要做出上述配置
使用預設橋接網路
要點:
1、將容器連線到預設橋接網路:執行docker run指令時,未指定--network引數,則連線到預設橋接網路
2、配置預設橋接網路的方式:更改/etc/docker/daemon.json的內容即可,文件給出的例子如下:
{
"bip": "192.168.1.5/24",
"fixed-cidr": "192.168.1.5/25",
"fixed-cidr-v6": "2001:db8::/64",
"mtu": 1500,
"default-gateway": "10.20.1.1",
"default-gateway-v6": "2001:db8:abcd::89",
"dns": ["10.20.1.2","10.20.1.3"]
}
3、如果我們開啟了docker系統程序的IPv6支援,預設橋接網路也會預設開啟IPv6支援,而且不能關閉,自定義網路可以通過是否指定--ipv6來決定是否開啟IPv6
預設橋接網路的更多細節
容器通過本地主機進行上網,本地主機上會建立名為docker0的虛擬網橋,容器會建立名為veth的虛擬網絡卡,網絡卡一端連線到docker0網橋,另一端連線容器,容器就可以通過網橋進行上網,容器可以通過分配的IP地址(通過docker inspect 指令可以檢視)或是名字(需要使用link指令)進行通訊,關於橋接網路的一點解釋(摘自這裡):