创建一个network文件夹,里面放 docker-compose.yml
文件
使用老师准备的好镜像net-box:latest
version: "3.8"
services:
box1:
image: xiaopeng163/net-box:latest
command: /bin/sh -c "while true;do sleep 3600;done"
box2:
image: xiaopeng163/net-box:latest
command: /bin/sh -c "while true;do sleep 3600;done"
PS F:\docker\network> docker-compose pull
Pulling box1 ... done
Pulling box2 ... done
PS F:\docker\network> docker-compose up -d
Creating network "network_default" with the default driver
Creating network_box1_1 ... done
Creating network_box2_1 ... done
PS F:\docker\network> docker network ls
NETWORK ID NAME DRIVER SCOPE
fd874a89c549 bridge bridge local
beb5c11f8216 host host local
9419c5cc9528 network_default bridge local
da113904c63c none null local
默认创建一个网络network_default
,network
前缀是文件夹的名字,default
默认名称
查看network_default
网络,两个容器box1,box2在这个网络上,ip地址是172.21.0.2/16,172.21.0.3/16
PS F:\docker\network> docker network inspect network_default
[
{
"Name": "network_default",
"Id": "9419c5cc95288ab0f055d34ddb850c4ccd5dda17b04ee0f9b87a96dad24b6b80",
"Created": "2022-01-21T16:12:13.0676126Z",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": null,
"Config": [
{
"Subnet": "172.21.0.0/16",
"Gateway": "172.21.0.1"
}
]
},
"Internal": false,
"Attachable": true,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {
"cc04559d14c2fcf984cf1ac44a592f0f7f97af48b326fd1a6bec8cf8dfb7421a": {
"Name": "network_box1_1", # 容器box1
"EndpointID": "3dec346ab8db601c3aede98ff0c9b6e052a2e6b6b6d0c8d822f35f75f3145706",
"MacAddress": "02:42:ac:15:00:02",
"IPv4Address": "172.21.0.2/16",
"IPv6Address": ""
},
"fdcf1fc7717ec0371e974bebf85f449e9cd6f087c00733a3c2591703310f71bd": {
"Name": "network_box2_1", # 容器box2
"EndpointID": "da84bdabbda3851a2db919b7e3bf9774643b1b2c0e9a6a197b3c26bef6e505cc",
"MacAddress": "02:42:ac:15:00:03",
"IPv4Address": "172.21.0.3/16",
"IPv6Address": ""
}
},
"Options": {},
"Labels": {
"com.docker.compose.network": "default",
"com.docker.compose.project": "network",
"com.docker.compose.version": "1.29.2"
}
}
]
两个容器相互连通
PS F:\docker\network> docker-compose ps
Name Command State Ports
---------------------------------------------------------------
network_box1_1 /bin/sh -c while true;do s ... Up
network_box2_1 /bin/sh -c while true;do s ... Up
PS F:\docker\network> docker container exec -it network_box1_1 sh
/omd # ping network_box2_1
PING network_box2_1 (172.21.0.3): 56 data bytes
64 bytes from 172.21.0.3: seq=0 ttl=64 time=0.107 ms
64 bytes from 172.21.0.3: seq=1 ttl=64 time=0.060 ms
64 bytes from 172.21.0.3: seq=2 ttl=64 time=0.062 ms
^C
--- network_box2_1 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0.060/0.076/0.107 ms
/omd # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
2: sit0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN qlen 1000
link/sit 0.0.0.0 brd 0.0.0.0
35: eth0@if36: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP
link/ether 02:42:ac:15:00:02 brd ff:ff:ff:ff:ff:ff
inet 172.21.0.2/16 brd 172.21.255.255 scope global eth0
valid_lft forever preferred_lft forever
/omd #
可以直接可以ping,docker-compose.yml
文件里面容器名称,box1,box2
/omd # ping box1
PING box1 (172.21.0.2): 56 data bytes
64 bytes from 172.21.0.2: seq=0 ttl=64 time=0.037 ms
64 bytes from 172.21.0.2: seq=1 ttl=64 time=0.046 ms
^C
--- box1 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.037/0.041/0.046 ms
/omd # ping box2
PING box2 (172.21.0.3): 56 data bytes
64 bytes from 172.21.0.3: seq=0 ttl=64 time=0.068 ms
64 bytes from 172.21.0.3: seq=1 ttl=64 time=0.062 ms
^C
--- box2 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.062/0.065/0.068 ms
/omd #
查看DNS
dig
命令
SERVER: 127.0.0.11#53(127.0.0.11)
内置的DNS Server
/omd # dig
; <<>> DiG 9.16.6 <<>>
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 29311
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
; COOKIE: 7a15f2f0489fc203 (echoed)
;; QUESTION SECTION:
;. IN NS
;; Query time: 3190 msec
;; SERVER: 127.0.0.11#53(127.0.0.11)
;; WHEN: Fri Jan 21 16:21:53 UTC 2022
;; MSG SIZE rcvd: 40
/omd # more /etc/resolv.conf
nameserver 127.0.0.11
options ndots:0
当时主机上是ping不同的,因为用的不是一个DNS
想要ping百度,容器的DSN是找不到百度的,需要进入本机的DNS找,一层层往上找DNS
/omd # ping www.baidu.com
PING www.baidu.com (110.242.68.4): 56 data bytes
64 bytes from 110.242.68.4: seq=0 ttl=37 time=9.406 ms
64 bytes from 110.242.68.4: seq=1 ttl=37 time=9.472 ms
^C
--- www.baidu.com ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max = 9.398/9.448/9.516 ms
/omd #
docker-compose.yml
文件:
version: "3.8"
services:
box1:
image: xiaopeng163/net-box:latest
command: /bin/sh -c "while true;do sleep 3600;done"
networks:
- mynetwork1
box2:
image: xiaopeng163/net-box:latest
command: /bin/sh -c "while true;do sleep 3600;done"
networks:
- mynetwork1
- mynetwork2
networks:
mynetwork1:
mynerwork2:
输出:
PS F:\docker\network> docker-compose up -d
Creating network "network_mynetwork1" with the default driver
Creating network "network_mynetwork2" with the default driver
Recreating network_box1_1 ... done
Recreating network_box2_1 ... done
PS F:\docker\network>
自动创建两个网络network_mynetwork1
与network_mynetwork2
默认的dirver
PS F:\docker\network> docker network ls
NETWORK ID NAME DRIVER SCOPE
fd874a89c549 bridge bridge local
beb5c11f8216 host host local
8951aab48be4 network_mynetwork1 bridge local
b7b92098628a network_mynetwork2 bridge local
da113904c63c none null local
PS F:\docker\network>
network_mynetwork1
有两个容器连在上面
PS F:\docker\network> docker network inspect network_mynetwork1
[
{
"Name": "network_mynetwork1",
"Id": "8951aab48be4a39984ed097dcf0781872a5d37f00f09c785075531acfc0d351f",
"Created": "2022-01-21T16:28:45.3669689Z",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": null,
"Config": [
{
"Subnet": "172.22.0.0/16",
"Gateway": "172.22.0.1"
}
]
},
"Internal": false,
"Attachable": true,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {
"0fa98dd0fdaca47a9fc9c7193c524afc32466fb164794115295b08d1f6f4b5d8": {
"Name": "network_box2_1",
"EndpointID": "f4724a4b0e539d98b1bc9be5be8c57cd120a646cffcb6a716da9a9c6ba800190",
"MacAddress": "02:42:ac:16:00:02",
"IPv4Address": "172.22.0.2/16",
"IPv6Address": ""
},
"51521d22e5e80066fb637ff2b73fbf17ba784aea079d36aa11c2fe1a41939a14": {
"Name": "network_box1_1",
"EndpointID": "e9bf65e2c5c132ddc2a80d892994305a05ac789314059ddd8eec044bd56856e5",
"MacAddress": "02:42:ac:16:00:03",
"IPv4Address": "172.22.0.3/16",
"IPv6Address": ""
}
},
"Options": {},
"Labels": {
"com.docker.compose.network": "mynetwork1",
"com.docker.compose.project": "network",
"com.docker.compose.version": "1.29.2"
}
}
]
network_mynetwork2
有一个容器连在上面
PS F:\docker\network> docker network inspect network_mynetwork2
[
{
"Name": "network_mynetwork2",
"Id": "b7b92098628afd412652513c2b2e1f42565ed62924b3842ccf1a0fe23b3e7ff0",
"Created": "2022-01-21T16:28:45.4016942Z",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": null,
"Config": [
{
"Subnet": "172.23.0.0/16",
"Gateway": "172.23.0.1"
}
]
},
"Internal": false,
"Attachable": true,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {
"0fa98dd0fdaca47a9fc9c7193c524afc32466fb164794115295b08d1f6f4b5d8": {
"Name": "network_box2_1",
"EndpointID": "fea91083d027f3765817251d0a9e2b15ee846edb579ec2044682ed9c40ad5da1",
"MacAddress": "02:42:ac:17:00:02",
"IPv4Address": "172.23.0.2/16",
"IPv6Address": ""
}
},
"Options": {},
"Labels": {
"com.docker.compose.network": "mynetwork2",
"com.docker.compose.project": "network",
"com.docker.compose.version": "1.29.2"
}
}
]
PS F:\docker\network>
进入容器ip a
命令可以看到box2的网络连接了两个eth,box1连接一个eth
/omd # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
2: sit0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN qlen 1000
link/sit 0.0.0.0 brd 0.0.0.0
41: eth1@if42: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP
link/ether 02:42:ac:17:00:02 brd ff:ff:ff:ff:ff:ff
inet 172.23.0.2/16 brd 172.23.255.255 scope global eth1
valid_lft forever preferred_lft forever
43: eth0@if44: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP
link/ether 02:42:ac:16:00:02 brd ff:ff:ff:ff:ff:ff
inet 172.22.0.2/16 brd 172.22.255.255 scope global eth0
valid_lft forever preferred_lft forever
/omd #
version: "3.8"
services:
box1:
image: xiaopeng163/net-box:latest
command: /bin/sh -c "while true;do sleep 3600;done"
networks:
- mynetwork1
box2:
image: xiaopeng163/net-box:latest
command: /bin/sh -c "while true;do sleep 3600;done"
networks:
- mynetwork1
- mynetwork2
networks:
mynetwork1:
ipam:
driver: default
mynetwork2:
ipam:
driver: default
官方文档network-configuration-reference参数:https://docs.docker.com/compose/compose-file/compose-file-v3/#network-configuration-reference
指定自定义 IPAM 配置。这是一个具有多个属性的对象,每个属性都是可选的:
driver
:自定义 IPAM 驱动程序,而不是默认的。
config
:具有零个或多个配置块的列表,每个配置块包含以下任何键:
subnet
: CIDR 格式的子网,代表一个网段
一个完整的例子:
ipam:
driver: default
config:
- subnet: 172.28.0.0/16