Docker網(wǎng)絡(luò)配置與自定義IP容器通信
前言
當(dāng)項目大規(guī)模使用 Docker 時,容器通信的問題也就產(chǎn)生了。要解決容器通信問題,必須先了解很多關(guān)于網(wǎng)絡(luò)的知識。Docker 作為目前最火的輕量級容器技術(shù),有很多令人稱道的功能,如 Docker 的鏡像管理。然而,Docker 同樣有著很多不完善的地方,網(wǎng)絡(luò)方面就是 Docker 比較薄弱的部分。因此,我們有必要深入了解 Docker 的網(wǎng)絡(luò)知識,以滿足更高的網(wǎng)絡(luò)需求。
互聯(lián)網(wǎng)是由許多小型網(wǎng)絡(luò)構(gòu)成的,每個網(wǎng)絡(luò)上都有許多主機,這樣便構(gòu)成了一個有層次的結(jié)構(gòu)。 IP地址在設(shè)計時就考慮到地址分配的層次特點,將每個IP地址都分割成網(wǎng)絡(luò)號和主機號兩部分,以便于 IP地址的尋址操作。
1、子網(wǎng)掩碼
子網(wǎng)掩碼用于劃分網(wǎng)絡(luò)和主機部分。子網(wǎng)掩碼用來區(qū)分一個IP地址中的網(wǎng)絡(luò)地址和主機地址部分,幫助進(jìn)行網(wǎng)絡(luò)分割和管理。
組成規(guī)則:
- 子網(wǎng)掩碼由32位組成,通常表示為4個8位的數(shù)字(例如255.255.255.0)。
- 在子網(wǎng)掩碼中,連續(xù)的“1”代表網(wǎng)絡(luò)部分,而連續(xù)的“0”則代表主機部分。
- 例如,子網(wǎng)掩碼255.255.255.0表示前24位是網(wǎng)絡(luò)地址,最后8位是主機地址。
2、網(wǎng)關(guān)
網(wǎng)關(guān)通常指的是兩個網(wǎng)絡(luò)之間的接口設(shè)備,它可以在不同的網(wǎng)絡(luò)或子網(wǎng)間轉(zhuǎn)發(fā)數(shù)據(jù)。
作用:
- 網(wǎng)關(guān)可以將來自一個網(wǎng)絡(luò)的數(shù)據(jù)包轉(zhuǎn)發(fā)到另一個網(wǎng)絡(luò)。
- 它通常用于連接本地網(wǎng)絡(luò)(LAN)和大型網(wǎng)絡(luò)(如互聯(lián)網(wǎng))。
當(dāng)一個網(wǎng)絡(luò)中的設(shè)備需要與另一個網(wǎng)絡(luò)中的設(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è)置子網(wǎng)掩碼和網(wǎng)關(guān)地址,以確保設(shè)備能正確地與其他網(wǎng)絡(luò)通信。
計算機的IP地址是互聯(lián)網(wǎng)上每臺計算機或設(shè)備唯一的標(biāo)識符。在目前廣泛使用的兩個版本中,IPv4地址由32位組成,而IPv6地址由128位組成。下面將重點介紹IPv4地址,因為它更為常用。
IPv4地址:
組成:IPv4地址由32位二進(jìn)制數(shù)字組成,通常分為4個8位的部分,每部分稱為一個八位字節(jié)(或octet)。例如,一個IPv4地址在二進(jìn)制格式下可能看起來像這樣:11000000.10101000.00000001.00000001
。
十進(jìn)制表示:為了便于閱讀,IPv4地址通常轉(zhuǎn)換為十進(jìn)制格式,并用點分隔。例如,上面的二進(jìn)制地址可以轉(zhuǎn)換為十進(jìn)制表示為:192.168.1.1
。
地址分類:IPv4地址分為幾個類別:A、B、C、D和E類。
- A類地址用于大型網(wǎng)絡(luò),其第一個八位字節(jié)的范圍是0-127。
- B類地址用于中型網(wǎng)絡(luò),其第一個八位字節(jié)的范圍是128-191。
- C類地址用于小型網(wǎng)絡(luò),其第一個八位字節(jié)的范圍是192-223。
- D類地址用于多播,E類地址保留用于實驗。
網(wǎng)絡(luò)地址和主機地址:
在一個IP地址中,部分八位字節(jié)用來表示網(wǎng)絡(luò)地址,其余部分表示主機地址。子網(wǎng)掩碼用于區(qū)分這兩部分。例如,在子網(wǎng)掩碼255.255.255.0下,IP地址192.168.1.1的前三個八位字節(jié)表示網(wǎng)絡(luò)地址,最后一個八位字節(jié)表示主機地址。
特殊地址:
某些IP地址有特殊用途,例如127.0.0.1通常用作回環(huán)地址,用于指向本機。私有地址范圍(如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個十六進(jìn)制數(shù)字。
表示方式:例如,一個IPv6地址可能看起來像這樣:2001:0db8:85a3:0000:0000:8a2e:0370:7334
。
IPv6地址能夠提供比IPv4更多的地址空間,應(yīng)對互聯(lián)網(wǎng)地址耗盡的問題。
一、docker網(wǎng)絡(luò)配置
當(dāng)你安裝了docker,它會自動創(chuàng)建3個網(wǎng)絡(luò),可以使用 docker network ls 命令來查看
- bridge --網(wǎng)橋
- host --主機(本地)
- none --無網(wǎng)絡(luò)
- container --共享
當(dāng)你運行一個容器的時候,可以使用--network參數(shù)來指定你的容器連接到哪一個網(wǎng)絡(luò)。
查看容器網(wǎng)絡(luò)指令:
- ip addr
- ifconfig
1. bridge 虛擬網(wǎng)橋
為每一個容器分配、設(shè)置IP等,當(dāng)Docker進(jìn)程啟動時,會在主機上創(chuàng)建一個名為docker0的虛擬網(wǎng)橋,此主機上啟動的Docker容器會連接到這個虛擬網(wǎng)橋上(默認(rèn)模式)。
虛擬網(wǎng)橋的工作方式和物理交換機類似,這樣主機上的所有容器就通過交換機連在了一個二層網(wǎng)絡(luò)中:
從docker0子網(wǎng)中分配一個IP給容器使用,并設(shè)置docker0的IP地址為容器的默認(rèn)網(wǎng)關(guān)。 在主機上創(chuàng)建一對虛擬網(wǎng)卡veth pair設(shè)備,Docker將veth pair設(shè)備的一端放在新創(chuàng)建的容器中,并命名 為eth0(容器的網(wǎng)卡),另一端放在主機中,以vethxxx這樣類似的名字命名,并將這個網(wǎng)絡(luò)設(shè)備加入 到docker0網(wǎng)橋中。
查看一個名為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。
示例:
運行一個鏡像未指定網(wǎng)絡(luò)模式(默認(rèn)bridge)
docker run -itd --name spring -p 8081:8080 spring:v1
注意:-p參數(shù)可以出現(xiàn)多次,綁定多個端口號 ,就意味著外部可以通過多個端口號訪問到8080
2. host 網(wǎng)絡(luò)模式
- host 網(wǎng)絡(luò)模式需要在創(chuàng)建容器時通過參數(shù)
--net host
或者--network host
指定; - 采用 host 網(wǎng)絡(luò)模式的 Docker Container,可以直接使用宿主機的 IP 地址與外界進(jìn)行通信,若宿主機的 eth0 是一個公有 IP,那么容器也擁有這個公有 IP。同時容器內(nèi)服務(wù)的端口也可以使用宿主機的端口,無需額外進(jìn)行 NAT 轉(zhuǎn)換;
- host 網(wǎng)絡(luò)模式可以讓容器共享宿主機網(wǎng)絡(luò)棧,這樣的好處是外部主機與容器直接通信,但是容器的網(wǎng)絡(luò)缺少隔離性。
示例:
運行一個鏡像指定host網(wǎng)絡(luò)模式
docker run -itd --name spring2 --net=host spring:v1
這時只能通過主機端口8080才能訪問了
3. none 網(wǎng)絡(luò)模式
- none 網(wǎng)絡(luò)模式是指禁用網(wǎng)絡(luò)功能,只有 lo 接口 local 的簡寫,代表 127.0.0.1,即 localhost 本地環(huán)回接口。在創(chuàng)建容器時通過參數(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è)備,不會再有其他的網(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è)計理念的開放。
4. 自定義container網(wǎng)絡(luò)模式
- Container 網(wǎng)絡(luò)模式是 Docker 中一種較為特別的網(wǎng)絡(luò)的模式。在創(chuàng)建容器時通過參數(shù)
--net container:已運行的容器名稱|ID
或者--network container:已運行的容器名稱|ID
指定; - 處于這個模式下的 Docker 容器會共享一個網(wǎng)絡(luò)棧,這樣兩個容器之間可以使用 localhost 高效快速通信。
Container 網(wǎng)絡(luò)模式即新創(chuàng)建的容器不會創(chuàng)建自己的網(wǎng)卡,配置自己的 IP,而是和一個指定的容器共享 IP、端口范圍等。同樣兩個容器除了網(wǎng)絡(luò)方面相同之外,其他的如文件系統(tǒng)、進(jìn)程列表等還是隔離的。
二、自定義IP容器通信
1. 自定義IP
需要先創(chuàng)建一個網(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ù)庫
由于之前將mysql數(shù)據(jù)掛載到了var/lib/mysql,所以我們只需要把sql腳本放在宿主機目錄即可,而掛載的目錄也會生成一樣的文件
運行sql腳本全操作:
查看數(shù)據(jù)表:show tables (退回mysql后記得重啟哦)
3. 準(zhǔn)備項目資源
這是一個前后端分離項目,啟動項目需要修改配置信息
application.yml:
項目資源:
Dockerfile:
1、構(gòu)建鏡像
docker build -t spring:v1.0 .
根據(jù)鏡像創(chuà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(已啟動成功)
4. 構(gòu)建Nginx實現(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
啟動項目測試:
測試負(fù)載均衡:停了兩臺服務(wù)器
還能運行:
到此這篇關(guān)于Docker網(wǎng)絡(luò)配置與自定義IP容器通信的文章就介紹到這了,更多相關(guān)Docker 自定義IP容器通信內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
通過Docker安裝啟動DB2在Spring?Boot整合DB2的方法
DB2是IBM的一款優(yōu)秀的關(guān)系型數(shù)據(jù)庫,這篇文章主要介紹了通過Docker啟動DB2,并在Spring?Boot整合DB2,需要的朋友可以參考下2023-01-01如何使用Docker恢復(fù)Mysql8備份的Data數(shù)據(jù)
這篇文章主要介紹了使用Docker恢復(fù)Mysql8備份的Data數(shù)據(jù),下面小編給大家講解下操作方法,對Docker恢復(fù)Mysql數(shù)據(jù)備份相關(guān)知識感興趣的朋友跟隨小編一起看看吧2022-11-11vscode中啟用docker擴展顯示無權(quán)限的問題解決
這篇文章主要介紹了如何解決vscode中啟用docker擴展顯示無權(quán)限的問題,并介紹允許VSCode進(jìn)入Docker內(nèi)部進(jìn)行調(diào)試的插件,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-03-03