成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

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

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

1

概  述

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

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

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

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

關(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)橋是一種對幀轉(zhuǎn)發(fā)的技術(shù),工作在 OSI 七層模型中的第二層(數(shù)據(jù)鏈路層),在數(shù)據(jù)鏈路層使用 MAC 地址轉(zhuǎn)發(fā)數(shù)據(jù)。

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

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

4

Docker DNS實現(xiàn)

在早期的容器服務(wù)發(fā)現(xiàn)使用的是 docker link,通過修改容器內(nèi)的 /etc/hosts 文件來完成,其地址由 Docker 引擎維護(hù),因此容器間才可以通過別名互訪;這種方法存在很多的問題,目前已經(jīng)過時不再使用。docker 自定義網(wǎng)絡(luò)里的 dns(embedded DNS server),如圖3 所示;
docker 會修改容器里的/etc/resolv.conf 文件,把 dns 服務(wù)器設(shè)置成 127.0.0.11,因為 127.0.0.0/8 地址都是本機(jī)回環(huán)地址, 所以 dns 查詢的時候?qū)嶋H上是把請求發(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
開始測試:

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 請求又回環(huán)到filter 表的input 鏈的時候dockerd 就接到了這個請求;
dockerd 自身處理這些請求,處理不了的要發(fā)給宿主機(jī)配置的dns 服務(wù)器。當(dāng)端點加入網(wǎng)絡(luò)時,dockerd 將設(shè)置一個 DNS 服務(wù)器,只需創(chuàng)建一個套接字并在容器 netns 中監(jiān)聽,這個套接字在主機(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  測試容器 DNS 連通性

表 5 通過 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 通過別名或者服務(wù)名驗證容器連通性 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 通過別名或者服務(wù)名驗證容器連通性 2
實驗環(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
實驗配置:
[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



 


本文作者:潘 安

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

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

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

相關(guān)文章

  • Docker容器間通信方法

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

    qianfeng 評論0 收藏0
  • docker-compose命令對比

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

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

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

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

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

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

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

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

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

    kevin 評論0 收藏0

發(fā)表評論

0條評論

IT那活兒

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<