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 |
docker bridge與通常的網橋功能相似,可以讓同一網橋下的容器相互通訊。
docker提供默認bridge,若不指定容器的驅動,則自動將容器關聯到默認bridge中。 官方推薦用戶自定義bridge而不是使用默認bridgenginx
自定義bridge | 默認bridge | |
---|---|---|
隔離性和鏈接性 | 位於同一bridge的容器之間暴露自身全部的端口,容器端口默認對外界關閉,須要使用-p 或--publish 開啓 |
須要手動打開端口,同時須要經過docker外的方式控制外界對端口的訪問 |
容器以前的DNS服務 | 支持自動DNS解析,能夠經過容器別名訪問容器 | 容器之間只能經過ip地址訪問或者爲通訊兩端的容器分別使用--link 選項 |
熱插拔 | 支持在運行過程當中斷開或鏈接自定義bridge | 容器與默認網橋斷開時,須要關閉容器並使用新配置重建容器 |
全局配置 | 每一個自定義bridge可使用docker命令單獨配置 | 對默認bridge的配置會影響到全部使用默認bridge的容器,且配置默認bridge須要使用docker外的命令 |
共享環境變量 | 自定義bridge沒法直接共享環境變量,但能夠經過 掛載卷或者目錄 使用compos聲明共享變量 使用集羣服務代替獨立容器,經過配置共享變量 |
使用--link flag共享環境變量 |
建立和刪除bridge的命令以下:docker
docker network create my-net docker network rm my-net
建立bridge時能夠配置bridge的子網範圍、網關和其餘選項,具體的配置參數可使用docker network --help
或者查看官方文檔bash
能夠在建立容器的同時鏈接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在多個docker主機上面建立一個分佈式網絡,該網絡位於各個主機的具體網絡之上,容許容器鏈接該網絡進行通訊。
當建立一個集羣或者將docker主機加入到集羣時,docker主機會建立兩個網絡:學習
ingress
:是一個overlay網絡,用於處理和集羣控制有關的命令和數據流量,若是建立集羣時沒有指定自定義overlay網絡,集羣默認鏈接到ingress
docker_gwbridge
:一個 bridge網絡,用於鏈接集羣中各個daemon守護進程建立overlay的命令與bridge基本一致,但建立overlay的命令必須在位於集羣中的主機執行,使用命令docker swarm init
或 docker swarm join
將主機加入到集羣中code
$ docker network create -d overlay my-overlay
使用host網絡至關於容器和主機共享一個網絡,docker不會爲容器分配ip地址,訪問容器端口的方式改成直接訪問主機對應的端口,-p
、-P
等端口相關的指令會被忽略。
host網絡只在linux下工做,不提供對mac和Windows的支持接口
某些應用程序,尤爲是後臺應用程序或監視網絡流量的應用程序,但願直接鏈接到物理網絡。在這種狀況下,您可使用macvlan網絡驅動程序爲每一個容器的虛擬網絡接口分配MAC地址,使其看起來像是直接鏈接到物理網絡的物理網絡接口。在這種狀況下,您須要在Docker主機上指定一個物理接口,用於macvlan,以及macvlan的子網和網關。您甚至可使用不一樣的物理網絡接口隔離您的macvlan網絡。但須要記住如下事項:
使用--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