發表文章

目前顯示的是 9月, 2020的文章

現代化小白也要嘗試的容器手札 - Docker 進階網路深入探討(二)

圖片
  Day20. Docker 進階網路深入探討(二) 進階網路深入探討(二) 觀念五 Iptables 容器所有到外部網路的連接,來源地址都會被NAT轉址成宿主機的IP,而其中的手腳就是來自於 iptables 。 iptables的 NAT Table ,透過此表來實行主機上的路由轉送的動作,重申在linux中IP並非專屬任一實體網卡,而是屬於linux內可被轉址,平時所用的軟體路由是基於linux內核iptables實現,使用NAT前需開啟轉發才能產生作用。 透過以下iptables程序鏈的封包過濾圖 INPUT : 應用於進入本主機的網路封包。 OUTPUT : 應用於由本主機送出的網路封包。 FORWARD : 應用於經由本主機轉送的網路封包。 PREROUTING : 應用於進行路由前的網路封包。 POSTORTING : 應用於被送出前的網路封包。 並非每種表格都有所有鏈結,各功能內建鏈結對照如下: filter table:INPUT,OUTPUT,FORWARD。 nat table:PREROUTING,OUTPUT,POSTROUTING。 mangle table:INPUT,OUTPUT,FORWARD,PREROUTING,POSTROUTING。 raw table:OUTPUT,PREROUTING。 security table:INPUT,OUTPUT,FORWARD。 一般如果不啟動NAT功能,只要使用 filter table的INPUT,OUTPUT 鏈已足夠。 如需啟用NAT,除過濾功能本身外,最重要就是 FORWARD轉送 功能,並用位址轉換表格的POSTROUTING,將封由內網私有  IP偽裝(MASQUERADE) 成NAT對外IP,才能連上Internet。 iptables -t nat -nL Chain PREROUTING (policy ACCEPT) target prot opt source destination DOCKER all -- 0.0.0.0/0 0.0.0.0/0 Chain INPUT (policy ACCEPT) target prot opt source destination Chain POSTROUTING (policy ACCEPT) target prot

現代化小白也要嘗試的容器手札 - Docker 進階網路深入探討(一)

