2023年1月7日 星期六

docker 網路

 docker network ls  默認創建以下網路模式

bridge--為每一個容器分配、設置IP等,並將容器連接到一個docker0的虛擬網橋,默認為該模式

使用--network bridge指定,默認使用docker0

---------------------------

host--容器將不會虛擬出仔己的網咖,配置自己的IP等,而是使用宿主機的IP和端口

使用--network host指定

--------------------------

none--容器有獨立的network namespace,但並沒有對其進行任何網路設置,如分配veth pair和網橋連接,IP等

使用--network none指定

----------------------------

container--新創見的容器不會創建自己的網髂和配置自己的IP,而是和一個指定的容器共享IP端口範圍等

使用--network container:NAME或是容器ID指定

-----------------------------

自建

--------------------------------------------------------------

列出網路

docker network ls

------------------------------------------------------------------

自建網路

docker network create 網路名稱

例如:docker network create aa_network         aa_network 默認網橋模式(bridge)

--------------------------------------------------------------------

刪除網路

docker network rm 網路名稱

例如:docker network rm aa_network

----------------------------------------------------------------------

列出網路明細(數據源)

docker network inspect 網路名稱

例如:docker network inspect bridge

----------------------------------------------------------------------

容器IP變動時,可以通過服務名稱直接網路通信而不受到影響--也就是說要有服務名稱,當容器IP變更時,不受其影響,只要服務名稱不變即可

-------------------------------------------

例如

docker run -it --name u1 ubuntu bash

docker inspect u1   看網路,內定bridge

            "Networks": {

                "bridge": {

                    "IPAMConfig": null,

                    "Links": null,

                    "Aliases": null,

                    "NetworkID": "16b96c434cc7a5a0200e9fc57ce35bf8d7c863865d30d9edf4ff79e5dfc8c415",

                    "EndpointID": "d52c26e1c2b0113499dab785cec3eefa260b0f268174d9003ae88566328de4c1",

                    "Gateway": "172.17.0.1",

                    "IPAddress": "172.17.0.2",

因inspect太多資訊可以下docker inspect u1 | tail -n 20  --列出最後20行

---------------------------------------------------------

bridge模式

Host 網路-->en33

docker0網路-->vethxxxx@ifzz

container網路-->eth0@ifyy

-------------------------------------------------------

host模式

container網路-->Host網路  --與HOST共用網路

例如:

docker run -d -p 8083:8080 --network host --name tomcat83 billygoo/tomcat8-jdk8  --會警告

docker run -d                        --network host --name tomcat83 billygoo/tomcat8-jdk8 --正確

訪問container -->http://宿主機IP:8080

容器IP借用宿主機的IP

------------------------------------------

none模式(少用)

禁用網路功能,只有lo標誌(127.0.0.1) -->進入container中,打ip addr

------------------------------------------

container模式

使用--network container:NAME或者容器ID指定

錯誤範例

docker run  -d  -p 8081:8080                                                         --name tomcat81 billygoo/tomcat8-jdk8

docker run  -d  -p 8082:8080  --network container:tomcat85  --name tomcat82 billygoo/tomcat8-jdk8

會出現問題,相當於tomcat82tomcat81公用同一個ip同一個端口,導致端口沖突

正確範例

docker run  -it                                                    --name alpine1 alpine /bin/sh

docker run  -it  --network container:alpine1  --name alpine2 alpine /bin/sh

假如此時關閉alpine1,再看看alpine2,網路剩lo

----------------------------------------------------

網路自定義

未使用網路名

docker run  -d  -p 8081:8080    --name tomcat81 billygoo/tomcat8-jdk8

docker run  -d  -p 8082:8080    --name tomcat82 billygoo/tomcat8-jdk8

上述成功啟動後用docker exec入各自容器

按照IP地址pingOK的,但按照服ping出現Name or service not know,且容器IP會因容器關閉後重啟後有所改變

使用網路名

自定義橋網路,自定網路使用的是網路bridge

新建自定義網路

例如

docker   network create abc_network

docker run  -d  -p 8081:8080  --network abc_network  --name tomcat81 billygoo/tomcat8-jdk8

docker run  -d  -p 8082:8080  --network abc_network  --name tomcat82 billygoo/tomcat8-jdk8

成功啟動後用docker exec入各自容器

按照IP地址pingOK的,但按照服ping也是OK

自定義網路本身就維護好了主名和ip對應關係(ip和域名都能通)





沒有留言:

張貼留言