## docker網絡原理
1.linux環境使用ip addr查看網絡

2.啟動一個docker服務,然后查看容器的網絡

3.此時查看linux網絡

同時發現容器間和linux之間都可以相互ping通(說明容器間可以通過ip直接互聯)
原理:我們每啟動一個docker容器,docker都會給docker容器分配一個ip,只要我們安裝了docker,就會有一個網卡docker0(docker0特點:是默認的,但是域名不能訪問,使用--link可以打通連接),橋接模式,使用的技術是evth-pair技術(evth-pair 就是一對虛擬的設備接口,他們都是成對出現的,一端連著協議,一端彼此相連,正因為這個特性,evth-pair充當一個橋梁,連接各種虛擬網絡設備。)
## docker容器互聯
~~~
啟動tomcat1容器:docker run -d -P --name tomcat1 tomcat
啟動tomcat2容器:docker run -d -P --name tomcat2 tomcat
tomcat2 ping tomcat1:docker exec -it tomcat2 ping tomcat1
結論:ping不通,找不到該服務
啟動tomcat1容器:docker run -d -P --name tomcat1 tomcat
啟動tomcat2容器:docker run -d -P --name tomcat2 --link tomcat1 tomcat
tomcat2 ping tomcat1:docker exec -it tomcat2 ping tomcat1
結論:ping通
但是使用tomcat1 ping tomcat2仍然ping不通
~~~
查看容器hosts發現

\--link本質就是在hosts文件中增加了一個映射
## docker自定義網絡
查看所有的docker網絡

網絡模式:
bridge:橋接模式(默認docker啟動容器時會有參數--net bridge)
none:不配置網絡
host:和宿主機共享網絡
container:容器網絡連通(用的很少,局限很大)
自定義一個網絡
~~~
C:\Users\wzj>docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
33de0d356ebb6b099b630c00902436205d3afa702ac8e0bcab993be616d7d8a9
參數:
--driver bridge
--subnet 192.168.0.0/16
--gateway 192.168.0.1
C:\Users\wzj>docker network ls
NETWORK ID NAME DRIVER SCOPE
d15df6050eb8 bridge bridge local
b41c5bfa2a72 host host local
33de0d356ebb mynet bridge local
13fb56116fbd none null local
~~~

