前言
前端时间, 使用docker过程中, 又接触到需要docker network的相关知识. 之前的了解都是, 可以满足日常的使用即可, 本次, 借着机会仔细的了解了一下. 当然, 对于网络知识的更加深入的理解可能没有精通网络的大佬玩的转.
docker的网络类型 及相应构造
据悉. docker 1.7和docker1.8 共有4种默认的网络类型, 其分别为: None / Host / Bridge (默认)/ Container . ?
docker默认是会创建如下几种的网络的. Host / None / Bridge ?
--net=none 不创建相关网络. 即只能容器内自己执行. 容器不进行网络虚拟化, 容器和外部无法进行通信.
--net=host 主机模式. 容器和主机使用同一套网络. 比如容器内使用8080 端口的一个进程, 那么宿主机也无法使用这个端口. 反之, 同理.
--net=bridge 每个容器都进行网络虚拟化. 并且通过端口映射和主机进行通信.
--net=container:Name_or_Id 某个容器启动时, 可以不进行自身网络的虚拟化. 而使用其他容器的网络.
bridge模式
?如一般Docker会使用172.17.0.0/16这个网段,并将172.17.0.1/16分配给docker0网桥(在主机上使用ifconfig命令是可以看到docker0的,可以认为它是网桥的管理接口,在宿主机上作为一块虚拟网卡使用)。单机环境下的网络拓扑如下,主机地址为10.10.0.186/24。
?
常用的docker network命令
docker network create --driver=bridge --subnet=192.168.88.0/24 demo
# driver 网络模式
# subnet 网段 默认网段为172.17.0.0/16
# demo 名称
#运行redis容器
docker run -itd --name redis --network mynet --network-alias redis -p 6379:6379 redis
#运行nginx容器
docker run -d --name nginx -p 80:80 --network mynet --network-alias nginx --privileged=true -v /home/wwwroot:/home/wwwroot -v /home/wwwlogs:/home/wwwlogs nginx
?
- 查询container的网络
docker inspect <containerName_or_Id>
# 运行容器;
$ docker run --name=nginx_bridge --net=bridge -p 80:80 -d nginx
9582dbec7981085ab1f159edcc4bf35e2ee8d5a03984d214bce32a30eab4921a
# 查看容器;
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9582dbec7981 nginx "nginx -g 'daemon ..." 3 seconds ago Up 2 seconds 0.0.0.0:80->80/tcp nginx_bridge
# 查看容器网络;
$ docker inspect 9582dbec7981
"Networks": {
"bridge": {
"IPAMConfig": null,
"Links": null,
"Aliases": null,
"NetworkID": "9e017f5d4724039f24acc8aec634c8d2af3a9024f67585fce0a0d2b3cb470059",
"EndpointID": "81b94c1b57de26f9c6690942cd78689041d6c27a564e079d7b1f603ecc104b3b",
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:11:00:02"
}
}
$ docker network inspect bridge
[
{
"Name": "bridge",
"Id": "9e017f5d4724039f24acc8aec634c8d2af3a9024f67585fce0a0d2b3cb470059",
"Created": "2017-08-09T23:20:28.061678042-04:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": null,
"Config": [
{
"Subnet": "172.17.0.0/16"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"Containers": {
"9582dbec7981085ab1f159edcc4bf35e2ee8d5a03984d214bce32a30eab4921a": {
"Name": "nginx_bridge",
"EndpointID": "81b94c1b57de26f9c6690942cd78689041d6c27a564e079d7b1f603ecc104b3b",
"MacAddress": "02:42:ac:11:00:02",
"IPv4Address": "172.17.0.2/16",
"IPv6Address": ""
}
},
"Options": {
"com.docker.network.bridge.default_bridge": "true",
"com.docker.network.bridge.enable_icc": "true",
"com.docker.network.bridge.enable_ip_masquerade": "true",
"com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
"com.docker.network.bridge.name": "docker0",
"com.docker.network.driver.mtu": "1500"
},
"Labels": {}
}
]
#1. 运行nginx和docker容器
docker run -itd --name redis -p 6379:6379 redis
docker run -d --name nginx -p 80:80 --privileged=true -v /home/wwwroot:/home/wwwroot -v /home/wwwlogs:/home/wwwlogs nginx
# 2. 链接网络
#加入nginx到mynet网络
[root@localhost /]# docker network connect mynet nginx
#加入redis到mynet网络
[root@localhost /]# docker network connect mynet redis
#查看mynet网络包含的容器,会发现两个容器都加入当前网络了,后面使用ping命令是能够ping通容器名称的。
[root@localhost /]# docker network inspect mynet
# 3. 取消链接网络
#将nginx移除mynet局域网络
docker network disconnect mynet nginx
Reference
[1]. Docker:网络模式详解
[2]. docker network详解、教程
[3]. Docker network整理
官方命令参考
Parent command
Command | Description |
---|
docker | The base command for the Docker CLI. |
Child commands
Reference
[1]. (official)docker network
|