Docker網(wǎng)絡(luò)配置與自定義IP容器通信
前言
當(dāng)項(xiàng)目大規(guī)模使用 Docker 時(shí),容器通信的問題也就產(chǎn)生了。要解決容器通信問題,必須先了解很多關(guān)于網(wǎng)絡(luò)的知識(shí)。Docker 作為目前最火的輕量級(jí)容器技術(shù),有很多令人稱道的功能,如 Docker 的鏡像管理。然而,Docker 同樣有著很多不完善的地方,網(wǎng)絡(luò)方面就是 Docker 比較薄弱的部分。因此,我們有必要深入了解 Docker 的網(wǎng)絡(luò)知識(shí),以滿足更高的網(wǎng)絡(luò)需求。
互聯(lián)網(wǎng)是由許多小型網(wǎng)絡(luò)構(gòu)成的,每個(gè)網(wǎng)絡(luò)上都有許多主機(jī),這樣便構(gòu)成了一個(gè)有層次的結(jié)構(gòu)。 IP地址在設(shè)計(jì)時(shí)就考慮到地址分配的層次特點(diǎn),將每個(gè)IP地址都分割成網(wǎng)絡(luò)號(hào)和主機(jī)號(hào)兩部分,以便于 IP地址的尋址操作。
1、子網(wǎng)掩碼
子網(wǎng)掩碼用于劃分網(wǎng)絡(luò)和主機(jī)部分。子網(wǎng)掩碼用來區(qū)分一個(gè)IP地址中的網(wǎng)絡(luò)地址和主機(jī)地址部分,幫助進(jìn)行網(wǎng)絡(luò)分割和管理。
組成規(guī)則:
- 子網(wǎng)掩碼由32位組成,通常表示為4個(gè)8位的數(shù)字(例如255.255.255.0)。
- 在子網(wǎng)掩碼中,連續(xù)的“1”代表網(wǎng)絡(luò)部分,而連續(xù)的“0”則代表主機(jī)部分。
- 例如,子網(wǎng)掩碼255.255.255.0表示前24位是網(wǎng)絡(luò)地址,最后8位是主機(jī)地址。
2、網(wǎng)關(guān)
網(wǎng)關(guān)通常指的是兩個(gè)網(wǎng)絡(luò)之間的接口設(shè)備,它可以在不同的網(wǎng)絡(luò)或子網(wǎng)間轉(zhuǎn)發(fā)數(shù)據(jù)。
作用:
- 網(wǎng)關(guān)可以將來自一個(gè)網(wǎng)絡(luò)的數(shù)據(jù)包轉(zhuǎn)發(fā)到另一個(gè)網(wǎng)絡(luò)。
- 它通常用于連接本地網(wǎng)絡(luò)(LAN)和大型網(wǎng)絡(luò)(如互聯(lián)網(wǎng))。
當(dāng)一個(gè)網(wǎng)絡(luò)中的設(shè)備需要與另一個(gè)網(wǎng)絡(luò)中的設(shè)備通信時(shí),數(shù)據(jù)包首先發(fā)送到網(wǎng)關(guān)。然后,網(wǎng)關(guān)判斷如何將數(shù)據(jù)包發(fā)送到目的地。
3、子網(wǎng)掩碼和網(wǎng)關(guān)的關(guān)系
- 子網(wǎng)掩碼用于確定網(wǎng)絡(luò)的范圍,而網(wǎng)關(guān)則用于在不同網(wǎng)絡(luò)間轉(zhuǎn)發(fā)數(shù)據(jù)。
- 在配置網(wǎng)絡(luò)設(shè)備(如路由器、電腦等)時(shí),通常需要同時(shí)設(shè)置子網(wǎng)掩碼和網(wǎng)關(guān)地址,以確保設(shè)備能正確地與其他網(wǎng)絡(luò)通信。
計(jì)算機(jī)的IP地址是互聯(lián)網(wǎng)上每臺(tái)計(jì)算機(jī)或設(shè)備唯一的標(biāo)識(shí)符。在目前廣泛使用的兩個(gè)版本中,IPv4地址由32位組成,而IPv6地址由128位組成。下面將重點(diǎn)介紹IPv4地址,因?yàn)樗鼮槌S谩?/p>
IPv4地址:
組成:IPv4地址由32位二進(jìn)制數(shù)字組成,通常分為4個(gè)8位的部分,每部分稱為一個(gè)八位字節(jié)(或octet)。例如,一個(gè)IPv4地址在二進(jìn)制格式下可能看起來像這樣:11000000.10101000.00000001.00000001
。
十進(jìn)制表示:為了便于閱讀,IPv4地址通常轉(zhuǎn)換為十進(jìn)制格式,并用點(diǎn)分隔。例如,上面的二進(jìn)制地址可以轉(zhuǎn)換為十進(jìn)制表示為:192.168.1.1
。
地址分類:IPv4地址分為幾個(gè)類別:A、B、C、D和E類。
- A類地址用于大型網(wǎng)絡(luò),其第一個(gè)八位字節(jié)的范圍是0-127。
- B類地址用于中型網(wǎng)絡(luò),其第一個(gè)八位字節(jié)的范圍是128-191。
- C類地址用于小型網(wǎng)絡(luò),其第一個(gè)八位字節(jié)的范圍是192-223。
- D類地址用于多播,E類地址保留用于實(shí)驗(yàn)。
網(wǎng)絡(luò)地址和主機(jī)地址:
在一個(gè)IP地址中,部分八位字節(jié)用來表示網(wǎng)絡(luò)地址,其余部分表示主機(jī)地址。子網(wǎng)掩碼用于區(qū)分這兩部分。例如,在子網(wǎng)掩碼255.255.255.0下,IP地址192.168.1.1的前三個(gè)八位字節(jié)表示網(wǎng)絡(luò)地址,最后一個(gè)八位字節(jié)表示主機(jī)地址。
特殊地址:
某些IP地址有特殊用途,例如127.0.0.1通常用作回環(huán)地址,用于指向本機(jī)。私有地址范圍(如192.168.x.x, 10.x.x.x, 172.16.x.x - 172.31.x.x)在內(nèi)部網(wǎng)絡(luò)中使用,但不在互聯(lián)網(wǎng)上路由。
IPv6地址:
組成:IPv6地址由128位二進(jìn)制數(shù)字組成,通常分為8組,每組4個(gè)十六進(jìn)制數(shù)字。
表示方式:例如,一個(gè)IPv6地址可能看起來像這樣:2001:0db8:85a3:0000:0000:8a2e:0370:7334
。
IPv6地址能夠提供比IPv4更多的地址空間,應(yīng)對(duì)互聯(lián)網(wǎng)地址耗盡的問題。
一、docker網(wǎng)絡(luò)配置
當(dāng)你安裝了docker,它會(huì)自動(dòng)創(chuàng)建3個(gè)網(wǎng)絡(luò),可以使用 docker network ls 命令來查看
- bridge --網(wǎng)橋
- host --主機(jī)(本地)
- none --無網(wǎng)絡(luò)
- container --共享
當(dāng)你運(yùn)行一個(gè)容器的時(shí)候,可以使用--network參數(shù)來指定你的容器連接到哪一個(gè)網(wǎng)絡(luò)。
查看容器網(wǎng)絡(luò)指令:
- ip addr
- ifconfig
1. bridge 虛擬網(wǎng)橋
為每一個(gè)容器分配、設(shè)置IP等,當(dāng)Docker進(jìn)程啟動(dòng)時(shí),會(huì)在主機(jī)上創(chuàng)建一個(gè)名為docker0的虛擬網(wǎng)橋,此主機(jī)上啟動(dòng)的Docker容器會(huì)連接到這個(gè)虛擬網(wǎng)橋上(默認(rèn)模式)。
虛擬網(wǎng)橋的工作方式和物理交換機(jī)類似,這樣主機(jī)上的所有容器就通過交換機(jī)連在了一個(gè)二層網(wǎng)絡(luò)中:
從docker0子網(wǎng)中分配一個(gè)IP給容器使用,并設(shè)置docker0的IP地址為容器的默認(rèn)網(wǎng)關(guān)。 在主機(jī)上創(chuàng)建一對(duì)虛擬網(wǎng)卡veth pair設(shè)備,Docker將veth pair設(shè)備的一端放在新創(chuàng)建的容器中,并命名 為eth0(容器的網(wǎng)卡),另一端放在主機(jī)中,以vethxxx這樣類似的名字命名,并將這個(gè)網(wǎng)絡(luò)設(shè)備加入 到docker0網(wǎng)橋中。
查看一個(gè)名為t1的容器(原tomcat)bridge網(wǎng)絡(luò)信息:
docker inspect t1
可以看到它網(wǎng)橋是172.17.0.2,它的網(wǎng)關(guān)是172.17.0.1,網(wǎng)絡(luò)模式是bridge。
示例:
運(yùn)行一個(gè)鏡像未指定網(wǎng)絡(luò)模式(默認(rèn)bridge)
docker run -itd --name spring -p 8081:8080 spring:v1
注意:-p參數(shù)可以出現(xiàn)多次,綁定多個(gè)端口號(hào) ,就意味著外部可以通過多個(gè)端口號(hào)訪問到8080
2. host 網(wǎng)絡(luò)模式
- host 網(wǎng)絡(luò)模式需要在創(chuàng)建容器時(shí)通過參數(shù)
--net host
或者--network host
指定; - 采用 host 網(wǎng)絡(luò)模式的 Docker Container,可以直接使用宿主機(jī)的 IP 地址與外界進(jìn)行通信,若宿主機(jī)的 eth0 是一個(gè)公有 IP,那么容器也擁有這個(gè)公有 IP。同時(shí)容器內(nèi)服務(wù)的端口也可以使用宿主機(jī)的端口,無需額外進(jìn)行 NAT 轉(zhuǎn)換;
- host 網(wǎng)絡(luò)模式可以讓容器共享宿主機(jī)網(wǎng)絡(luò)棧,這樣的好處是外部主機(jī)與容器直接通信,但是容器的網(wǎng)絡(luò)缺少隔離性。
示例:
運(yùn)行一個(gè)鏡像指定host網(wǎng)絡(luò)模式
docker run -itd --name spring2 --net=host spring:v1
這時(shí)只能通過主機(jī)端口8080才能訪問了
3. none 網(wǎng)絡(luò)模式
- none 網(wǎng)絡(luò)模式是指禁用網(wǎng)絡(luò)功能,只有 lo 接口 local 的簡(jiǎn)寫,代表 127.0.0.1,即 localhost 本地環(huán)回接口。在創(chuàng)建容器時(shí)通過參數(shù)
--net none
或者--network none
指定; - none 網(wǎng)絡(luò)模式即不為 Docker Container 創(chuàng)建任何的網(wǎng)絡(luò)環(huán)境,容器內(nèi)部就只能使用 loopback 網(wǎng)絡(luò)設(shè)備,不會(huì)再有其他的網(wǎng)絡(luò)資源??梢哉f none 模式為 Docke Container 做了極少的網(wǎng)絡(luò)設(shè)定,但是俗話說得好“少即是多”,在沒有網(wǎng)絡(luò)配置的情況下,作為 Docker 開發(fā)者,才能在這基礎(chǔ)做其他無限多可能的網(wǎng)絡(luò)定制開發(fā)。這也恰巧體現(xiàn)了 Docker 設(shè)計(jì)理念的開放。
4. 自定義container網(wǎng)絡(luò)模式
- Container 網(wǎng)絡(luò)模式是 Docker 中一種較為特別的網(wǎng)絡(luò)的模式。在創(chuàng)建容器時(shí)通過參數(shù)
--net container:已運(yùn)行的容器名稱|ID
或者--network container:已運(yùn)行的容器名稱|ID
指定; - 處于這個(gè)模式下的 Docker 容器會(huì)共享一個(gè)網(wǎng)絡(luò)棧,這樣兩個(gè)容器之間可以使用 localhost 高效快速通信。
Container 網(wǎng)絡(luò)模式即新創(chuàng)建的容器不會(huì)創(chuàng)建自己的網(wǎng)卡,配置自己的 IP,而是和一個(gè)指定的容器共享 IP、端口范圍等。同樣兩個(gè)容器除了網(wǎng)絡(luò)方面相同之外,其他的如文件系統(tǒng)、進(jìn)程列表等還是隔離的。
二、自定義IP容器通信
1. 自定義IP
需要先創(chuàng)建一個(gè)網(wǎng)絡(luò)
docker network create --gateway 172.18.0.1 --subnet 172.18.0.0/16(端口) net(網(wǎng)絡(luò)名)
查看網(wǎng)絡(luò)信息:docker inspect net
2. 創(chuàng)建所需容器(mysql,tomcat)
I. 創(chuàng)建tomcat容器(指定IP與網(wǎng)絡(luò))
docker run -it --name tm \ -p 8080:8080 \ -v /test:/usr/local/tomcat/webapps \ --net net \ --ip 172.18.0.2 \ tomcat:8.5.20
II. 創(chuàng)建mysql容器(指定IP與網(wǎng)絡(luò))
創(chuàng)建存放mysel數(shù)據(jù)的文件夾
mkdir -p /mysql/{conf,data}
并創(chuàng)建my.cnf配置文件到conf目錄
my.cnf內(nèi)容:
[client] default-character-set=utf8 [mysql] default-character-set=utf8 [mysqld] # Remove leading # and set to the amount of RAM for the most important data # cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%. # innodb_buffer_pool_size = 128M # # Remove leading # to turn on a very important data integrity option: logging # changes to the binary log between backups. # log_bin # # Remove leading # to set options mainly useful for reporting servers. # The server defaults are faster for transactions and fast SELECTs. # Adjust sizes as needed, experiment to find the optimal values. # join_buffer_size = 128M # sort_buffer_size = 2M # read_rnd_buffer_size = 2M skip-host-cache skip-name-resolve datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock secure-file-priv=/var/lib/mysql-files user=mysql # Disabling symbolic-links is recommended to prevent assorted security risks symbolic-links=0 log-error=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid init_connect='SET collation_connection = utf8_unicode_ci' init_connect='SET NAMES utf8' character-set-server=utf8 collation-server=utf8_unicode_ci skip-character-set-client-handshake # default: sql_mode= STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION # modeified: sql_mode= STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION max_allowed_packet=10M default-time_zone='+8:00' default_authentication_plugin=mysql_native_password
1、創(chuàng)建mysql容器:
docker run \ --name m1 \ -v /mysql/conf/my.cnf:/etc/my.cnf \ -v /mysql/data:/var/lib/mysql \ --privileged=true \ -e MYSQL_ROOT_PASSWORD=123456 \ --net net \ --ip 172.18.0.3 \ -d mysql/mysql-server:5.7
首先進(jìn)入mysql容器進(jìn)行登錄,添加用戶(遠(yuǎn)程連接)賦予權(quán)限,最后退出重啟容器。
2、創(chuàng)建數(shù)據(jù)庫(kù)
由于之前將mysql數(shù)據(jù)掛載到了var/lib/mysql,所以我們只需要把sql腳本放在宿主機(jī)目錄即可,而掛載的目錄也會(huì)生成一樣的文件
運(yùn)行sql腳本全操作:
查看數(shù)據(jù)表:show tables (退回mysql后記得重啟哦)
3. 準(zhǔn)備項(xiàng)目資源
這是一個(gè)前后端分離項(xiàng)目,啟動(dòng)項(xiàng)目需要修改配置信息
application.yml:
項(xiàng)目資源:
Dockerfile:
1、構(gòu)建鏡像
docker build -t spring:v1.0 .
根據(jù)鏡像創(chuàng)建啟動(dòng)容器并指定IP地址
docker run -itd --name s1 --net net --ip 172.18.0.101 spring:v1.0 docker run -itd --name s2 --net net --ip 172.18.0.102 spring:v1.0 docker run -itd --name s3 --net net --ip 172.18.0.103 spring:v1.0
查看日志 docker log s1(已啟動(dòng)成功)
4. 構(gòu)建Nginx實(shí)現(xiàn)負(fù)載均衡
首先創(chuàng)建nginx的配置文件目錄并將配置文件放入
mkdir -p /soft/nginx/conf.d
靜態(tài)資源:
default.conf:這里的服務(wù)器的集群和我們的Tomcat容器IP一致
#服務(wù)器的集群 upstream tomcatList { server 172.18.0.101:8080 weight=1; server 172.18.0.102:8080 weight=1; server 172.18.0.103:8080 weight=1; } server { listen 80; server_name www.ycxw.com; location / { root /etc/nginx/html/; index index.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } location ~^/api/ { rewrite ^/api/(.*)$ /$1 break; proxy_pass http://tomcatList; proxy_redirect default; } }
構(gòu)建nginx容器
docker run -itd \ --name n1 \ -v /test/nginx/conf.d:/etc/nginx/conf.d \ -v /test/nginx/html:/etc/nginx/html \ -p 80:80 \ --net net \ --ip 172.18.0.105 \ nginx
啟動(dòng)項(xiàng)目測(cè)試:
測(cè)試負(fù)載均衡:停了兩臺(tái)服務(wù)器
還能運(yùn)行:
到此這篇關(guān)于Docker網(wǎng)絡(luò)配置與自定義IP容器通信的文章就介紹到這了,更多相關(guān)Docker 自定義IP容器通信內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 在Docker容器之間如何進(jìn)行通信
- Docker?容器跨主機(jī)通信?overlay的詳細(xì)步驟
- Docker 容器之間的互相通信實(shí)現(xiàn)示例
- Docker容器跨主機(jī)通信overlay網(wǎng)絡(luò)的解決方案
- Docker容器之間的通信的方法實(shí)現(xiàn)
- Docker容器間通信與外網(wǎng)通信的操作
- Docker容器連接相互通信的實(shí)現(xiàn)
- 詳解Docker 容器跨主機(jī)多網(wǎng)段通信解決方案
- Docker跨主機(jī)容器通信overlay實(shí)現(xiàn)過程詳解
- 詳解Docker容器跨主機(jī)通信的方法
- docker多個(gè)容器的相互通信實(shí)現(xiàn)步驟
相關(guān)文章
如何搭建配置Docker私有倉(cāng)庫(kù)的實(shí)現(xiàn)步驟
本文主要介紹了如何搭建配置Docker私有倉(cāng)庫(kù)的實(shí)現(xiàn)步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07通過Docker安裝啟動(dòng)DB2在Spring?Boot整合DB2的方法
DB2是IBM的一款優(yōu)秀的關(guān)系型數(shù)據(jù)庫(kù),這篇文章主要介紹了通過Docker啟動(dòng)DB2,并在Spring?Boot整合DB2,需要的朋友可以參考下2023-01-01如何使用Docker恢復(fù)Mysql8備份的Data數(shù)據(jù)
這篇文章主要介紹了使用Docker恢復(fù)Mysql8備份的Data數(shù)據(jù),下面小編給大家講解下操作方法,對(duì)Docker恢復(fù)Mysql數(shù)據(jù)備份相關(guān)知識(shí)感興趣的朋友跟隨小編一起看看吧2022-11-11vscode中啟用docker擴(kuò)展顯示無權(quán)限的問題解決
這篇文章主要介紹了如何解決vscode中啟用docker擴(kuò)展顯示無權(quán)限的問題,并介紹允許VSCode進(jìn)入Docker內(nèi)部進(jìn)行調(diào)試的插件,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-03-03