使用自己的網絡創建容器
~~~
C:\Users\wzj>docker run -d -P --name tomcat1 --net mynet tomcat
56535903fbf8043e764bac919e82f79898ddaa2d68dea741317870106934bfac
C:\Users\wzj>docker run -d -P --name tomcat2 --net mynet tomcat
b3851940ef6189a0ac5e7abb48626c0fe9bb0cfda1c443671d52144522e11c92
C:\Users\wzj>docker network inspect mynet
[
{
"Name": "mynet",
"Id": "33de0d356ebb6b099b630c00902436205d3afa702ac8e0bcab993be616d7d8a9",
"Created": "2020-11-26T09:51:36.8522108Z",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "192.168.0.0/16",
"Gateway": "192.168.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {
"56535903fbf8043e764bac919e82f79898ddaa2d68dea741317870106934bfac": {
"Name": "tomcat1",
"EndpointID": "361bf66c78acb786596f07c06275ceb1332659e7bf5344d5235088e2d0af9323",
"MacAddress": "02:42:c0:a8:00:02",
"IPv4Address": "192.168.0.2/16",
"IPv6Address": ""
},
"b3851940ef6189a0ac5e7abb48626c0fe9bb0cfda1c443671d52144522e11c92": {
"Name": "tomcat2",
"EndpointID": "e80cf7b43ac193156965fc7ac027fa1488013bd9bcdbe1aef2cc84f24240f591",
"MacAddress": "02:42:c0:a8:00:03",
"IPv4Address": "192.168.0.3/16",
"IPv6Address": ""
}
},
"Options": {},
"Labels": {}
}
]
C:\Users\wzj>docker exec -it tomcat1 ping 192.168.0.3
PING 192.168.0.3 (192.168.0.3) 56(84) bytes of data.
64 bytes from 192.168.0.3: icmp_seq=1 ttl=64 time=0.078 ms
64 bytes from 192.168.0.3: icmp_seq=2 ttl=64 time=0.090 ms
C:\Users\wzj>docker exec -it tomcat1 ping tomcat2
PING tomcat2 (192.168.0.3) 56(84) bytes of data.
64 bytes from tomcat2.mynet (192.168.0.3): icmp_seq=1 ttl=64 time=0.153 ms
64 bytes from tomcat2.mynet (192.168.0.3): icmp_seq=2 ttl=64 time=0.054 ms
~~~
發現使用我們自定義的docker網絡不需要--link連通容器,就可以直接使用名字ping通
## 網絡連通
使用docker自帶的網絡啟動的容器ip是由docker0分配的,使用我們自定義網絡啟動的容器ip是由我們自定義的網絡分配的,由于網段不同,所以這樣啟動的兩個容器是沒法連通的。
~~~
C:\Users\wzj>docker run -d -P --name tomcat1 tomcat
c324a68f9db7bdd854f0fd0990af831f131694ab3b06fa7c9d75aadb47471e04
C:\Users\wzj>docker run -d -P --name tomcat_net_1 --net mynet tomcat
0a21a67740068c037345ec53c897917bb2a6d530f7df241f447e4f98f6cbd6e3
C:\Users\wzj>docker exec -it tomcat_net_1 ping tomcat1
ping: tomcat_net_1: No address associated with hostname
想要ping通的話需要做網絡連通
C:\Users\wzj>docker network connect mynet tomcat1
連通后發現:
C:\Users\wzj>docker network inspect mynet
[
{
"Name": "mynet",
"Id": "33de0d356ebb6b099b630c00902436205d3afa702ac8e0bcab993be616d7d8a9",
"Created": "2020-11-26T09:51:36.8522108Z",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "192.168.0.0/16",
"Gateway": "192.168.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {
"0a21a67740068c037345ec53c897917bb2a6d530f7df241f447e4f98f6cbd6e3": {
"Name": "tomcat_net_1",
"EndpointID": "f2856e77d60829df2ea5f59772ceea2c24693a22e6ab66791982e4d90eb818a6",
"MacAddress": "02:42:c0:a8:00:02",
"IPv4Address": "192.168.0.2/16",
"IPv6Address": ""
},
"c324a68f9db7bdd854f0fd0990af831f131694ab3b06fa7c9d75aadb47471e04": {
"Name": "tomcat1",
"EndpointID": "2a04733947fa9a922eaf749c7f7bc83ea2e4c696d4804329c0d8b40e084b2cb9",
"MacAddress": "02:42:c0:a8:00:03",
"IPv4Address": "192.168.0.3/16",
"IPv6Address": ""
}
},
"Options": {},
"Labels": {}
}
]
C:\Users\wzj>docker exec -it tomcat_net_1 ping tomcat1
PING tomcat1 (192.168.0.3) 56(84) bytes of data.
64 bytes from tomcat1.mynet (192.168.0.3): icmp_seq=1 ttl=64 time=0.081 ms
64 bytes from tomcat1.mynet (192.168.0.3): icmp_seq=2 ttl=64 time=0.209 ms
~~~
結論:想要跨網絡連通,需要使用docker network connect連通容器與網絡
- Python學習
- Python基礎
- Python初識
- 列表生成式,生成器,可迭代對象,迭代器詳解
- Python面向對象
- Python中的單例模式
- Python變量作用域、LEGB、閉包
- Python異常處理
- Python操作正則
- Python中的賦值與深淺拷貝
- Python自定義CLI三方庫
- Python并發編程
- Python之進程
- Python之線程
- Python之協程
- Python并發編程與IO模型
- Python網絡編程
- Python之socket網絡編程
- Django學習
- 反向解析
- Cookie和Session操作
- 文件上傳
- 緩存的配置和使用
- 信號
- FBV&&CBV&&中間件
- Django補充
- 用戶認證
- 分頁
- 自定義搜索組件
- Celery
- 搭建sentry平臺監控
- DRF學習
- drf概述
- Flask學習
- 項目拆分
- 三方模塊使用
- 爬蟲學習
- Http和Https區別
- 請求相關庫
- 解析相關庫
- 常見面試題
- 面試題
- 面試題解析
- 網絡原理
- 計算機網絡知識簡單介紹
- 詳解TCP三次握手、四次揮手及11種狀態
- 消息隊列和數據庫
- 消息隊列之RabbitMQ
- 數據庫之Redis
- 數據庫之初識MySQL
- 數據庫之MySQL進階
- 數據庫之MySQL補充
- 數據庫之Python操作MySQL
- Kafka常用命令
- Linux學習
- Linux基礎命令
- Git
- Git介紹
- Git基本配置及理論
- Git常用命令
- Docker
- Docker基本使用
- Docker常用命令
- Docker容器數據卷
- Dockerfile
- Docker網絡原理
- docker-compose
- Docker Swarm
- HTML
- CSS
- JS
- VUE