1. 程式人生 > >docker學習——docker的bridge網路

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,並且通過  
    secrets
     和 configs  (這兩個還沒看)實現環境變數共享

使用自定義網路   

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指令)進行通訊,關於橋接網路的一點解釋(摘自這裡):