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