docker網路
docker run建立Docker容器時,可以用–net選項指定容器的網路模式,Docker有以下4種網路模式:
Ø bridge模式:使--net =bridge指定,預設設定;
Ø host模式:使--net =host指定;
Ø none模式:使--net =none指定;
Ø container模式:使用--net =container:NAME orID指定。
參考:http://www.docker.org.cn/dockerppt/111.html
一:docker 容器的網路基礎
1.docker0:
linux的虛擬網橋
在OSI七層模型中的資料鏈路層
2.Linux虛擬網橋的特點:
可以設定ip地址
相當於擁有一個隱藏的虛擬網絡卡
docker0的地址劃分:
IP:172.17.42.1 子網掩碼:255.255.0.0
MAC:02:42:ac:11:00:00到02:42:ac:11:ff:ff
總共提供了65534個地址
通過veth*與容器通訊
3.安裝網橋管理工具:
yum install bridge-utils -y
brctl show 可以檢視到有一個docker0的網橋裝置,下面有很多介面,每個介面都表示一個啟動的docker容器,因為我在docker上啟動了很多容器,所以interfaces較多,如下所
4.修改docker0地址:
ifconfig docker0 192.168.200.1 netmask 255.255.255.0
然後重啟docker:
service docker restart
建立一個容器,進去之後ifconfig可以看見docker0的ip地址是我們剛才設定的了
5.新增虛擬網橋
brctl addbr br0
ifconfig br0 172.16.1.1 netmask 255.255.0.0(我的宿主機docker0地址是172.17.42.1)
更改docker守護程序的啟動配置(docker1.7按如下方式改):
/etc/sysconfig/docker 中新增
other_args="-b=br0"
重啟docker:service docker restart
ps -ef | grep docker 可以看見br0這個引數
docker run -it centos:6.9 /bin/bash
ifconfig可以看見ip地址是172.16.0.1
也就是說們啟動docker時,在/etc/sysconfig/docker裡修改other_args="-b=br0",在建立docker容器的時候,容器的ip就是172.16.*.*,也就是我們新建立的網橋
二:docker 容器的互聯(相互之間的訪問)
下面用到的映象的dockerfile檔案如下:
cd dockerfile/inter-image
vim dockerfile
FROM centos:7 RUN yum install epel-release -y RUN yum install nginx -y RUN sed -i "7s/^/#/g" /etc/nginx/conf.d/default.conf EXPOSE 80 CMD /bin/bash
docker build -t="inter-image" .
允許所有容器間互聯(也就是訪問)
第一種方法:
例:
(1)基於上面的inter-image映象啟動第一個容器test1
docker run --name test1 -it inter-image
進入到容器裡面啟動nginx:
/usr/sbin/ngnx
Ctrl +p,ctrl+q 退出
(2)基於上面的inter-image映象啟動第二個容器test2
docker run --name test2 -it inter-image
ctrl+p和ctrl+q退出容器
(3)進入到test1容器和test2容器,可以看兩個容器的ip,分別是
172.17.0.20和172.17.0.21
docker exec -it test2 /bin/bash
ping 172.17.0.20 可以看見能ping通test1容器的ip
curl http://172.17.0.20
可以訪問到test1容器的內容
上述方法假如test1容器重啟,那麼在啟動就會重新分配ip地址,所以為了使ip地址變了也可以訪問可以採用下面的方法
允許所有容器間互聯(也就是訪問)
第一種方法:
例:
(1)基於上面的inter-image映象啟動第一個容器test1
docker run --name test1 -it inter-image
進入到容器裡面啟動nginx:
/usr/sbin/ngnx
Ctrl +p,ctrl+q 退出
(2)基於上面的inter-image映象啟動第二個容器test2
docker run --name test2 -it inter-image
ctrl+p和ctrl+q退出容器
(3)進入到test1容器和test2容器,可以看兩個容器的ip,分別是
172.17.0.20和172.17.0.21
docker exec -it test2 /bin/bash
ping 172.17.0.20 可以看見能ping同test1容器的ip
curl http://172.17.0.20
可以訪問到test1容器的內容
上述方法假如test1容器重啟,那麼在啟動就會重新分配ip地址,所以為了使ip地址變了也可以訪問可以採用下面的方法
第二種方法:
可以給容器起一個代號,這樣可以直接以代號訪問,避免了容器重啟ip變化帶來的問題
--link
docker run --link=[CONTAINER_NAME]:[ALIAS] [IMAGE][COMMAND]
例:
1.啟動一個test3容器
docker run --name test3 -it inter-image /bin/bash
啟動nginx:
/usr/sbin/nginx
Ctrl+p和ctrl+q退出或者exit退出
2.啟動一個test5容器,--link做連結,那麼當我們重新啟動test3容器時,就算ip變了,也沒關係,我們可以在test5上ping別名webtest
docker run --name test5 -it --link=test3:webtest inter-image /bin/bash
ctrl+p和ctrl+q退出
3.test3和test5的ip分別是172.17.0.22和172.17.0.24
4.重啟test3容器
docker restart test3
發現ip變成了172.17.0.25
5.進入到test5容器
docker exec -it test5 /bin/bash
ping test3容器的ip別名webtest可以ping通,儘管test3容器的ip變了也可以通
拒絕容器互聯(拒絕容器相互訪問)
docker守護程序的啟動項
--icc=false
修改啟動項的配置檔案
vim /etc/sysconfig/docker
在最後一行新增如下引數:
other_args="-icc=false"
重啟docker容器配置生效,然後分別執行test3,test5,在test5上ping test3的ip(webtest),會發現ping不通