国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Docker容器網(wǎng)絡(luò)之服務(wù)名稱或別名連接容器服務(wù)原理剖析

IT那活兒 / 3065人閱讀
Docker容器網(wǎng)絡(luò)之服務(wù)名稱或別名連接容器服務(wù)原理剖析
點(diǎn)擊上方“IT那活兒”公眾號(hào),關(guān)注后了解更多內(nèi)容,不管IT什么活兒,干就完了!!! 

1

概  述

Docker 容器啟動(dòng)的時(shí)候,使用默認(rèn)的 bridge 網(wǎng)絡(luò)是不支持指派固定 IP 的; 

每次Docker 容器重啟時(shí),會(huì)按照順序獲取對(duì)應(yīng)的IP 地址,這個(gè)就導(dǎo)致重啟Docker, 容器的IP 地址會(huì)發(fā)生變化;

雖然可以通過(guò)創(chuàng)建自定義網(wǎng)絡(luò)在啟動(dòng)容器時(shí)指定 IP , 但此問(wèn)題不在本文章中闡述。

本文講述的是 docker-compose 通過(guò)服務(wù)名或者別名連接容器服務(wù)的原理以及分析,其中主要涉及到 netfilter/iptables 防火墻,evth- pair 技術(shù),DNS 等技術(shù),由于 Docker 容器網(wǎng)絡(luò)非常之復(fù)雜,本文不會(huì)對(duì) docker 之外的技術(shù)以及 docker 無(wú)關(guān)本文的其它技術(shù)進(jìn)行過(guò)多介紹。

關(guān)鍵字:evth-pair 技術(shù),iptables,netfilter,embedded DNS server,Bridge,命名空間。 

2

Docker五種網(wǎng)絡(luò)模式介紹

3

veth-pair技術(shù)

veth-pair 技術(shù)在網(wǎng)橋中的應(yīng)用:

圖1 veth-pair

網(wǎng)橋是一種對(duì)幀轉(zhuǎn)發(fā)的技術(shù),工作在 OSI 七層模型中的第二層(數(shù)據(jù)鏈路層),在數(shù)據(jù)鏈路層使用 MAC 地址轉(zhuǎn)發(fā)數(shù)據(jù)。

veth pair 是成對(duì)出現(xiàn)的一種虛擬網(wǎng)絡(luò)設(shè)備接口,一端連著網(wǎng)絡(luò)協(xié)議棧,一端彼此相連,如圖1;正因?yàn)橛羞@個(gè)特性,它充當(dāng)著一個(gè)橋梁,連接著各種虛擬網(wǎng)絡(luò)設(shè)備,常被用于構(gòu)建虛擬網(wǎng)絡(luò)拓?fù)洹?/span>

通過(guò)與 Docker Bridge 網(wǎng)絡(luò)相連,docker0 相當(dāng)于一臺(tái)交換機(jī),可以中轉(zhuǎn) docker。
容器的流量,如圖2 所示。
圖2 docker0 

4

Docker DNS實(shí)現(xiàn)

在早期的容器服務(wù)發(fā)現(xiàn)使用的是 docker link,通過(guò)修改容器內(nèi)的 /etc/hosts 文件來(lái)完成,其地址由 Docker 引擎維護(hù),因此容器間才可以通過(guò)別名互訪;這種方法存在很多的問(wèn)題,目前已經(jīng)過(guò)時(shí)不再使用。docker 自定義網(wǎng)絡(luò)里的 dns(embedded DNS server),如圖3 所示;
docker 會(huì)修改容器里的/etc/resolv.conf 文件,把 dns 服務(wù)器設(shè)置成 127.0.0.11,因?yàn)?127.0.0.0/8 地址都是本機(jī)回環(huán)地址, 所以 dns 查詢的時(shí)候?qū)嶋H上是把請(qǐng)求發(fā)給了自己。雖然是發(fā)給自己,但是還是要走 netfilter 的 nat 表的 output 鏈里把發(fā)往 127.0.0.11:53 的 UDP/TCP 包轉(zhuǎn)到了127.0.0.11:<隨機(jī)端口>
圖 3embedded DNS server
*nat

:PREROUTING ACCEPT [2:168]

:INPUT ACCEPT [2:168]

