常用命令
写在最上面,方便使用
2020-12-09 11:37:23 再次总结
1 | # 查看有哪些网络 |
1、容器默认网络是 bridge,也就是说 docker run 若不知道 –net 参数,默认是 bridge
2、默认网络 bridge 下的容器,默认情况下,只可以 ping bridge 下容器的ip,但不可以ping 容器名称,容器id
》》》若想 ping 容器名称,容器id,可以在docker run 时指定 –link 参数,例如:docker run --name a2 --link a1 ...
,此时的a2就可以ping a1容器的ip,容器名,容器id了。但是a1不可以ping a2。
》》》因为a2容器的/etc/hosts
中有a1容器的信息,而a1容器的/etc/hosts
中没有a2容器的信息。
3、在自定义网络下的容器可以互相ping容器名称,容器id,容器ip(自定义网络的特点)
4、网络net01下的a1容器,默认不可用ping通net02下的a2容器,若想ping通,可以使用connect连接:docker network connect net02 a1
》》》意思就是把 a1 容器分配一个 net02 网段下的ip,此时 a1 容器就有了两个ip,两个网段的容器它都可以ping通。
》》》反之,a2容器不可用ping net01网络下的容器,若想打通,则同理可以使用docker network connect net01 a2
5、网络别名,例如:docker run --name a1 --network my_net --network-alias a1-alias ...
》》》只要在 my_net 网络下,都可以ping a1-alias,就相同于 ping a1容器
查看本地网卡
ip addr
可以看到
、lo:本地网卡
、eno16777736:Linux网卡
、docker0:docker自带的虚拟网卡
问题引入
启动容器docker run -it --name centos01 -d centos /bin/bash
启动之后,我们可以看到ip addr
多了一个网卡
进入容器docker exec -it centos01 bash
在容器内输入ip addr
可查看IP信息,可使用exit
退出容器,在容器外输入ip addr
也可查看IP信息
docker run -it --name centos02 -d centos /bin/bash
同理我们启动centos02,可以看到ip addr
又多了一个网卡
下面给出网络连接图
可以看到网卡都是成对的,evth-pair技术。
存在的问题?
只能ping通ip,不能ping通他们的容器名称。
因为在同一网段,所以可以ping同ip地址。如果想ping他们的容器,可使用–link或自定义网络
–link
启动centos03 测试docker run -it --name centos03 --link centos01 -d centos /bin/bash
分析原因:是因为把映射关系写入了hosts文件docker inspect --format='' centos03
测试,启动04 –link03时,容器04还是ping centos01吗?答:不行。–link谁,只能ping谁。
自定义网络
注意:客户端和守护程序API都必须至少为 1.21, 才能使用此命令。可使用docker version
检查
命令帮助
docker network --help
1 | Commands: |
网络列表
docker network ls
1 | DRIVER 驱动类型 |
创建网络
docker network create --driver bridge --subnet 172.27.0.0/16 --gateway 172.27.0.1 my_net
网络详情
docker network inspect my_net
删除网络
1 | # 删除单个 |
指定网络启动容器
1)、默认–net介绍
下面两种启动是相同的,容器启动默认是–net bridge,这里bridge是网络的名称
1 | docker run -it --name centos01 -d centos /bin/bash |
容器启动网络连接,下面两两作用相同
1 | --net 将一个容器连接到一个网络 |
2)、–net指定自定义网络的使用
1 | docker run -it --name centos01 --net my_net -d centos /bin/bash |
、容器互ping,这时容器名或ip地址都可以ping同,而且不用配置–link,这样以来,使用自定义网络就可以修复容器名互ping的问题。
连接网络
docker run -it –name centos01 –net my_net -d centos /bin/bash
docker run -it –name centos02 -d centos /bin/bash
此时容器centos01与centos02两个容器是ping不通的,不属于同一个网段。
表示把centos02连接到my_net网络,连通之后,centos01也就有了两个IP(172.17.0.2,172.27.0.3)docker network connect my_net centos02
注意:此时centos01还是ping不了172.17.0.2,但可以ping通容器名centos02 或 172.27.0.3
如果想打通172.17.0.2,则可以同理使用docker network connect bridge centos01
再次学习
2020-12-09 11:22:00
启动 01,默认加入 bridge 网络,分配ip 172.17.0.4
1 | ------------------------docker run --name centos01 -itd centos |
启动02,也默认加入 bridge 网络,分配ip 172.17.0.5
1 | ------------------------docker run --name centos02 -itd centos |
进入 01 容器,去ping 02 的ip 可以通,因为同一个网段。
》》》但不可以ping容器名称
1 | ------------------------docker exec -it centos01 bash |
创建网络,网络名称 my_net,网关 172.27.0.1,子网 172.27.0.0/16
》》》进入 01 容器 ping不通 03 的ip,因为不在同一个网段。
》》》使用 docker network connect my_net centos01 ,让 01 加入 my_net网段,并分配一个ip。此时01在bridge,my_net 网段都有 ip
》》》再进入 01,可以ping 03 的ip。因为在同一网段。
1 | ------------------------docker network create --driver bridge --subnet 172.27.0.0/16 --gateway 172.27.0.1 my_net |
–link,创建容器 04,默认加入 bridge 网络
》》》使用 –link centos02 –link centos03 报错:04与03 不在同一网段,所以不能 –link
》》》使用 –link centos01 –link centos02 可以,因为 04 与 01,02在同一网段
》》》进入 04 容器,可以ping 01,02 容器名称。但进 01,02容器就不可以ping 04容器名称
》》》是因为 04 在容器的/etc/hosts
中添加了ip 容器名称 容器id
因此,它可以ping。反之没有添加 –link 所以不可以ping
1 | ------------------------docker run --name centos04 -itd --link centos02 --link centos03 centos |
–net,启动 05容器,使用 –net 加入 my_net 自定义网络
》》》进入 05容器,可以ping 03 ip,因为在同一个网段。
》》》也可以ping 03 的容器名称,因为都在自定义网络下面,即使 /etc/hosts
中没有定义。
》》》因为这个是自定义网络的特点。而默认的bridge则只支持ip,而不支持容器
1 | ------------------------docker run --name centos05 -itd --net my_net centos |
–net-alias,网络别名,启动容器 06,使用 –net 指定网络,使用 –net-alias 指定一个网络别名
》》》进入 03 容器,可以ping 06容器名称,ip,容器id(因为在同一个自定义网络下),也可以ping 06 的网络别名(因为指定了网络别名)
1 | ------------------------ |