Docker精华问答 | task与executor有什么关系?
戳藍字“CSDN云計算”關注我們哦!
容器技術是這兩年熱門的話題,因為容器技術給我們帶來了很多方便的地方,節約了不少成本,不管是在運維還是開發上。今天,就讓我們來看看關于Docker更加有深度的問題吧。
1
Q:為什么執行?docker run -p?命令后還是無法通過映射端口訪問容器里面的服務??
A:首先,當然是檢查這個 docker 的容器是否啟動正常:?docker ps、docker top <容器ID>、docker logs <容器ID>、docker exec -it <容器ID> bash等,這是比較常用的排障的命令;如果是?docker-compose?也有其對應的這一組命令,所以排障很容易。
如果確保服務一切正常,甚至在容器里,可以訪問到這些服務,docker ps?也顯示出了端口映射成功,那么就需要檢查防火墻了。
本機防火墻?
在 Docker 運行的系統上不應該運行任何防火墻……沒錯,說你呢,CentOS 的?firewalld?和 Ubuntu 的?ufw?同學。由于 Docker 使用?iptables?規則來進行網絡數據流的控制,而那些防火墻總以為只有自己撰寫?iptables,從而經常會導致 Docker 設置了一些規則,然后轉眼就被?firewalld?或?ufw?給清了,特別是起、停防火墻服務的時候。從而導致 Docker 的網絡從外界無法訪問。
為了避免?iptables?的規則干擾,不要在運行 Docker 的服務器上,運行任何防火墻或配置自定義的?iptables?規則,除非你非常清楚你在做什么,并且知道會產生什么后果。另外,關閉防火墻后,記得重啟系統,至少是重啟 Docker 服務。否則防火墻的起、停、刷新這類行為會導致清空 Docker 設置的網絡規則,而導致容器內的網絡無法和外部互聯。
邊界防火墻?
如果你使用的是云服務器,那么除了本機防火墻外,云服務的服務商一般會提供邊界防火墻服務,比如安全組、安全策略類的東西。有些服務器為了安全起見,默認只開通必需的?22?端口給 SSH 使用,而其它端口屏蔽。這也是可能導致遠程訪問服務器?-p?端口失敗的原因之一。如果你發現你在服務器本地訪問服務,比如?curl localhost?沒有阻礙,但是遠程訪問該服務就連接失敗的話,那么應該去檢查云服務商的安全設置,是否忘記了開啟所需的端口。
Q:要映射好幾百個端口,難道要一個個?-p?么??
A:-p?是可以用范圍的,例如:
-p 8001-8010:8001-8010Q:vethxxxx?這種虛擬網卡和容器的對應關系從哪里看??
A:一個好辦法:
$ docker network ls NETWORK ID ? ? ? ? ?NAME ? ? ? ? ? ? ? ? ? ? ? DRIVER 56f04389b8f0 ? ? ? ?dockerlnmp_backend ? ? ? ? bridge 094fcb269385 ? ? ? ?dockerlnmp_frontend ? ? ? ?bridge注意這里的?NETWORK ID,然后運行?ip a | grep veth。
$ ip a | grep veth 12: veth22996d2@if11: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br-56f04389b8f0 state UP group default 14: veth34ace9a@if13: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br-56f04389b8f0 state UP group default 16: veth0bb3771@if15: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br-56f04389b8f0 state UP group default 22: veth399b874@if21: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br-094fcb269385 state UP group default 24: vethf24a0a9@if23: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdiscnoqueue master br-094fcb269385 state UP group default注意這里的?br-56f04389b8f0?以及?br-094fcb269385,br-?后面的是上面的網絡id,由此可以看出?veth?和 Docker 網絡的對應關系,而容器都是連接到了某個Docker網絡上的,從而就有了容器和?veth?的對應關系。對于某個網絡出現了多個?veth?的情況,可以觀察?veth22996d2@if11?后面的?if11?這部分,和容器內的?ip addr?的結果,一般奇-偶是一對。
Q:如何讓一個容器連接兩個網絡??
A:如果是使用?docker run,那很不幸,一次只可以連接一個網絡,因為?docker run?的?--network?參數只可以出現一次(如果出現多次,最后的會覆蓋之前的)。不過容器運行后,可以用命令?docker network connect?連接多個網絡。
假設我們創建了兩個網絡:
$ docker network create mynet1 $ docker network create mynet2然后,我們運行容器,并連接這兩個網絡。
$ docker run -d --name web --network mynet1 nginx $ docker network connect mynet2 web但是如果使用?docker-compose?那就沒這個問題了。因為實際上,Docker Remote API?是支持一次性指定多個網絡的,但是估計是命令行上不方便,所以?docker run?限定為只可以一次連一個。docker-compose?直接就可以將服務的容器連入多個網絡,沒有問題。
version: '2' services:web:image: nginxnetworks:- mynet1- mynet2 networks:mynet1:mynet2:Q:Docker 多宿主網絡怎么配置??
A:Docker 跨節點容器網絡互聯,最通用的是使用?overlay?網絡。一代 Swarm 已經不再使用,它要求使用?overlay?網絡前先準備好分布式鍵值庫,比如?etcd,?consul?或?zookeeper。然后在每個節點的 Docker 引擎中,配置?--cluster-store?和?--cluster-advertise?參數。這樣才可以互連。
現在都在使用二代 Swarm,也就是?Docker Swarm Mode,非常簡單,只要?docker swarm init?建立集群,其它節點?docker swarm join?加入集群后,集群內的服務就自動建立了?overlay?網絡互聯能力。
需要注意的是,如果是多網卡環境,無論是?docker swarm init?還是?docker swarm join,都不要忘記使用參數?--advertise-addr?指定宣告地址,否則自動選擇的地址很可能不是你期望的,從而導致集群互聯失敗。格式為?--advertise-addr <地址>:<端口>,地址可以是 IP 地址,也可以是網卡接口,比如?eth0。端口默認為?2377,如果不改動可以忽略。
此外,這是供服務使用的?overlay,因此所有?docker service create?的服務容器可以使用該網絡,而?docker run?不可以使用該網絡,除非明確該網絡為?--attachable。
雖然默認使用的是?overlay?網絡,但這并不是唯一的多宿主互聯方案。Docker 內置了一些其它的互聯方案,比如效率比較高的?macvlan。如果在局域網絡環境下,對?overlay?的額外開銷不滿意,那么可以考慮?macvlan?以及?ipvlan,這是比較好的方案。此外,還有很多第三方的網絡可以用來進行跨宿主互聯。
小伙伴們沖鴨,后臺留言區等著你!
關于Docker,今天你學到了什么?還有哪些不懂的?除此還對哪些話題感興趣?快來留言區打卡啦!留言方式:打開第XX天,答:……
同時歡迎大家搜集更多問題,投稿給我們!風里雨里留言區里等你~
-
福利
掃描添加小編微信,備注“姓名+公司職位”,加入【云計算學習交流群】,和志同道合的朋友們共同打卡學習!
推薦閱讀:
K8S安全軍規101:對CNCF最佳實踐的擴充
50個最有價值的數據可視化圖表(推薦收藏)
微服務、Kubernetes和無服務器之后,即將發生的……
月入5萬,程序員夫人們過上"貴婦"生活了嗎?
為什么說穩定幣才是諾獎得主哈耶克想要的非國家貨幣?
“扔瓶子”有套路?日本高中生開發機器人,手殘黨們有救了
那些簡歷造假拿 Offer 的程序員,后來都怎么樣了?
喜歡就點擊“好看”吧
總結
以上是生活随笔為你收集整理的Docker精华问答 | task与executor有什么关系?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MESUX米岫在国内属于几线品牌?有没有
- 下一篇: 珠宝鉴定中心鉴定一次多少钱?