:OUTPUT ACCEPT [9:620]

:POSTROUTING ACCEPT [17:1091]

:DOCKER_OUTPUT - [0:0]

:DOCKER_POSTROUTING - [0:0]

-A OUTPUT -d 127.0.0.11/32 -j DOCKER_OUTPUT

-A POSTROUTING -d 127.0.0.11/32 -j DOCKER_POSTROUTING

-A DOCKER_OUTPUT -d 127.0.0.11/32 -p tcp -m tcp --dport 53 -j DNAT --to-destination 127.0.0.11:45481

-A DOCKER_OUTPUT -d 127.0.0.11/32 -p udp -m udp --dport 53 -j DNAT --to-destination 127.0.0.11:46340

-A DOCKER_POSTROUTING -s 127.0.0.11/32 -p tcp -m tcp --sport 45481 -j SNAT --to-source :53

-A DOCKER_POSTROUTING -s 127.0.0.11/32 -p udp -m udp --sport 46340 -j SNAT --to-source :53 COMMIT

# Completed on Fri Mar 25 13:15:36 2022
表 1 容器 iptables
開始測(cè)試:

composetest_web_1

[root@VM-12-7-centos composetest]#
11 hours ago Up 10 hours 0.0.0.0:5000->5000/tcp, :::5000->5000/tcp
composetest_redis_1

af90b8c4350f composetest_web "flask run"
表 2 docker ps
進(jìn)入 composetest_redis_1 容器使用 netstat -anp 查看發(fā)現(xiàn)是 dockerd 在監(jiān)聽TCP 3971/UDP 46340 端口,等 DNS 請(qǐng)求又回環(huán)到filter 表的input 鏈的時(shí)候dockerd 就接到了這個(gè)請(qǐng)求;
dockerd 自身處理這些請(qǐng)求,處理不了的要發(fā)給宿主機(jī)配置的dns 服務(wù)器。當(dāng)端點(diǎn)加入網(wǎng)絡(luò)時(shí),dockerd 將設(shè)置一個(gè) DNS 服務(wù)器,只需創(chuàng)建一個(gè)套接字并在容器 netns 中監(jiān)聽,這個(gè)套接字在主機(jī) netns 中接受,由 dockerd 處理。
[root@VM-12-7-centos composetest]# netstat -pantu

Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address
Foreign Address
State
PID/Program name

表 3 查看容器網(wǎng)絡(luò)連接
[root@VM-12-7-centos composetest]# nc -nvz 127.0.0.11 53 Ncat: Version 7.50 ( https://nmap.org/ncat )
Ncat: Connected to 127.0.0.11:53.

Ncat: 0 bytes sent, 0 bytes received in 0.01 seconds.
表 4  測(cè)試容器 DNS 連通性

表 5 通過(guò) docker 守護(hù)進(jìn)程查找 TCP/UDP 套接字
[root@VM-12-7-centos composetest]# lsof -o 3917|egrep UDP|TCP

[root@VM-12-7-centos composetest]# docker inspect composetest_redis_1|grep Pid "Pid": 17693,
"PidMode": "",

"PidsLimit": null,
表 6 查找容器線程 id
[root@VM-12-7-centos composetest]# ll /proc/17693/ns/net

lrwxrwxrwx 1 polkitd mysql 0 Mar 25 10:07 /proc/17693/ns/net -> net:[4026532226]
表 7 查找容器網(wǎng)絡(luò)命名空間
[root@VM-12-7-centos composetest]# ln -s /proc/17662/ns/net /var/run/netns/composetest_web_1 [root@VM-12-7-centos composetest]#
[root@VM-12-7-centos composetest]# ll /var/run/netns/composetest_web_1

lrwxrwxrwx 1 root root 18 Mar 25 04:52 /var/run/netns/composetest_web_1 -> /proc/17662/ns/net
表 8 容器命名空間軟連接到宿主機(jī)命名空間
[root@VM-12-7-centos ~]# ip netns exec composetest_web_1 ping baidu.com PING baidu.com (220.181.38.251) 56(84) bytes of data.
64 bytes from 220.181.38.251 (220.181.38.251): icmp_seq=1 ttl=48 time=27.5 ms

