從Linux的network namespace開始,經過詳細講解Docker的內置網絡host和bridge是怎麼使用的,來給你們展現不一樣容器之間網絡的隔離和互訪是如何實現的。固然好包括一個高級話題:Docker的多機通訊和Overlay網絡介紹html
docker bridge network是怎麼映射到主機IP地址上網的呢?經過本機 ip a
命令咱們能夠看到以下內容: 其中docker0 的networkspace是本機,veth26d281@if13有本身的networkspace,同時也是docker0網卡的一個接口。linux
docker exec test1 ip a
進入查看dokcer容器的ip network,其中
eth0@if14和
veth26d281@if13是一對,
brctl show
能夠看到它們之間的關聯關係,由於
veth26d281是docker0的一個接口,又由於上面的
eth0@if14和
veth26d281@if13是一對,,因此能夠經過這個接口轉換成本機宿主的ip去訪問Internt
咱們在使用Docker的時候,常常可能須要鏈接到其餘的容器,好比:web服務須要鏈接數據庫。按照往常的作法,須要先啓動數據庫的容器,映射出端口來,而後配置好客戶端的容器,再去訪問。其實針對這種場景,Docker提供了--link 參數來知足。nginx
docker run -d --name test2 --link test1 busybox
複製代碼
更多link內容參考git
在啓動容器時,若是不配置宿主機器與虛擬機的端口映射,外部程序是沒法訪問虛擬機的,由於沒有端口。 端口映射的指令是github
docker run -p ip:hostPort:containerPort redis
複製代碼
使用-p參數會分配宿主機的端口映射到虛擬機。
IP表示主機的IP地址。
hostPort表示宿主機的端口。
containerPort表示虛擬機的端口 。web
咱們在使用docker run建立Docker容器時,能夠用--net選項指定容器的網絡模式,Docker有如下4種網絡模式:redis
下面分別介紹一下Docker的各個網絡模式:docker
host模式
衆所周知,Docker使用了Linux的Namespaces技術來進行資源隔離,如PID Namespace隔離進程,Mount Namespace隔離文件系統,Network Namespace隔離網絡等。一個Network Namespace提供了一份獨立的網絡環境,包括網卡、路由、Iptable規則等都與其餘的Network Namespace隔離。一個Docker容器通常會分配一個獨立的Network Namespace。但若是啓動容器的時候使用host模式,那麼這個容器將不會得到一個獨立的Network Namespace,而是和宿主機共用一個Network Namespace。容器將不會虛擬出本身的網卡,配置本身的IP等,而是使用宿主機的IP和端口。數據庫
例如,咱們在10.10.101.105/24的機器上用host模式啓動一個含有web應用的Docker容器,監聽tcp80端口。當咱們在容器中執行任何相似ifconfig命令查看網絡環境時,看到的都是宿主機上的信息。而外界訪問容器中的應用,則直接使用10.10.101.105:80便可,不用任何NAT轉換,就如直接跑在宿主機中同樣。可是,容器的其餘方面,如文件系統、進程列表等仍是和宿主機隔離的。flask
container模式
在理解了host模式後,這個模式也就好理解了。這個模式指定新建立的容器和已經存在的一個容器共享一個Network Namespace,而不是和宿主機共享。新建立的容器不會建立本身的網卡,配置本身的IP,而是和一個指定的容器共享IP、端口範圍等。一樣,兩個容器除了網絡方面,其餘的如文件系統、進程列表等仍是隔離的。兩個容器的進程能夠經過lo網卡設備通訊。
none模式
這個模式和前兩個不一樣。在這種模式下,Docker容器擁有本身的Network Namespace,可是,並不爲Docker容器進行任何網絡配置。也就是說,這個Docker容器沒有網卡、IP、路由等信息。須要咱們本身爲Docker容器添加網卡、配置IP等。
bridge模式
bridge模式是Docker默認的網絡設置,此模式會爲每個容器分配Network Namespace、設置IP等,並將一個主機上的Docker容器鏈接到一個虛擬網橋上。下面着重介紹一下此模式。
使用VXLAN實現docker的多機通訊,一種網絡虛似化技術
overlay-networks
Docker網絡——單host網絡
當前機器上docker有哪些網絡
docker network ls
#查看指定的網絡詳情
docker network inspect [networkId]
docker run -d --name test2 --link test1 busybox
docker network create -d bridge my-bridge
docker run -d --name test3 --network my-bridge busybox
docker network connect my-bridge test2
docker run --name web -d nginx
docker network inspect bridge
docker run --name nginx -d -p 80:80 nginx
docker run -p ip:hostPort:containerPort redis
##-e 設置環境變量
docker run -d --link redis --name flask-redis -e REDIS_HOST=redis [image]
#實時查看docker容器日誌
$ sudo docker logs -f -t --tail #行數 容器名
docker network create -d overlay demo
#實時查看docker容器名爲s12的最後10行日誌
$ sudo docker logs -f -t --tail 10 s12
docker network ls
複製代碼