圖片
  Day19. Docker 進階網路深入探討(一) 容器網路進階探討(一) 觀念一 當Docker啟動時,宿主機端上會自動建立一組 docker0的Birdge網路 ,此Birdge網路可以視同一個虛擬交換機。它會把掛載到此docker0上的網路介面互相可以進行通訊轉發。 依據 RFC1918 定義,Docker隨機分配一個docker0私有網路中尚未佔用的一個IP位址來分配給網卡,如:  172.17.0.0/16 下的網路,而之後容器內的網卡也會自動分配同一網段下給予一組IP位址。 當開始建立Docker容器時,會同時建立一對 veth pair 介面,此介面作用是當封包發送到A介面時,B介面也會收到相同的封包。 這對介面一端在容器內屬 eth0 ,而另一端在本地並被掛載到docker0 Bridge則是以 veth 作為開頭的一串隨機碼,如:vethxxxxxx。透過此方式,宿主機就可以與容器進行溝通,容器間也可以相互連通。也就是宿主和容器間一組虛擬共享網路。 不過透過上述的虛擬共享網路橋接器,真實狀態下預設並不能讓容器直接透過宿主機對外以及容器之間讓網卡互通,最後一項武器還是要利用iptables來實踐連接埠的Mapping,這樣才能讓外面或彼此容器間存取通訊。 所以重整思緒一下,Docker基本網路結構主要由以下四種元件組成: Netwoek Namespace :網路資源之間完整隔離。 Veth Pair :隔離容器與對外傳輸通訊的橋樑。 Linux Brigde :宿主機上的橋接器,作為交換機之用。由於容器均透過Veth Pair連至橋接器上,故可在容器間進行網路通訊行為。 Iptables :提供網路通訊NAT以及防火牆開通連接埠的功能。 觀念二 在容器中使用mount指令可以看到以下資訊,可以讓宿主機的DNS在發生更新後所有Docker容器的DNS都透過 /etc/resolv.conf偵測參照並自動更新。 我們隨機執行一個Ubuntu容器檢視他的DNS紀錄狀態 修改 daemon.json ,如果沒有就自行建立,修改完畢後一定要重啟daemon服務並透過檢視docker info是否正常顯示資訊,如果有問題會顯示狀態失敗,一定要預先排除。 vi daemon.json { "dns" : [ "168

現代化小白也要嘗試的容器手札 - Docker Container 服務互連串接

圖片
  Day18. Docker Container 服務互連串接 容器服務互連串接 前面都一直專注在外部要來存取某一容器服務的存取行為,但現實生活並不會只有單一容器獨立的生存,容器與容器之間相互間也會需要溝通的,就跟我們一直熟知多台虛擬機器之間的網路服務溝通行為一樣。 本次的實作會在來源容器和目的容器間透過 linking 建立一個隧道,讓目的端容器可以接收到來源容器而給予相對回應。 但本次是 單台Host(Ununtu宿主機上)多個容器 間通訊,如下圖所示,這樣就很好理解。 系統互相連接主要是依容器的命名來對應執行,所以首要就需要自訂一組容器名稱,而自訂容器名稱有以下兩點好處: 自訂名稱除了好記好管理如:正式環境電商網站容器就取名ProdECWEB 當容器之間互連時可作為有效好判斷去回流程的架構依據如:ProdECWEB容器連接到到ProdECDB 測試環境條件 Ubuntu主機:Docker1 網站容器一:prodecweb 網站容器二:uatecweb 資料庫容器:prodecdb 網站容器一:prodecweb docker run -d -P --name prodecweb training/webapp python app.py docker ps -l docker inspect -f "{{ .Name }}" ff9a8930a47c docker rm -f prodecweb 建立網站並把網站自動隨機指派一組連接埠公開 檢視一下建立好的網站容器名稱 正式綁定Link前,目的端資料庫因為還沒有建立就把網站給先建了,故移除等資料庫建立好再綁定建立 資料庫容器:prodecdb docker run -d --name prodecdb training/postgres docker ps -l docker inspect -f "{{ .Name }}" 7 fa95ede5ab8 建立資料庫但是不把連接埠對外公開 同樣檢視一下建立好的資料庫容器名稱 docker run -d - P --name prodecweb --link prodecd b:prodecdb training/webapp python app. py docker ps 前端網站容器和資料

現代化小白也要嘗試的容器手札 - Docker 外部網路存取實記

圖片
  Day17. Docker 外部網路存取實記 外部存取容器實記 當容器中部署了屬於讓用戶存取的服務,一定會需要從外部來做存取,然而容器又是如何與外部進行通訊呢? 下圖就是一個從外部能存取到內部容器的簡易架構 Internet--> enp01(Host網卡端口) --> docker0(內外溝通的橋接網路) --> vetheg0a1r0y(docker0 Bridge端口) --> eth0(容器端口) -->Nginx容器本身 PS:如果是透過內部容器發起連線需求則是上述流程反向操作。 Linux本身就有路由轉發功能,所以其實linux系統本身可以作為一個路由器。執行命令 cat /proc/sys/net/ipv4/ip_forward ,能看到 ip_forward=1 ,說明系統開啟了路由轉發。 ifconfig 來實際檢視到 docker0 的橋接網路以及分配到的IP位址 iptables -t nat -vnL 檢視在防火牆上內部容器轉發服務的IP網路的對應 接下來來個簡單的實例牛刀小試一下>>> 容器本身是可以透過執行一些網路應用如最典型就是網站,讓外部使用者可以來存取這些應用,我們可以通過-P或-p的參數來指定連接埠的映射。 我們當單純只使用 -P 參數不指定連接埠時,Docker就會隨機的一組連接埠映射到內部網中容器開放的網路連接埠來做綁定。 docker run -d -P mygynginx1 補充:-d 在背景執行容器並把容器ID印出螢幕上,必要參數。 使用docker ps可以看到,本地主機隨機指定一組32768Port映射到容器預設網頁連接埠80。 此時URL只要帶本機上32768連接埠就可以連線到容器內的網站。 http://localhost:32768 或是查看目前hosts IP並把URL改成內部IP。 ifconfig http://10.200.2.7:32768 如果想要看看跑Nginx容器本身被分配的IP做法。 docker exec -it 013 a7b4a9241 /bin/ bash awk 'END{print $1}' /etc/ hosts 可以透過指定查看此網站容器的歷史紀錄並看到此服務是UP狀態並且對於前端的需求均回應200 OK的

Oracle Cloud 試用體驗不負責之心得

Oracle Cloud  前一陣子大約2020/3-2020/6之間第二季個人 Free Try 心得 : 單純IaaS VM 在測試選擇規格上非常的侷限,基本上只有極低的計算力可以選擇。 IaaS 範本與版本非常少,僅能侷限幾個常用的Windows Server 2016 / Ubuntu / CentOS這些。 光是佈建好VM但是要登入存取此資源前一直會有無法存取等錯誤但當時也找不到時候的技術文件來解決,就連詢問過原廠技術都沒有很專業的應對解決此問題,導致無法後續。 明明試用有給一個300美金的額度,但是資源配額本身鎖死過多,遠大過其他三大雲端品牌相對大方豐沛的資源,讓人在試用體驗上就能感受好處,進而導致直接棄用Oracle Cloud。 Oracle Cloud相對小眾,故技術資源與成功實例等生活圈就更難以複製模仿其經驗。 如果是Oracle員工竟然是無法使用信用卡來試用的,這是想要逼死誰。 價格計算機上的成本列表,以運算服務OCI(虛擬機器)為例,竟然都是以他們自家DB的單位來當作效能值,所以沒有相應規格到底是多少CPU多少RAM這樣的世俗的單位,這是要怎麼換算才能符合自己要的規格成本,完全無法抓預算。 目前看來遷移的工具只有照顧本業起家的資料庫,但常見的伺服器移轉看起來是沒有這類服務可以協助,只能重建一途。 目前CDN這非常廣泛使用的服務是沒有的,DNS中路由模式可以向Route53作全域負載平衡這類只在Q&A確定是即將到來,但現在進行式是沒有的。

現代化小白也要嘗試的容器手札 - 簡單備份還原與遷移 Docker 容器

圖片
  Day16. 簡單備份還原與遷移 Docker 容器 備份還原與遷移容器 備份容器 運行中的Docker容器備份,首要查看備份容器列表。 先用 docker ps 指令查看正在執行的Container,取得 Container的Name及ID 。 假設要備份此Nginx Container,ID如下圖所示1d340021374a。 docker ps docker run --name mynginx1 -p 80:80 -d nginx 接下來會用Commit指令來建立備份,指令會暫時儲存mynginx1的運作,之後將備份快照存為mygynginx1的映像檔。 docker commit -p 1d340021374a mygynginx1 docker images 然後將備份出來的mygynginx1映像檔放到Docker Repository,但首先要先做Docker Login身份驗證。 驗證成功後,要確定自己的Docker Hub上是否有建立公用倉庫,如果沒有請先自建。 docker tag ${Image Name}DockerHub Account/Image Name 推送前的標準語法 docker tag mygynginx1 0155yh/gylab 映像檔推送到Docker Hub前需把Docker Image加註標記 docker images 查看確實已經有了剛剛定義的Docker倉庫0155yh/gylab docker push 0155yh/gylab 推送完成 容器回復 docker rmi -f 0155yh/gylab 示範誤刪映像檔 docker images 確認已經沒有此映像 docker pull 0155yh/gylab 重新拉回剛剛推送的映像檔 docker images 確認映像檔已經還原 docker run --name gy1nginx -p 80:80 -d 0155yh/gylab 執行剛剛拉取下來的nginx容器 docker ps 剛剛的容器狀態為執行中 curl http://localhost 網頁已經正常呈現 docker save 以及 docker load 就在Day 10. Docker Images深入探討篇章可以在反芻一下。