docker深刻學習三

docker學習三:network

docker支持容器之間的網絡通訊,docker的網絡通訊方式有如下五種:linux

bridge docker 默認的網絡驅動,若是不指定網絡驅動,docker就會建立一個bridge bridge適用於同一docker主機上的容器通訊
overlay overlay支持不一樣daemon下的容器之間和集羣服務之間的相互通訊 overlay適用於不一樣主機的容器之間的通訊,或者集羣服務中的多個應用程序協調工做
host host消除了獨立容器與主機之間的網絡隔離,container直接使用主機的網絡 host適用於須要隔離容器除網絡之外的其餘部分的狀況
macvlan macvlan容許用戶爲容器分配MAC地址,daemon能夠將流量經過容器MAC地址之間路由到容器而不須要通過docker host的網絡棧 macvlan適用於從虛擬機配置移植或者須要讓容器表現爲一臺包含mac地址的物理機的狀況
none none禁止容器的全部網絡,其通常和用戶自定義網絡驅動一塊兒使用,集羣服務不支持none

bridge

docker bridge與通常的網橋功能相似,可以讓同一網橋下的容器相互通訊。
docker提供默認bridge,若不指定容器的驅動,則自動將容器關聯到默認bridge中。 官方推薦用戶自定義bridge而不是使用默認bridgenginx

自定義bridge和默認bridge的區別

自定義bridge 默認bridge
隔離性和鏈接性 位於同一bridge的容器之間暴露自身全部的端口,容器端口默認對外界關閉,須要使用-p--publish開啓 須要手動打開端口,同時須要經過docker外的方式控制外界對端口的訪問
容器以前的DNS服務 支持自動DNS解析,能夠經過容器別名訪問容器 容器之間只能經過ip地址訪問或者爲通訊兩端的容器分別使用--link選項
熱插拔 支持在運行過程當中斷開或鏈接自定義bridge 容器與默認網橋斷開時,須要關閉容器並使用新配置重建容器
全局配置 每一個自定義bridge可使用docker命令單獨配置 對默認bridge的配置會影響到全部使用默認bridge的容器,且配置默認bridge須要使用docker外的命令
共享環境變量 自定義bridge沒法直接共享環境變量,但能夠經過
掛載卷或者目錄
使用compos聲明共享變量
使用集羣服務代替獨立容器,經過配置共享變量
使用--link flag共享環境變量

配置自定義bridge

建立和刪除bridge的命令以下:docker

docker network create my-net
docker network rm my-net

建立bridge時能夠配置bridge的子網範圍、網關和其餘選項,具體的配置參數可使用docker network --help或者查看官方文檔bash

鏈接bridge

能夠在建立容器的同時鏈接bridge,如:網絡

$ docker create --name my-nginx \
  --network my-net \
  --publish 8080:80 \
  nginx:latest

  $ docker container ls -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                    PORTS               NAMES
a716400c6714        nginx:latest        "nginx -g 'daemon of…"   7 minutes ago       Created                                       my-nginx

上面建立了一個容器my-nginx,同時將容器鏈接到my-net 網橋並將8080端口暴露出來供外界訪問。
鏈接已存在的容器和bridge時可使用如下命令分佈式

$ docker network connect my-net my-nginx

取消鏈接可使用如下命令oop

$ docker network disconnect my-net my-nginx

overlay

overlay在多個docker主機上面建立一個分佈式網絡,該網絡位於各個主機的具體網絡之上,容許容器鏈接該網絡進行通訊。
當建立一個集羣或者將docker主機加入到集羣時,docker主機會建立兩個網絡:學習

  1. ingress:是一個overlay網絡,用於處理和集羣控制有關的命令和數據流量,若是建立集羣時沒有指定自定義overlay網絡,集羣默認鏈接到ingress
  2. docker_gwbridge:一個 bridge網絡,用於鏈接集羣中各個daemon守護進程

建立overlay

建立overlay的命令與bridge基本一致,但建立overlay的命令必須在位於集羣中的主機執行,使用命令docker swarm initdocker swarm join將主機加入到集羣中code

$ docker network create -d overlay my-overlay

host

使用host網絡至關於容器和主機共享一個網絡,docker不會爲容器分配ip地址,訪問容器端口的方式改成直接訪問主機對應的端口,-p-P等端口相關的指令會被忽略。
host網絡只在linux下工做,不提供對mac和Windows的支持接口

macvlan

某些應用程序,尤爲是後臺應用程序或監視網絡流量的應用程序,但願直接鏈接到物理網絡。在這種狀況下,您可使用macvlan網絡驅動程序爲每一個容器的虛擬網絡接口分配MAC地址,使其看起來像是直接鏈接到物理網絡的物理網絡接口。在這種狀況下,您須要在Docker主機上指定一個物理接口,用於macvlan,以及macvlan的子網和網關。您甚至可使用不一樣的物理網絡接口隔離您的macvlan網絡。但須要記住如下事項:

  • 因爲IP地址耗盡或「VLAN傳播」,很容易無心中損壞您的網絡,在這種狀況下,網絡中存在大量不合適的MAC地址。
  • 您的網絡設備須要可以處理「混雜模式」,其中一個物理接口能夠分配多個MAC地址。
  • 若是您的應用程序可使用bridge(在單個Docker主機上)或overlay(跨多個Docker主機進行通訊),那麼從長遠來看,這些解決方案可能會更好。

none:關閉容器的網絡

使用--network none能夠關閉容器內的網絡棧,在容器內只剩下迴環地址。

$ docker run --rm -dit \
  --network none \
  --name no-net-alpine \
  alpine:latest \
  ash

查看容器內部網絡,裏面只含有迴環地址

$ docker exec no-net-alpine ip link show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
相關文章
相關標籤/搜索