Privileged and loop device
<strike>乾但我內容用中文,爽LA</strike>
基於我這整週都滿肚子髒話,還是就長話短說ㄅ。
References
- http://obrown.io/2016/02/15/privileged-containers.html
- https://serverfault.com/questions/701384/loop-device-in-a-linux-container
- https://medium.com/@MicroPyramid/assign-public-ip-address-to-docker-container-without-port-binding-2fa696e97cf6v
WHY
簡單來說呢,就是隔壁 team 的阿印團隊寫了一個 auto-deploy OS 的軟體,然後因為本 team 要測的機器多到快炸掉(~150)了,它在同時(parallel)分開來跑多台 deploy 的時候很容易失敗(根據同事說法是等個 1 min 左右就好惹),總之結論上就是打算把它 containerize 。
THEN
結論上來說就是:
- 先講在前面, HostOS 是 RHEL8.0, container 是 RHEL6.4
- Application 安裝上會檢查 hardware ,
docker build
沒有辦法支援只能用docker create
+docker start
+docker commit
。(在 create 的時候帶--privileged
就會讓 host 的 hardware 長出來惹額) - 然後執行的時候會 mount iso file ,container 會需要可以存取
/dev/loop*
系列,permission 的部份一樣要開--privileged
,比較麻煩的是 container 裡面的mount -o loop
會自己去咬/dev/loop*
裡面的其中一個,和 host 不太一樣的是它不會自己開新的….(不知道是不是因為兩者版本不同的關係),如果 host 只有一個 loop disk 的話, container 如果開第二顆就會爆。
* 或是你第一個關掉之後的第二顆也會爆,簡單來說就是 exit 的時候沒有 release ,不過也有可能是因為 mount 的 folder 也一併被設成 volumn 從 host 掛上去的關係(?)。
** 解法就是自己做 setup & teardown (MTFK 在這撞超久…) - 第三個是
docker run
跑起來的 container 預設是 internal only 的 IP ,如果要讓多個 container 同時可以讓外部作 samba mount 的話要用docker network create -d macvlan <...>
開 macvlan 拿到外部實際摸得到的 IP。
* 這裡比較 tricky 的地方是如果沒有設--ip-range
的話,不同台 host 上面的 container 拿到的 ip 會是一樣的(因為 container 跑起來的 mac address 是一樣的…)。
* 然後 macvlan 綁到的parent
那個 ip 在 container 裡面是摸不到的…(但我不是很確定是不是 teaming 設定上有問題QQ)
END
這整週在 loop device
那邊卡超久, stackoverflow 上面只會跟你說什麼 container 不是這樣用的不要在上面掛 blahblah ,reference 找到的那個的確是正解沒錯(因為我第一次 loop device 乾淨的時候測一顆是可以跑的,然後我就開開心心的以為弄好了,孰不知後來每顆都開不起來 MTFK)
老實說我不是很確定 container 在 mount -o loop
的時候不會自己開新的 loop device
是不是因為版本的關係,畢竟 rhel6 的 losetup
沒有 -D
這個參數。(在 host 是會自己開的…uh, 應該說 host 在 mount -o loop
的時候並不會用到 /dev/loop*
,我也不知道它到底是摸去哪QQ)
是說的確是可以試一下 host 跟 container 同一種 os 的時候這種問題會不會消失,但問題在於今天要弄成 container 就是為了不要再用 rhel64 了啊WTF…
啊啊,不過感覺好像可以試一下不要掛 volumn 會不會有這個問題 ? 畢竟接回 Jenkins docker plugin 的時候也不用特別掛 volumn …. 🤔🤔🤔
大概就這樣惹, UDP 又在吵煩死了。