前沿:redis
docker 啓動容器後,如何對外服務? 但願你們看了這篇文章後有些幫助。 docker
docker的有關網絡問題沒怎麼搞清楚,請教了下鄧磊同窗,感謝 !ubuntu
Docker生成的容器,通常會給你生成一個ip地址,這個ip地址是和docker0的地址是一個ip段的。安全
經過ip a命令 ,我們能夠看到docker0的ip和子網的範圍 。 你們會發現除了docker0 還有一個vethc 數字的網卡,這個也算是虛擬網卡綁在橋接上的。bash
咱們建立一個容器,而且暴露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
原來我覺得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 屬性控制。
原文: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地址衝突是我的結論 ,也多是我這邊環境致使的這類問題!