日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Docker小白到实战之Docker网络简单了解一下

發(fā)布時(shí)間:2023/12/4 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Docker小白到实战之Docker网络简单了解一下 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

前言

現(xiàn)在對(duì)于Docker容器的隔離性都有所了解了,但對(duì)容器IP地址的分配、容器間的訪問(wèn)等還是有點(diǎn)小疑問(wèn),如果容器的IP由于新啟動(dòng)導(dǎo)致變動(dòng),那又怎么才能保證原有業(yè)務(wù)不會(huì)被影響,這就和網(wǎng)絡(luò)有掛鉤了,接下來(lái)就大概說(shuō)說(shuō)。

正文

1. Docker網(wǎng)絡(luò)模式簡(jiǎn)介

當(dāng)Docker進(jìn)程啟動(dòng)時(shí),會(huì)在主機(jī)上創(chuàng)建一個(gè)名為docker0的虛擬網(wǎng)橋,此主機(jī)上啟動(dòng)的Docker容器默認(rèn)會(huì)連接到這個(gè)虛擬網(wǎng)橋上。這樣所有容器通過(guò)這個(gè)虛擬網(wǎng)橋就打通了,所以這里的docker0工作方式和物理交換機(jī)很像。

在主機(jī)上可以執(zhí)行命令ip link show docker0查看:

Docker在啟動(dòng)容器時(shí)可以指定網(wǎng)絡(luò)模式,如果不指定,默認(rèn)就是采用Bridge模式;Docker的網(wǎng)絡(luò)模式有如下幾種:

  • Bridge(橋接)模式:默認(rèn)的網(wǎng)絡(luò)模式,比較適用于在同一Docker Daemon主機(jī)上運(yùn)行的容器,用戶也可以自定義bridge網(wǎng)絡(luò),優(yōu)于默認(rèn)的bridge網(wǎng)絡(luò);如果需要不同Docker主機(jī)進(jìn)行通信,可以通過(guò)操作系統(tǒng)網(wǎng)絡(luò)配置,也可以使用Overlay模式。

  • Host模式:和宿主機(jī)共用一個(gè)Network Namespace。即容器不會(huì)虛擬出自己的網(wǎng)卡和配置自己的IP等,而是使用宿主機(jī)的IP和端口;

  • Overlay模式:覆蓋網(wǎng)絡(luò)可以將多個(gè) Docker Daemon主機(jī)連接在一起,并使 swarm 服務(wù)能夠相互通信;也可以讓Docker Daemon主機(jī)上的兩個(gè)獨(dú)立容器進(jìn)行通信。

  • Macvlan模式:Macvlan 網(wǎng)絡(luò)允許為容器分配 MAC 地址,使其在網(wǎng)絡(luò)上顯示為物理設(shè)備。Docker Deamon通過(guò)容器的 MAC 地址將流量路由到容器。

  • None模式:Docker容器擁有自己的Network Namespace,但是并不為容器進(jìn)行任何網(wǎng)絡(luò)配置。即容器沒(méi)有網(wǎng)卡、IP、路由等信息。需要單獨(dú)為Docker容器添加網(wǎng)卡、配置IP

Docker在啟動(dòng)容器的時(shí)候可以通過(guò)--net指定網(wǎng)絡(luò)模式,不指定,默認(rèn)就是bridge模式,如下:

#?--net指定網(wǎng)絡(luò)模式,這里指定為host模式 docker?run?-d?--name?testnet?--net?host?nginx #?通過(guò)docker?inspect?容器?看網(wǎng)絡(luò)細(xì)節(jié),如下圖 docker?inspect?testnet

2. Bridge默認(rèn)模式了解一下

這里就以默認(rèn)的Bridge(橋接)展開(kāi)來(lái)說(shuō)說(shuō),其他模式后續(xù)根據(jù)應(yīng)用場(chǎng)景再具體細(xì)說(shuō)。

