Docker bridge
docker bridge network是怎么映射到主機IP地址上網(wǎng)的呢?通過本機 ip a命令我們可以看到如下內(nèi)容:
其中docker0 的networkspace是本機舰涌,veth26d281@if13有自己的networkspace,同時也是docker0網(wǎng)卡的一個接口蠢古。
通過docker exec test1 ip a 進(jìn)入查看dokcer容器的ip network水由,其中eth0@if14和veth26d281@if13是一對,
通過brctl show 可以看到它們之間的關(guān)聯(lián)關(guān)系挥吵,因為veth26d281是docker0的一個接口,又因為上面的eth0@if14和veth26d281@if13是一對花椭,忽匈,所以可以通過這個接口轉(zhuǎn)換成本機宿主的ip去訪問Internt
容器之間的link
我們在使用Docker的時候,經(jīng)掣龃樱可能需要連接到其他的容器脉幢,比如:web服務(wù)需要連接數(shù)據(jù)庫。按照往常的做法嗦锐,需要先啟動數(shù)據(jù)庫的容器嫌松,映射出端口來,然后配置好客戶端的容器奕污,再去訪問萎羔。其實針對這種場景,Docker提供了--link 參數(shù)來滿足碳默。
docker run -d --name test2 --link test1 busybox
容器的端口映射
在啟動容器時贾陷,如果不配置宿主機器與虛擬機的端口映射,外部程序是無法訪問虛擬機的嘱根,因為沒有端口髓废。
端口映射的指令是docker run -p ip:hostPort:containerPort redis
使用-p參數(shù)會分配宿主機的端口映射到虛擬機。
IP表示主機的IP地址该抒。
hostPort表示宿主機的端口慌洪。
containerPort表示虛擬機的端口 。
容器的4種網(wǎng)絡(luò)模式。
我們在使用docker run創(chuàng)建Docker容器時冈爹,可以用--net選項指定容器的網(wǎng)絡(luò)模式涌攻,Docker有以下4種網(wǎng)絡(luò)模式:
- host模式,使用--net=host指定频伤。
- container模式恳谎,使用--net=container:NAME_or_ID指定。
- none模式憋肖,使用--net=none指定因痛。
- bridge模式,使用--net=bridge指定瞬哼,默認(rèn)設(shè)置婚肆。
下面分別介紹一下Docker的各個網(wǎng)絡(luò)模式:
- host模式
眾所周知,Docker使用了Linux的Namespaces技術(shù)來進(jìn)行資源隔離坐慰,如PID Namespace隔離進(jìn)程,Mount Namespace隔離文件系統(tǒng)用僧,Network Namespace隔離網(wǎng)絡(luò)等结胀。一個Network Namespace提供了一份獨立的網(wǎng)絡(luò)環(huán)境,包括網(wǎng)卡责循、路由糟港、Iptable規(guī)則等都與其他的Network Namespace隔離。一個Docker容器一般會分配一個獨立的Network Namespace院仿。但如果啟動容器的時候使用host模式秸抚,那么這個容器將不會獲得一個獨立的Network Namespace,而是和宿主機共用一個Network Namespace歹垫。容器將不會虛擬出自己的網(wǎng)卡剥汤,配置自己的IP等,而是使用宿主機的IP和端口排惨。
例如吭敢,我們在10.10.101.105/24的機器上用host模式啟動一個含有web應(yīng)用的Docker容器,監(jiān)聽tcp80端口暮芭。當(dāng)我們在容器中執(zhí)行任何類似ifconfig命令查看網(wǎng)絡(luò)環(huán)境時鹿驼,看到的都是宿主機上的信息。而外界訪問容器中的應(yīng)用辕宏,則直接使用10.10.101.105:80即可畜晰,不用任何NAT轉(zhuǎn)換,就如直接跑在宿主機中一樣瑞筐。但是凄鼻,容器的其他方面,如文件系統(tǒng)、進(jìn)程列表等還是和宿主機隔離的野宜。
- container模式
在理解了host模式后扫步,這個模式也就好理解了。這個模式指定新創(chuàng)建的容器和已經(jīng)存在的一個容器共享一個Network Namespace匈子,而不是和宿主機共享河胎。新創(chuàng)建的容器不會創(chuàng)建自己的網(wǎng)卡,配置自己的IP虎敦,而是和一個指定的容器共享IP游岳、端口范圍等。同樣其徙,兩個容器除了網(wǎng)絡(luò)方面胚迫,其他的如文件系統(tǒng)、進(jìn)程列表等還是隔離的唾那。兩個容器的進(jìn)程可以通過lo網(wǎng)卡設(shè)備通信访锻。
- none模式
這個模式和前兩個不同。在這種模式下闹获,Docker容器擁有自己的Network Namespace期犬,但是,并不為Docker容器進(jìn)行任何網(wǎng)絡(luò)配置避诽。也就是說龟虎,這個Docker容器沒有網(wǎng)卡、IP沙庐、路由等信息鲤妥。需要我們自己為Docker容器添加網(wǎng)卡、配置IP等拱雏。
- bridge模式
bridge模式是Docker默認(rèn)的網(wǎng)絡(luò)設(shè)置棉安,此模式會為每一個容器分配Network Namespace、設(shè)置IP等古涧,并將一個主機上的Docker容器連接到一個虛擬網(wǎng)橋上垂券。下面著重介紹一下此模式。
Overlay和Underlay的通俗解釋
- 跨主機網(wǎng)絡(luò)意味著將不同主機上的容器用同一個虛擬網(wǎng)絡(luò)連接起來羡滑。這個虛擬網(wǎng)絡(luò)的拓?fù)浣Y(jié)構(gòu)和實現(xiàn)技術(shù)就是網(wǎng)絡(luò)模型菇爪。
- Docker overlay 如名稱所示,是 overlay 網(wǎng)絡(luò)柒昏,建立主機間 VxLAN 隧道凳宙,原始數(shù)據(jù)包在發(fā)送端被封裝成 - - VxLAN 數(shù)據(jù)包,到達(dá)目的后在接收端解包职祷。
- Macvlan 網(wǎng)絡(luò)在二層上通過 VLAN 連接容器氏涩,在三層上依賴外部網(wǎng)關(guān)連接不同 macvlan届囚。數(shù)據(jù)包直接發(fā)送,不需要封裝是尖,屬于 underlay 網(wǎng)絡(luò)意系。
- Flannel 我們討論了兩種 backend:vxlan 和 host-gw。vxlan 與 Docker overlay 類似饺汹,屬于 overlay 網(wǎng)絡(luò)蛔添。host-gw 將主機作為網(wǎng)關(guān),依賴三層 IP 轉(zhuǎn)發(fā)兜辞,不需要像 vxlan 那樣對包進(jìn)行封裝迎瞧,屬于 underlay 網(wǎng)絡(luò)。
- Weave 是 VxLAN 實現(xiàn)逸吵,屬于 overlay 網(wǎng)絡(luò)凶硅。
Docker Overlay網(wǎng)絡(luò)和etcd實現(xiàn)多機容器通信
命令
當(dāng)前機器上docker有哪些網(wǎng)絡(luò)
docker network ls
#查看指定的網(wǎng)絡(luò)詳情
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 設(shè)置環(huán)境變量
docker run -d --link redis --name flask-redis -e REDIS_HOST=redis [image]
#實時查看docker容器日志
$ sudo docker logs -f -t --tail #行數(shù) 容器名
docker network create -d overlay demo
#實時查看docker容器名為s12的最后10行日志
$ sudo docker logs -f -t --tail 10 s12