64 bytes from 220.181.38.251 (220.181.38.251): icmp_seq=2 ttl=48 time=27.4 ms

^C
--- baidu.com ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1000ms rtt min/avg/max/mdev = 27.441/27.495/27.549/0.054 ms
表 9 通過(guò)別名或者服務(wù)名驗(yàn)證容器連通性 1
/ code # ping web

PING web (172.18.0.2): 56 data bytes

64 bytes from 172.18.0.2: seq
=0 ttl=64 time=0.031 ms 64 bytes from 172.18.0.2: seq=1 ttl=64 time=0.059 ms
^C

--- web ping statistics ---

2 packets transmitted, 2 packets received, 0% packet loss round-trip min/avg/max = 0.031/0.045/0.059 ms
/code #

/ code # ping redis

PING redis (172.18.0.3): 56 data bytes

64 bytes from 172.18.0.3: seq
=0 ttl=64 time=0.071 ms 64 bytes from 172.18.0.3: seq=1 ttl=64 time=0.073 ms 64 bytes from 172.18.0.3: seq=2 ttl=64 time=0.076 ms
^C

--- redis ping statistics ---

3 packets transmitted, 3 packets received, 0% packet loss round-trip min/avg/max = 0.071/0.073/0.076 ms
/code #
表 10 通過(guò)別名或者服務(wù)名驗(yàn)證容器連通性 2
實(shí)驗(yàn)環(huán)境:
[root@VM-12-7-centos ~]# cat /etc/*release CentOS Linux release 7.6.1810 (Core)
[root@VM-12-7-centos ~]# docker --version

Docker version 20.10.14, build a224086
實(shí)驗(yàn)配置:
[root@VM-12-7-centos composetest]# pwd

/root/composetest

[root@VM-12-7-centos composetest]#

[root@VM-12-7-centos composetest]# cat requirements.txt flask
redis

[root@VM-12-7-centos composetest]#

[root@VM-12-7-centos composetest]# cat Dockerfile FROM python:3.7-alpine
WORKDIR /code

ENV FLASK_APP app.py

ENV FLASK_RUN_HOST 0.0.0.0

RUN apk add --no-cache gcc musl-dev linux-headers COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt COPY . .
CMD ["flask", "run"]

[root@VM-12-7-centos composetest]# [root@VM-12-7-centos composetest]#
[root@VM-12-7-centos composetest]# cat docker-compose.yml # yaml 配置
version: 3 services:
web:
build: . ports:
- "5000:5000"

redis:

image: "redis:alpine"

[root@VM-12-7-centos composetest]# [root@VM-12-7-centos composetest]# [root@VM-12-7-centos composetest]# cat app.py import time

import redis

from flask import Flask

app = Flask( name )

cache = redis.Redis(host=redis, port=6379)

def get_hit_count(): retries = 5 while True:
try:

return cache.incr(hits)

except redis.exceptions.ConnectionError as exc: if retries == 0:
raise exc retries -= 1 time.sleep(0.5)

@app.route(/) def hello():
count = get_hit_count()

return Hello World! I have been seen {} times. .format(count) [root@VM-12-7-centos composetest]#
[root@VM-12-7-centos composetest]#docker-compose up -d

 


END



 


本文作者:潘 安

本文來(lái)源:IT那活兒(上海新炬王翦團(tuán)隊(duì))

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/129499.html