這里主要看看主機(jī)和容器之間的網(wǎng)絡(luò)、容器和容器之間的網(wǎng)絡(luò)。

在Bridge模式下,當(dāng)啟動(dòng)容器時(shí),Docker會(huì)分配一個(gè)IP給容器,并設(shè)置docker0的IP地址為容器的默認(rèn)網(wǎng)關(guān);這個(gè)時(shí)候會(huì)在主機(jī)上創(chuàng)建一對(duì)虛擬網(wǎng)卡veth pair設(shè)備接口,Docker將veth pair設(shè)備的一端配置在新啟動(dòng)的容器中,并命名為eth0@ifxxx(容器的網(wǎng)卡),另一端在主機(jī)中以veth***@ifxxx這樣類似的名字命名,并將這個(gè)網(wǎng)絡(luò)設(shè)備加入到docker0網(wǎng)橋中。

容器沒(méi)有啟動(dòng)時(shí)主機(jī)的網(wǎng)絡(luò)配置如下:

當(dāng)啟動(dòng)容器時(shí),Docker主機(jī)就會(huì)創(chuàng)建一對(duì)虛擬網(wǎng)卡vethpair設(shè)備接口,如下:

可以進(jìn)入到容器看看IP分配情況,如果ip addr命令在容器內(nèi)找不到,那是因?yàn)榛A(chǔ)鏡像只包含核心命令,如果要執(zhí)行其他命令,需要額外安裝。可以在容器內(nèi)執(zhí)行如下命令進(jìn)行安裝。

apt?update?&&?apt?install?-y?iproute2

安裝好之后,就可以查看容器內(nèi)的IP情況了,如下:

這里有沒(méi)有發(fā)現(xiàn)容器內(nèi)的IP是和主機(jī)多出來(lái)的虛擬網(wǎng)卡是成對(duì)出現(xiàn),這樣主機(jī)網(wǎng)絡(luò)和容器之間肯定能通;

當(dāng)然容器內(nèi)部也可以ping通主機(jī)。

那容器之間能不能訪問(wèn)呢?

容器內(nèi)ping命令也找不到,需要進(jìn)行安裝,執(zhí)行如下命令:

apt?update?&&?install?iputils-ping

這里新啟動(dòng)一個(gè)容器mynginx2,IP內(nèi)部分配如下:

mynginx容器內(nèi)能ping通mynginx2,那是因?yàn)閮蓚€(gè)容器之間共用了docker0,通過(guò)docker0進(jìn)行轉(zhuǎn)發(fā)

大概一個(gè)網(wǎng)絡(luò)流程如下:

這里的Docker0就好比是交換機(jī),形成了網(wǎng)絡(luò)橋梁。

3. 如何能通過(guò)容器名進(jìn)行訪問(wèn)

默認(rèn)情況,容器間的訪問(wèn)只能通過(guò)IP,不能通過(guò)容器名訪問(wèn);

這種情況對(duì)于線上項(xiàng)目很不靈活,比如數(shù)據(jù)庫(kù)備份需要臨時(shí)遷移,IP可能會(huì)不一樣,所以項(xiàng)目中的地址要重新配置,如果能通過(guò)容器名訪問(wèn),那么就不用操心更換啦,只要容器名一樣即可,就好比域名和IP的關(guān)系一樣,IP再怎么變,域名不變就行。

3.1 通過(guò)--link方式;

新啟動(dòng)一個(gè)容器mynginx3,如下:

#?通過(guò)--link關(guān)聯(lián)?mynginx容器 docker?run?-d?--name?mynginx3?--link?mynginx?nginx

容器啟動(dòng)之后,可以進(jìn)入到容器測(cè)試:

#?進(jìn)入容器 docker?exec?-it?mynginx3?/bin/bash? #?安裝ping工具 apt?update?&&?apt?install?iputils-ping

內(nèi)部原理其實(shí)是在mynginx3內(nèi)部做了個(gè)映射配置,容器mynginx3的hosts內(nèi)容如下:

