使Docker提供對外服務的網絡配置(橋接與端口)

前沿:redis

        docker 啓動容器後,如何對外服務?   但願你們看了這篇文章後有些幫助。 docker


docker的有關網絡問題沒怎麼搞清楚,請教了下鄧磊同窗,感謝 !ubuntu


Docker生成的容器,通常會給你生成一個ip地址,這個ip地址是和docker0的地址是一個ip段的。安全


經過ip a命令 ,我們能夠看到docker0的ip和子網的範圍 。 你們會發現除了docker0 還有一個vethc 數字的網卡,這個也算是虛擬網卡綁在橋接上的。bash

wKiom1PsaNfirzmfAAU8lwiyqYc483.jpg


咱們建立一個容器,而且暴露22端口。 這個22端口的意思是對外暴露了22端口,系統會從49000-49900端口範圍內給你分配一個端口。網絡



docker run 指明端口有兩種的方式,一種是-P ,他是識別容器裏的dockerfile聲明的端口關係。 還有一個是-p 這個是小屁屁,他就能夠直白點了。  好比 -p  6379,是對外暴露了6379。   6379:6379 是外面是6379,裏面也是6379 。ssh

原文:http://rfyiamcool.blog.51cto.com/1030776/1540074 tcp


root@dev-ops:~# docker run -d  -p 22 --name="redis_test" rastasheep/ubuntu-sshd ide

ed7887b93aa452323ee96339d889bebc36ad25a479c660ba89e97d2c5869f105測試

root@dev-ops:~# 

root@dev-ops:~# docker ps -a

CONTAINER ID        IMAGE                           COMMAND             CREATED             STATUS              PORTS                   NAMES

ed7887b93aa4        rastasheep/ubuntu-sshd:latest   /usr/sbin/sshd -D   7 seconds ago       Up 7 seconds        0.0.0.0:49153->22/tcp   redis_test          

root@dev-ops:~# 

原文:http://rfyiamcool.blog.51cto.com/1030776/1540074

wKioL1PsaqiC9a-XAAdUMGvZeLM044.jpg


原來我覺得docker是寫了一個socker作了端口的映射功能,看文檔才知道,他就是調用了一個 iptable的端口映射。 

iptables -t nat -L

原文:http://rfyiamcool.blog.51cto.com/1030776/1540074
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         
DOCKER     all  --  anywhere             anywhere             ADDRTYPE match dst-type LOCAL

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
DOCKER     all  --  anywhere            !127.0.0.0/8          ADDRTYPE match dst-type LOCAL

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         
MASQUERADE  all  --  localhost/16        !localhost/16        

Chain DOCKER (2 references)
target     prot opt source               destination         
DNAT       tcp  --  anywhere             anywhere             tcp dpt:49153 to:172.17.0.2:22
root@dev-ops:~#


有主機的ip,和容器的ip,那你還怕啥 !  想映射什麼,本身映射。


iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to 172.31.0.23:80


docker之間的容器默認是互通的,也就是兩個容器能夠互相的通訊。 若是想控制容器之間的通訊,能夠利用 docker  的 --icc 屬性控制。


wKioL1Psd2HwJdOfAAQ3awyJ1Gg532.jpg


原文:http://rfyiamcool.blog.51cto.com/1030776/1540074


好了,咱們在說下橋接的方式。 若是你以爲麻煩,每次都須要作端口的映射,或者是修改映射,那你能夠考慮下用橋接網卡的模式。 貌似一些論壇上的牛人不太推薦用橋接,估計是爲了安全的問題。  畢竟nat的話,對外是安全的,對外的服務也只是暴露出端口而已。  而橋接的話,會暴露ip出去。 


原文:http://rfyiamcool.blog.51cto.com/1030776/1540074

暫停docker服務

sudo service docker stop


用ip命令使docker0網卡down掉

sudo ip link set dev docker0 down


刪除網卡

sudo brctl delbr docker0


建立一個網卡 名字是bridge0

sudo brctl addbr bridge0


ip地址和子網

ip addr add 192.168.5.1/24 dev bridge0


啓動橋接網卡

sudo ip link set dev bridge0 up


寫入配置

echo 'DOCKER_OPTS="-b=bridge0"' >> /etc/default/docker


sudo service docker start


這樣的橋接方式有個問題就是,他的ip是docker本身檢測搞給你的,貌似不是dhcp獲取空閒的,而後賦予給容器的。我昨天再次作測試的時候,有一個ip被佔用的,可是他仍是分噴給了一個被佔用的ip地址。 這樣的話就衝突了。 若是ip端和公司內部或者是線上重疊的話,可能會形成ip地址的衝突。 橋接後遇到ip地址衝突是我的結論 ,也多是我這邊環境致使的這類問題!

相關文章
相關標籤/搜索