探索本地Docker橋接網絡
本文轉自http://dockerone.com/article/137
我正在寫《Docker in Action》(譯者注:此書的樣章可以在這里查看)第五章,內容有關Docker的容器連接與網絡配置。最近一直在關注Docker的其它幾個部分,我也重新熟悉了容器連接并深入研究了網絡。
本文不會贅述我們已經熟悉的網絡橋接。但是我猜很多使用Docker的開發者仍然不熟悉這部分內容,接下來我將為你展示容器啟動的時候如何創建網絡。下面我將會做一個實驗,從幾個容器中操作MongoDB。
啟動目標容器
在這個實驗中我們的目標是MongoDB數據庫。你可以安裝并使用以下命令啟動MongoDB容器。docker run --name some-mongo -d mongo:latest
啟動另一個容器
這個容器基于Ubuntu鏡像構建,運行了一個Shell環境。你可以檢查你的本地網絡并從這個容器連接到Mongo實例。docker run -it --rm ubuntu:latest /bin/bash root@XXX:/#
在交互模式下啟動鏡像,這樣就可以安裝你所需要的工具或者做其它事情而不會擾亂你的主機系統的狀態。
獲取您的命令行工具
你需要的工具包括Mongo CLI和nmap(譯者注:nmap是網絡探測工具和安全/端口掃描器)。root@XXX:/#apt-get -y install nmap root@XXX:/#apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10 root@XXX:/#echo 'deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen' | sudo tee /etc/apt/sources.list.d/mongodb.list root@XXX:/#apt-get update root@XXX:/#apt-get install -y mongodb-org-shell
既然你正在以root身份運行的容器,你不用擔心標準的sudo命令前綴。一旦這些命令運行完成,你就可以準備開啟實驗。
掃描網絡
找到你的容器的IP地址,這樣你就可以猜出你的目標可能在哪。root@XXX:/#MY_IP=`/sbin/ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'`
尋找在同一子網的監聽端口為27017子網中的主機。執行此操作使用nmap進行子網的27017端口的掃描:
root@XXX:/#nmap -sS -p 27017 $MY_IP/24
在我的測試環境中的網絡端口掃描的結果如下:
Starting Nmap 6.40 ( http://nmap.org ) at 2014-12-09 15:52 UTC Nmap scan report for 172.17.0.33 Host is up (0.000030s latency). PORT STATE SERVICE 27017/tcp closed unknown MAC Address: 02:42:AC:11:00:21 (Unknown) Nmap scan report for 172.17.0.34 Host is up (0.000021s latency). PORT STATE SERVICE 27017/tcp closed unknown MAC Address: 02:42:AC:11:00:22 (Unknown) Nmap scan report for 172.17.0.96 Host is up (-0.079s latency). PORT STATE SERVICE 27017/tcp open unknown MAC Address: 02:42:AC:11:00:60 (Unknown) Nmap scan report for 172.17.0.131 Host is up (-0.084s latency). PORT STATE SERVICE 27017/tcp closed unknown MAC Address: 02:42:AC:11:00:83 (Unknown) Nmap scan report for XXX (172.17.0.132) Host is up (0.000055s latency). PORT STATE SERVICE 27017/tcp closed unknown Nmap done: 256 IP addresses (5 hosts up) scanned in 4.10 seconds
從以上的輸出中你可以看到,我的測試環境中運行的5個容器(包括一個正在運行命令的)。五個其中之一的端口27017是開放的。開放此端口的IP地址是運行你的MongoDB實例容器的IP地址。這是有趣的并且某些情況下可能會是一個驚喜,一會兒我就來聊聊這些。首先,讓我們先做完實驗。
訪問數據庫
使用先前安裝的mongo CLI,你應該能夠訪問在其它容器中運行的MongoDB實例。在你得意忘形之前,你要知道這并不是Docker的或者Linux內核的漏洞,服務的端口是開放的,所以你肯定能正常訪問。當你配合IP地址運行以下命令,你可以看到輸出:
root@XXX:/#mongo --host 172.17.0.96 # replace the IP address MongoDB shell version: 2.6.6 connecting to: 172.17.0.96:27017/test Welcome to the MongoDB shell. For interactive help, type "help". For more comprehensive documentation, see http://docs.mongodb.org/ Questions? Try the support group http://groups.google.com/group/mongodb-user >_
就是這樣。你可以在不同的容器內連接到MongoDB實例。獲取對數據庫的訪問就是這么容易。驚訝吧?不應該。你正在運行一個沒有身份驗證要求的MongoDB實例。不要以為防火墻或網絡拓撲會保護你的安全性差的服務。
Docker抽象化以及他們如何通信
此前在Docker的歷險中,不知道為什么,我印象里網絡是圍繞著容器而構建。確實是這樣。它們有分離接口的防火墻。不過我最初沒有想到這些,即使是路由沒有具體的鏈接。我認為,這是被Docker容器的鏈接增強了。與其他人一樣,當我學習如何訪問其它容器的時候,首先使用的就是容器的連接。當你想連接另外一個已經存在的容器時,你可以在容器啟動時通過參數指定(譯者注:--link參數)。當你使用連接時,Docker會將IP和端口信息相關的環境變量放到新創建的容器。此外,其它的容器IP地址將會添加到/etc/hosts文件并對應容器的名稱。(譯者注:使用連接容器不需要公開端口,父容器可以直接訪問子容器的公開端口,容器的端口不需要對宿主機公開,同時在容器中,會看到自動創建的一些環境變量,運行env命令試試。)
當我學習連接時,我停止了尋找其它的工具......至少一段時間。連接相當的方便,但他們只是提供了方便。他們告知你的新容器其他一些特定的容器的IP和端口信息。就是這樣。橋接網絡也沒有什么花哨。
你可以訪問其它容器的外部接口,就像他們是一個網絡上的其它計算機。這應該是一件好事。我們知道該怎么做。
PS:別忘了停止并刪除本實驗中創建的容器。
docker kill some-mongo docker rm -v some-mongo
本文由用戶 DockerOne 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!