相關(guān)文章

  • Docker容器間通信方法

    摘要:而本文主要針對(duì)容器間的網(wǎng)絡(luò)通信方法進(jìn)行討論。而同屬于用戶自定義的容器之間自動(dòng)將所有端口暴露,方便容器間進(jìn)行無(wú)障礙的通信,而不會(huì)遭受到外界的意外訪問(wèn)。幾天前,為了解決日常在本地進(jìn)行日常工作和開發(fā)測(cè)試之間的矛盾,利用docker在Windows系統(tǒng)中搭建了基于Linux的測(cè)試環(huán)境:借助Docker,在win10下編碼,一鍵在Linux下測(cè)試。在這邊文章里主要介紹了如何在本地通過(guò)docker構(gòu)建與...

    qianfeng 評(píng)論0 收藏0
  • docker-compose命令對(duì)比

    摘要:對(duì)比如果鏡像在本地不存在,將會(huì)嘗試?yán)ミ@個(gè)鏡像。鏈接到外部的容器,甚至并非管理的容器。僅可以指定內(nèi)部端口為參數(shù)卷掛載路徑設(shè)置。使用來(lái)暴露服務(wù)的容器給其他的。要查看服務(wù)可用的環(huán)境變量,運(yùn)行項(xiàng)目 對(duì)比 image vs build image:如果鏡像在本地不存在,Compose 將會(huì)嘗試?yán)ミ@個(gè)鏡像。 build:指定 Dockerfile 所在文件夾的路徑。 Compose 將會(huì)利用...

    libin19890520 評(píng)論0 收藏0
  • 記錄一次被docker容器通信虐的死去活來(lái)的部署路(node + mongoDB + nginx

    摘要:原因是這樣的想要部署一個(gè)平臺(tái),就在朋友的推薦下選擇了這個(gè)現(xiàn)成的項(xiàng)目該項(xiàng)目分為服務(wù)端客戶端以及數(shù)據(jù)庫(kù)在嘗試直接部署的時(shí)候發(fā)現(xiàn)需要裝一大堆的環(huán)境,啊,特別的麻煩,之前簡(jiǎn)單的使用過(guò),就在想能不能用免環(huán)境直接部署呢于是就有了這次的嘗試多容器通信該 原因是這樣的 想要部署一個(gè)mocker平臺(tái),就在朋友的推薦下選擇了api-mocker這個(gè)現(xiàn)成的項(xiàng)目 該項(xiàng)目分為服務(wù)端node、客戶端vue、以及...

    TNFE 評(píng)論0 收藏0
  • 記錄一次被docker容器通信虐的死去活來(lái)的部署路(node + mongoDB + nginx

    摘要:原因是這樣的想要部署一個(gè)平臺(tái),就在朋友的推薦下選擇了這個(gè)現(xiàn)成的項(xiàng)目該項(xiàng)目分為服務(wù)端客戶端以及數(shù)據(jù)庫(kù)在嘗試直接部署的時(shí)候發(fā)現(xiàn)需要裝一大堆的環(huán)境,啊,特別的麻煩,之前簡(jiǎn)單的使用過(guò),就在想能不能用免環(huán)境直接部署呢于是就有了這次的嘗試多容器通信該 原因是這樣的 想要部署一個(gè)mocker平臺(tái),就在朋友的推薦下選擇了api-mocker這個(gè)現(xiàn)成的項(xiàng)目 該項(xiàng)目分為服務(wù)端node、客戶端vue、以及...

    amc 評(píng)論0 收藏0
  • 記錄一次被docker容器通信虐的死去活來(lái)的部署路(node + mongoDB + nginx

    摘要:原因是這樣的想要部署一個(gè)平臺(tái),就在朋友的推薦下選擇了這個(gè)現(xiàn)成的項(xiàng)目該項(xiàng)目分為服務(wù)端客戶端以及數(shù)據(jù)庫(kù)在嘗試直接部署的時(shí)候發(fā)現(xiàn)需要裝一大堆的環(huán)境,啊,特別的麻煩,之前簡(jiǎn)單的使用過(guò),就在想能不能用免環(huán)境直接部署呢于是就有了這次的嘗試多容器通信該 原因是這樣的 想要部署一個(gè)mocker平臺(tái),就在朋友的推薦下選擇了api-mocker這個(gè)現(xiàn)成的項(xiàng)目 該項(xiàng)目分為服務(wù)端node、客戶端vue、以及...

    Rango 評(píng)論0 收藏0
  • 從一份配置清單詳解Nginx服務(wù)器配置

    摘要:在本文中,我們繼續(xù)延續(xù)前文,從前文給出的一份示例配置清單開始,詳解一下服務(wù)器的各種配置指令的作用和用法。是否允許同時(shí)接收多個(gè)網(wǎng)絡(luò)連接指令格式該指令默認(rèn)為狀態(tài),意指每個(gè)一次只能接收一個(gè)新到達(dá)的網(wǎng)絡(luò)連接。 showImg(https://segmentfault.com/img/remote/1460000015385948); 概述 在前面《Nginx服務(wù)器開箱體驗(yàn)》 一文中我們從開箱...

    kevin 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<