初識網路協議 什麼是容器

2022-04-29 08:33:06 字數 2279 閱讀 2840

容器(container)的思想是要變成軟體交付的貨櫃。而貨櫃最重要的就是「打包」和「標準」兩大特點。所謂打包,就是將所有的貨物打包在一起,然後放到貨櫃裡面;所謂標準,就是貨櫃的尺寸全部都是一樣的。

對於容器而言,打包就是將貨物封裝起來,使貨物之間互不干擾,相互隔離。隔離主要使用了兩種技術,namespacecgroup

命名空間(namespace)

命名空間是用來解決在不同的空間裡面,類名相同引起的衝突。這在很多程式語言裡面都很常見,比如php。

在linux下也是這樣的,很多的資源都是全域性的。比如程序有全域性的程序id,網路也有全域性的路由表。但是,當一台linux上跑多個程序的時候,如果我們覺得使用不同的路由策略,這些程序可能會衝突,那就需要將這個程序放在乙個獨立的namespace裡面,這樣就可以獨立配置網路了。

linux中網路的namespaceip netns命令操作。它可以建立、刪除、查詢namespace

機制網路(cgroup)

cgroup全稱control groups,是linux核心提供的一種可以限制、隔離程序使用的資源機制。

cgroup能控制哪些資源呢?它有很多子系統:

docker

談及容器,必然會說到docker。docker是乙個開源的應用容器引擎,基於go語言並遵從apache2.0協議開源。

當我們使用docker run執行乙個容器的時候,能看到這樣乙個拓撲結構。

這張圖和之前虛擬機器的圖有點像,容器裡面有張網絡卡,容器外面有張網絡卡。容器外的網絡卡連到docker0網橋,通過這個網橋,容器能夠直接實現相互訪問。

不過虛擬機器的虛擬網絡卡是通過tun/tap裝置虛擬出來的,而容器場景下並沒有虛擬化軟體,是通過建立一對veth pair的網絡卡實現的。從一邊發包,另一邊就能收到。使用ip link add建立好一對網絡卡後,一端打通到docker0網橋上,一端打通到容器裡。

如何打通到容器裡面?

每乙個容器的啟動都會對應乙個namespace,在docker中,pid就是namespace的名字,可以通過如下命令獲取。

此時建立的namespace不在預設路徑下,所以ip netns看不到,需要ln軟鏈結一下。這樣就可以將另一端打通到容器裡面了。

然後重新命名容器內的網絡卡,並給容器內網絡卡設定ip位址,這樣一台機器內部的容器就可以相互訪問了。

訪問外網的話有之前說過的橋接模式nat模式,docker預設使用nat模式。nat模式分為snatdnat,如果是容器內部訪問外部,需要通過snat,反過來外部訪問容器內部,需要通過dnat

如果在容器內部屬於乙個服務,例如上面部署乙個nginx(docker run --name nginx-test -p 18080:80 -d nginx),提供給外部進行訪問,需要通過docker的埠對映技術,將容器內部的埠對映到物理機上來。

那埠是如何對映的呢?

docker有兩種方式,一種是通過乙個程序docker-proxy的方式,監聽18080,轉換為80埠。

另一種方式是通過dnat方式,在-a prerouting階段加乙個規則,將到埠18080的訪問dnat成為到容器的私有網路的訪問。

初識 網路協議

首先了解了瀏覽器訪問伺服器的過程,根據我查的資料,可歸納為一下幾點 1 使用者輸入 2 瀏覽器請求dns伺服器,獲取網域名稱對應的ip位址 如 114.114.114.114 國內 聯通 移動 電信 8.8.8.8 國外,谷歌公司 3 請求連線該ip位址伺服器 4 傳送資源請求 http協議 5 w...

網路協議初識別

對近期研究網路協議進行簡單的總結 網路七層協議的劃分 各層協議 物理層 乙太網 數據機 電力線通訊 plc sonet sdh g.709 光導纖維 同軸電纜 雙絞線等 資料鏈路層 wi fi ieee 802.11 wimax ieee 802.16 atm dtm 令牌環 乙太網 fddi 幀中...

什麼是容器,什麼是Docker

此文 自行文時有所改動 容器是一種輕量級 可移植 自包含的軟體打包技術,使應用程式可以在幾乎任何地方以相同的方式執行。開發人員在自己筆記本上建立並測試好的容器,無需任何修改就能夠在生產系統的虛擬機器 物理伺服器或公有雲主機上執行。docker是容器的一種,還有其他容器,比如 coreos 的 rkt...