這樣只能在容器mynginx3內(nèi)部通過(guò)mynginx容器名ping通,不能在mynginx內(nèi)部通過(guò)容器名mynginx3訪問(wèn),如果要達(dá)到同樣的效果,就得在啟動(dòng)mynginx時(shí)通過(guò)--link和mynginx3關(guān)聯(lián)起來(lái)。

如果每個(gè)容器都這樣的顯示指定的話,感覺(jué)就有點(diǎn)麻煩啦,通常的做法都是通過(guò)自定義網(wǎng)絡(luò)方式來(lái)達(dá)到這個(gè)目的。

3.2 通過(guò)自定義網(wǎng)絡(luò)方式;

首先新創(chuàng)建一個(gè)網(wǎng)絡(luò),如下:

命令解析:

#?--driver?指定網(wǎng)絡(luò)模式,這里為bridge橋接模式 #?--subnet?指定子網(wǎng)IP??192.168.0.0/16 #?--gateway?指定網(wǎng)關(guān)?192.168.0.1 #?my-net?創(chuàng)建的網(wǎng)絡(luò)名 docker?network?create?--driver?bridge?--subnet?192.168.0.0/16?--gateway?192.168.0.1?my-net #?顯示網(wǎng)絡(luò) docker?network?ls

讓啟動(dòng)的容器使用自定義的網(wǎng)絡(luò),即在啟動(dòng)容器時(shí)使用--net指定即可:

啟動(dòng)容器時(shí)不需要--link,只需要接入到自定義網(wǎng)絡(luò)就可以通過(guò)容器名ping通了,如下:

自定義網(wǎng)絡(luò)之所以能通過(guò)容器名ping通,那是容器內(nèi)運(yùn)行了一個(gè)本地DNS解析器,該解析器將請(qǐng)求轉(zhuǎn)發(fā)到Docker內(nèi)部DNS服務(wù)器當(dāng)中,DNS服務(wù)器中記錄了容器啟動(dòng)時(shí)通過(guò)--name或--net-alias參數(shù)指定的名稱與容器之間的關(guān)系

另外還有一個(gè)點(diǎn),現(xiàn)在分配給容器的IP是按照預(yù)先設(shè)置的子網(wǎng)范圍進(jìn)行分配的,而不是默認(rèn)的docker0子網(wǎng)范圍,執(zhí)行如下命令看詳細(xì):

#?看容器詳細(xì)信息 docker?inspect?testmynetnginx1

總結(jié)

關(guān)于Docker網(wǎng)絡(luò)簡(jiǎn)單先說(shuō)這么多,后續(xù)根據(jù)實(shí)際應(yīng)用場(chǎng)景再好好細(xì)說(shuō),這里主要的目的是了解一下默認(rèn)的網(wǎng)絡(luò)模式和自定義網(wǎng)絡(luò)方式的使用和解決的問(wèn)題。

Docker之前文章目錄:

  • Docker小白到實(shí)戰(zhàn)之開(kāi)篇概述

  • Docker小白到實(shí)戰(zhàn)之常用命令演示,通俗易懂

  • Docker小白到實(shí)戰(zhàn)之容器數(shù)據(jù)卷,整理的明明白白

  • Docker小白到實(shí)戰(zhàn)之Dockerfile解析及實(shí)戰(zhàn)演示,果然順手

  • 到目前為止,一般的Docker使用沒(méi)問(wèn)題了,但當(dāng)容器比較多時(shí),一個(gè)一個(gè)的拉取鏡像和啟動(dòng)容器就顯得有點(diǎn)不方便了,所以下次我們來(lái)學(xué)學(xué)Docker Compose,關(guān)注“Code綜藝圈”,和我一起學(xué)習(xí)吧;最后祝小伙伴們中秋快樂(lè)~~~

    總結(jié)

    以上是生活随笔為你收集整理的Docker小白到实战之Docker网络简单了解一下的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。